Redis学习(四):缓存常见问题

2021/8/27 19:07:28

本文主要是介绍Redis学习(四):缓存常见问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

缓存常见问题

缓存击穿

概念:对于一些设置了过期的key,如果这个key可能会在某些时间点被超高并发地访问,是一个热点数据

原因:缓存在某个时间点过期的时候,恰好在这个时间点对这个key有大量的并发请求过来,该key没有命中,大量请求穿透到数据库服务器。

解决方案:

  1)使用互斥锁;在缓存失效的时候(判断拿出来的值为空),不是立即去Load Db,而是先使用setNx,去set一个Mutex key,当返回成功时,再进行Load Db的操作并回设缓存;

  2)永远不过期;把过期时间存在key对应的value里,如果发现要过期了,通过一个后台的异步线程进行缓存的构建

 

缓存雪崩

这个和缓存击穿类似,区别是这里针对的场景是多个key,前者是某一key缓存。

概念:大量的key设置了相同的过期时间,导致缓存在同一时刻全部失效,最终造成瞬时DB请求量大、压力骤增,引起雪崩。

原因:大量缓存在同一时间失效;大量请求落到后端DB上;

解决方案:

  1)控制缓存并发、击穿现象发生

  2)设置不同的过期时间,让缓存失效时间点尽量均匀

  3)做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2缓存设置为长期(高可用缓存集群)

 

缓存穿透

概念:访问一个一定不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂断

原因:key被高并发访问;该key没有命中,去DB获取,所以会有大量请求穿透到数据库服务器

解决方案:

  1)布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤,避免对底层数据存储系统造成压力

  2)将未查询到的key的空值也写进缓存,但是可以设置一个较短的过期时间,最长不超过5分钟

注意点:

  开发是否有将刚查询出来的数据放入缓存,尤其是对null的处理

 

缓存一致性

概念:当数据时效性要求很高时,需要保证缓存中的数据与数据库中的保持一致,需要保证缓存节点和副本中的数据也保持一致,不能出现差异现象。

原因:对同一个数据进行读写,在数据库层面并发的读写并不能保证顺序;可看上一篇博客关于《双写》问题描述

解决方案:请查阅《双写一致性》博文

 



这篇关于Redis学习(四):缓存常见问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程