学习目标:
- 了解redis缓存问题
- redis缓存穿透
- redis缓存击穿
- reds缓存雪崩
学习内容:
-
redis缓存击穿的原因
redis缓存中的某一热点数据在某一时间失效
同一时刻接收到大量并发请求
此时redis缓存中的热点数据失效
大量并发请求直接打击到数据库上
导致数据库被打垮; -
如何解决redis缓存击穿问题
延长热点数据过期时间;
synchronized 加锁;
ReentrantLock.tryLock()加锁;
redis 的命令 setnx() 加锁; -
redis缓存穿透的原因
数据库中没有数据
此时接收到大量的并发请求
此时redis中一定没有数据(因为数据库中没有,没法缓存)
大量并发请求直接打到数据库上
导致数据库被打垮; -
如何解决redis缓存穿透问题
把请求的key存入redis中
设置对应的value值不存在;
开辟一片Set专门存储key
省略掉了value的空间
用bitmap来存(1字节存储8个key)
1MB的空间就可以存储800W个key
100MB的空间就是8亿个key;
怎么将key与bit对应?
哈希映射
将key通过哈希函数转换成数组下标,将键值对存储到HashMap中
优化:(可以只存key而不存value)HashSet
延伸到布隆算法
以下
(引用自博主 小龙JWY)
首先,因为在单次哈希的情况下,会产生一定的碰撞;
因此,为了降低碰撞而导致的概率,于是,采用多次哈希的方式,每一次哈希都往一个槽位写上 1;
当来查询一个不存在的 key 的时候,就可以进行同样的多次哈希,第一次可能碰巧撞对,得到 1,但是后面还有两次,这样,就不一定有那么好的运气,还能够撞对。
因此,这样,可以降低缓存穿透的概率。
-
redis缓存雪崩的原因
缓存击穿:
redis的一个key失效,大量并发请求(失效key)打入数据库中使数据库崩溃;
缓存雪崩:
redis的多个key失效,大量并发请求(多个失效key)打入数据库中使数据库崩溃; -
如何解决redis缓存雪崩问题
分散 key 的过期时间(削峰);
布隆过滤器;
学习笔记:
缓存击穿的原因是redis中的key在失效的时段中
接收到了大量的并发请求
这些请求直接打到数据库中导致数据库崩溃;
在理想情况下,我们会给热点数据设置永不过期,这样key就不会失效,就能解决缓存击穿问题
但是在实际开发中,由于热点数据的不可预估性和即时生成性,我们无法预知并缓存所有热点数据,而大部分企业接触不到这样的高并发(一个key在短时间内被百万次以上请求)
因此设置热点数据永不过期是不能一劳永逸的额解决缓存击穿问题的;
解决的方案还有
加锁
synchronized加锁不可撤销,会使得所有读redis缓存加锁,这样崩掉的就不仅仅是这一个key了(一个key就有百万次并发的大型项目) 项目在启动的瞬间就会崩溃;
ReentrantLock.tryLock()加锁
redis 的命令 setnx()上锁
多线程方案,一个线程拿到锁执行业务,一个线程监管锁刷新锁时间
存在单节点redis宕机问题
用集群,redis主从复制, 削弱强一致性, 保证高可用性和最终一致性即可
心得
如果有一个方案能解决80%的问题
一个方案能解决70%的问题
我们在一般情况下会选择这个解决80%的问题的方案;
但是如果这个解决80%问题的方案漏掉了一个最关键的问题
导致整个系统崩溃
造成的损失远超解决70%问题的方案
那我们就会选择这个解决70%问题的方案;
参考博客:
https://blog.csdn.net/weixin_44051223/article/details/105590857
※强烈推荐※