Redis基础知识(学习笔记4--高并发问题)
1.搞懂 Redis 缓存穿透、击穿、雪崩!
--https://cloud.tencent.com/developer/article/1775405
缓存雪崩---热点 key 在某一个时刻同时失效(批量插入、批量更新容易导致);
缓存穿透 --Redis 和数据库中都没有我们想要的数据(存储层都穿透了);
缓存击穿--Redis中没有对应的苏剧,数据库中有,大量的请求则直接打到物理DB上。
2. 突发性热点缓存重建导致系统压力暴增。(例如,直播时,123上链接。。。)
大量请求同时请求某一条数据。
(1)同步锁syschronized
一种优化方案就是添加同步锁syschronized,即所谓的双重检测锁(DCL),来解决突发热点并发重建【重建:重复创建】导致DB压力暴增。
让第一个请求先查Redis缓存,若不存在查DB;查到写入Redis缓存。
后续的请求再访问Redis时,直接Redis取值。
synchronized(this){ //redis 缓存中取数据 //redis 缓存中不存在该条数据,请求DB,存到redis中 }
注意:
(1)注意锁对象的粒度,越小越好;否则,性能低下。
(2)syschronized()是进程级别,那么应用多节点部署的时候,就可能在redis中重建不止一次,但是小概率事件.
(2)SETNX 分布式锁
另外一种方案,就是考虑使用SETNX 分布式锁。
这种方案比较常用。
3 缓存数据库双写不一致
常用的优化方案--读写锁
所有的读操作并行执行,读和写互斥串行执行。
更多的介绍可以参阅《Redis 应用实践:读写锁进行性能优化》
https://zhuanlan.zhihu.com/p/700056780
4.缓存雪崩
雪崩的优化思路--多级缓存
-
数据访问速度更快:多级缓存将数据存储在不同的缓存层中,用户可以优先访问较快的缓存层,大大提高了数据的访问速度。
-
提升系统的稳定性:当一个缓存层出现问题时,其他缓存层可以继续为系统提供服务,提升了系统的容错性和稳定性。
-
减少数据库压力:多级缓存可以有效地减少数据库的访问频率,降低数据库的负担,提高系统的可扩展性。
-
提供灵活的缓存策略:多级缓存可以根据业务需求定制不同的缓存策略,如热点数据可以存储在更快速的缓存层,冷数据可以存储在较慢的缓存层。
例如,先去访问程序进程的缓存,如果缓存中有,就不需要去访问Redis,性能比Redis还好。
使用时,要小心(1)内存的管理和控制,防止内存溢出;(2)如果是多节点部署,要考虑节点间数据的一致性(变化更新需要做到联动--解决方案例如借助MQ等);