Redis-击穿、穿透、雪崩

by shihang.mai

1. redis缓存雪崩

数据库和缓存本来就有的key,大量的key同一时间消失,大量请求打到数据库造成的问题


雪崩.png

1.1 项目

我们会将设备的数据晚上0点执行定时任务刷新到redis,并设置key的失效时间=30小时,不知道什么原因,当时只更新了一部分数据,直接导致30h时导致大量的key失效,所有获取设备信息的请求打到库上。导致其他业务好慢

1.2 解决方法

  1. 将失效时间随机

2. redis缓存击穿

数据库和缓存本来就有的某个key,这个key缓存突然失效,大量相同的这个key的请求数据库,造成的问题

击穿.png

2.1 项目

某一个设备当天特别多告警,云公司大量运维人员同一时间请求这个key,导致全部请求打到库中,导致其他业务好慢.虽然我们并发量不大,但是查询出来的信息,需要关联多个表。

2.2 解决方法

  1. 请求这个key时,发现缓存是没这个key的,那么利用分布式锁,让一个线程去请求该key数据,并写到redis。
  2. 其他线程等待,等锁释放后,直接取缓存中的数据

当然redis作分布式锁有很多问题:

  • 无法精确估计TTL时间
  • 单点redis的话还有设置时redis挂的问题
  • 就算是哨兵,当我setnx key的时候,还没同步给salve,master已经down掉,主从切换,又会导致key并没存在在redis中
  • 用红锁,java STW时,又会导致锁失效
  • 我还是建议分布式锁用zk,zk临时节点就是一个session并有也支持序列节点,又有watch机制、zab协议快速恢复集群状态。用它不香吗

3. redis缓存穿透

数据库和缓存本来就没有的key,大量这类请求访问到数据库,造成的问题

穿透.png

3.1. 项目

当时阿里投诉给云公司,承载它们虚拟机的主机down了,怎么没人立刻维修,因为这个投诉算是云公司的重大投诉,大量的运维人员都去查这个设备,然后其他运维人员发现系统好慢。后面查找原因,发现这个设备根本没在系统纳管,redis缓存中和库根本没,而这个设备信息需要关联大量表。

3.2 解决

  1. 请求这个key时,发现缓存是没这个key的,那么利用分布式锁,让一个线程去请求该key数据,并写到redis。
  2. 即使数据库查询到的数据为null时候也将key写缓存。但是把缓存的过期时间设置短一点,比如1分钟,过期了再走一遍数据库查询数据是否存在
  3. 其他线程等待,等锁释放后,直接取缓存中的数据
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容

  • 1 数据读 缓存穿透一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找。如...
    MiniSoulBigBang阅读 609评论 0 2
  • redis缓存介绍以及常见问题浅析 没缓存的日子 对于web来说,是用户量和访问量支持项目技术的更迭和前进。随着服...
    程序员will阅读 265评论 0 2
  • Redis用作缓存,主要两个用途:高性能,高并发,因为内存天然支持高并发 一.缓存穿透: 缓存穿透是指查询一个一定...
    Y了个J阅读 935评论 0 0
  • 1.Redis支持的数据类型?字符串、hash、list、set、zset2.什么是Redis持久化?Redis有...
    Solace_0e71阅读 160评论 0 0
  • 本文主要内容转自:分布式之redis复习精讲 1、为什么使用redis 使用Redis主要是出于两个原因:性能和并...
    萌妈码码阅读 480评论 0 0