缓存穿透与缓存雪崩 · codecodeabc/JavaCore@6d9344a · GitHub
Skip to content

Commit 6d9344a

Browse files
author
代码风水师
committed
缓存穿透与缓存雪崩
1 parent c9f5b18 commit 6d9344a

5 files changed

Lines changed: 164 additions & 9 deletions

File tree

README.md

Lines changed: 5 additions & 7 deletions
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<h3 style="padding-bottom:6px; padding-left:20px; color:#ffffff; background-color:#E74C3C;">缓存击穿(缓存穿透)</h3>
2+
3+
![缓存穿透](https://i.loli.net/2019/02/19/5c6b968d1e946.png)
4+
5+
**缓存(Cache)** 是分布式、高并发的场景下,为了保护后端数据库,降低数据库的压力,引入的一种基于内存的数据访问机制,能加快数据的读取与写入,进而提高系统负载能力。
6+
7+
**缓存击穿(缓存穿透)** 是访问不存在缓存中的数据,进而直接访问数据库。
8+
9+
10+
11+
**缓存击穿****缓存穿透** 更为详细的分类:
12+
13+
| 名称 | 缓存是否存在被访问数据 | 数据库是否存在被访问数据 |
14+
| -------- | ---------------------- | ------------------------ |
15+
| 缓存击穿 |||
16+
| |||
17+
18+
在缓存穿透这种情形下,如果缓存和数据库都没有需要被访问的数据,那么访问缓存时没有数据则直接返回空,避免重复访问数据库,造成不必要的后端数据库压力。
19+
20+
21+
22+
总之,避免缓存击穿也好,避免缓存穿透也罢,核心思路是想法设法不要让请求怼在数据库上。
23+
24+
25+
26+
##### 解决方案
27+
28+
**1.缓存空值:** 如果第一次访问一个不存在的数据,那么将此key与value为空值的数据缓存起来,下次再有对应的key访问时,缓存直接返回空值,通常要设置key的过期时间,再次访问时更新过期时间;
29+
30+
**2.布隆过滤:** 类似散列集合(hash set),判断key是否在这个集合中。实现机制在于比特位,一个key对应一个比特位,并且存储一个标识,如果key有对应的比特位,并且标识位表示存在,则表示有对应的数据。比如使用Redis 的 Bitmap实现。
31+
32+
33+
34+
---
35+
36+
<h3 style="padding-bottom:6px; padding-left:20px; color:#ffffff; background-color:#E74C3C;">缓存雪崩</h3>
37+
38+
**缓存雪崩:** 大量的缓存击穿意味着大量的请求怼在数据库上,轻者造成数据库响应巨慢,严重者造成数据库宕机。比如缓存内的数据集体定时刷新、服务器重启等。
39+
40+
41+
42+
##### 解决方案
43+
44+
1. 降低缓存刷新频率;
45+
2. 部分缓存刷新,刷新数据时按照一定规则分组刷新;
46+
3. 设置key永远不过期,如果需要刷新数据,则定时刷新;
47+
4. 分片缓存,在分布式缓存下,将需要缓存的数据 散列 分布到多个节点,尽量将热点数据均匀分布到多节点。
48+
49+
50+
51+
52+
53+
54+
55+
56+

resource/markdown/cache/HotData.md

Lines changed: 0 additions & 2 deletions
This file was deleted.

resource/markdown/cache/HotKey.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<h3 style="padding-bottom:6px; padding-left:20px; color:#ffffff; background-color:#E74C3C;">Redis热点Key</h3>
2+
3+
在一定时间内,被频繁访问的key称为 **热点key** 。比如突发性新闻,微博上常见的热搜新闻,引起千千万万人短时间内浏览;在线商城大促活动,消费者比较关注的商品突然降价,引起成千上万消费者点击、购买。热点key所在服务器的压力骤然上升,如果超出物理机器的承载能力,则缓存不可用,进而诱发缓存击穿、缓存雪崩的问题。
4+
5+
![缓存击穿](https://i.loli.net/2019/02/19/5c6b968d1e946.png)
6+
7+
8+
9+
#### 解决方案
10+
11+
**1. 读写分离:** 读写分离比较适用于写少读多的情景,
Lines changed: 92 additions & 0 deletions

0 commit comments

Comments
 (0)