redis云课堂学习笔记

1、使用redis会出现数据不一致。
如:
1)线程A和线程B同时修改数据库同一数据的同一字段。线程A先修改数据库将数据修改成a(操作1),然后再修改缓存成a(操作2);线程B先修改数据库将数据修改成b(操作3),然后再修改缓存成b(操作4)。
上面的执行流程是美好的,实际上会不一样,比如:操作1->操作3->操作4->操作2。这样就会出现数据库保存为b,缓存中数据为a。
2)查询和修改的操作,也会出现数据不一致。比如,先查询发现没有缓存,然后查询到数据后修改了缓存。但是在查询到数据和修改缓存之中,有其他线程修改了数据库并且修改了缓存。
结论:使用redis就要容忍数据不一致。可以使用有效期来保证最终一致性。
2、缓存雪崩。
缓存雪崩的原因是同一时刻,缓存同时到期,然后大量请求同时请求数据库,导致出现压力过大,甚至殆机。
解决办法:(下面几个是拷贝来的,个人觉得常用设置不同的缓存时间)
1)在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待。
2)做二级缓存,A1 为原始缓存,A2 为拷贝缓存,A1 失效时,可以访问 A2,A1 缓存失效时间设置为短期,A2 设置为长期。
3)不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
4)尽量保证整个 redis 集群的高可用性,发现机器宕机尽快补上。选择合适的内存淘汰策略。
5)利用 redis 持久化机制保存的数据尽快恢复缓存
6)热点数据直接进行持久化,不设失效时间,更新时刷新
3、大厂的解决方案
缓存预热:在活动之前,把需要的数据(这个看业务)进行预热。修改数据库时候,进行刷新缓存,当然为了数据的最终一致性,并不是由修改的代码进行刷新,而是使用监听方式,如canal。
canal监听mysql的日志,在进行修改或者写操作的时候,进行刷新缓存操作。
4、读多写少用缓存。
5、缓存的持久化方式:
RDB:快照持久化,设置定时任务,定期把内存中的数据持久化。
AOF:性能更好,执行命令后,把命令写入文件。
6、缓存穿透和击穿的区别
缓存穿透:
查询的结果为空,所以每次都缓存查询不到,所以每次都查询数据库。
解决方式:1)缓存一个特殊值;2)布隆过滤器
缓存击穿:
高热点,在某一瞬间,缓存过期,大量请求同时请求数据库,导致数据库压力过大。
处理方式和缓存雪崩一致

发布了148 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_33321609/article/details/104546419
今日推荐