Update 缓存.md

补充布隆过滤器的原理说明和示意图,以及 LRU 中 HashMap 与双向链表的结构图。
This commit is contained in:
CyC2018
2026-10-25 19:34:21 +08:00
parent b3e943b5e6
commit 9994d82cb4
5 changed files with 191 additions and 0 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

+6
View File
@@ -97,6 +97,10 @@ CDN 主要有以下优点:
- 对这些不存在的数据缓存一个空数据,并设置较短的过期时间;
- 使用布隆过滤器保存所有存在的 Key,对不存在的 Key 的请求直接拒绝。
布隆过滤器用多个哈希函数把 Key 映射到位数组的多个位置并置为 1。查询时只要有一个位置为 0,Key 就一定不存在;全部为 1 时 Key 可能存在,存在一定的误判率。
<div align="center"> <img src="pics/bloom-filter.png" width="560px"/> </div><br>
### 缓存击穿
指的是某个热点数据的缓存过期时,大量对它的请求同时到达数据库。
@@ -200,6 +204,8 @@ Redis Cluster 使用的不是一致性哈希,而是把 Key 映射到固定的
- 访问某个节点时,将其从原来的位置删除,并重新插入到链表头部。这样就能保证链表尾部存储的就是最近最久未使用的节点,当节点数量大于缓存最大空间时就淘汰链表尾部的节点。
- 为了使删除操作时间复杂度为 O(1),就不能采用遍历的方式找到某个节点。HashMap 存储着 Key 到节点的映射,通过 Key 就能以 O(1) 的时间得到节点,然后再以 O(1) 的时间将其从双向队列中删除。
<div align="center"> <img src="pics/lru.png" width="560px"/> </div><br>
Java 的 LinkedHashMap 内部就是这种结构,把 accessOrder 设为 true 并重写 removeEldestEntry 方法,就可以直接得到一个 LRU 缓存。
```java