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