Redis 缓存设计问题
缓存穿透
指的是对某个一定不存在的数据进行请求,该请求将会穿透缓存到达数据库。
解决方案:
- 对这些不存在的数据缓存一个空数据,缓存时间设置较短;
- 对这类请求进行过滤。
缓存击穿
指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力
解决方案:
- 设置热点数据永远不过期(例如数据命中一次增加1s缓存失效时间)。
- 设置缓存数据时,添加互斥锁,这样可以避免同时请求数据库。
缓存雪崩
指当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,导致大批量请求直接到达数据源(DB),带来很大压力。
解决方案:
- 缓存层集群部署,redis可采用官方集群部署,这样一台缓存服务挂了另外的服务还可以继续响应。
- 缓存失效时间分散开,比如我们可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。
- 设置热点数据永远不过期。
- 缓存预热,系统启动自动对一些热点数据进行初始化,避免在系统刚启动不久由于还未将大量数据进行缓存而导致缓存雪崩。
缓存一致性
缓存一致性要求数据更新的同时缓存数据也能够实时更新。
解决方案:
- 延迟双删策略,更新数据前删除一次缓存,数据更新之后(最好延迟几百毫秒,具体技术人员根据实际情况决定)再删除一次缓存