Redis学习笔记----缓存穿透,缓存雪崩和热点key

1.缓存穿透

1.1 概念:
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据时则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
1.2 解决方法:
持久层查询不到缓存空结果(即我们第一次查询不到,就缓存为空),查询时先判断缓存是否exissts(key),如果有直接返回空,没有则查询后返回。不过需要注意的是插入时需要清除查询的key,否则即使DB中即使有值也查询不到(当然也可以设置空缓存过期的时间)

2.缓存雪崩

2.1 概念
如果缓存集中在一段时间内失效,发生大量缓存穿透,所有的查询都落在数据库上,造成缓存雪崩。
2.2 解决方法
这个没有完美的解决办法,但是可以分析用户行为,尽量让失效时间点均匀分布。大多数系统设计者考虑用加锁或者队列的方式保证缓存的单线程(进程)写,从而避免失效时大量的并发请求落到底层存储系统上。即如下方法:
[1] 用锁/分布式锁或者队列串行访问
加锁排队 限流—限流算法的实现:
1] 计数
2] 滑动窗口
3] 令牌桶 Token Bucket
4] 漏桶 leaky bucket [1]
队列串行访问的实现:
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key 只允许一个线程查询数据和写缓存,其他线程等待。
[2] 缓存失效时间均匀分布

3.热点key

3.1 概念:
某个key访问非常频繁,当key失效的时候有大量线程来构建缓存,导致负载增加,系统奔溃。
3.2 解决办法:
[1] 使用锁,单机用synchronized,lock等,分布式用分布式锁
[2]缓存过期时间不设置在key上,而是设置在key对应的value里。如果检测到缓存的时间超过过期时间则异步更新缓存。
[3] 在value设置一个比过期时间t0 小的过期时间值t1,当t1过期的时候,延长t1并做更新缓存操作
[4]设置标签缓存,标签缓存设置过期时间,标签缓存过期后,需异步地更新实际缓存

发布了54 篇原创文章 · 获赞 2 · 访问量 3985

猜你喜欢

转载自blog.csdn.net/TheWindOfSon/article/details/104525397