Redis缓存异常:穿透、雪崩、击穿
Redis缓存异常
一、缓存雪崩
缓存雪崩是指缓存的 key 在同一时间大面积的失效,所以后面的请求都会落到数据库上面,造成数据库在短时间内承受大量请求而宕机。
解决方案:
-
缓存数据的过期时间设置随机,防止同一时间大量数据同时过期现象发生。
-
一般并发量不是特别多的时候,使用最多的解决方案是加锁排队。
-
给每一个缓存数据增加响应的缓存标记,记录缓存是否失效,如果缓存标记失效则更新数据缓存。
二、缓存穿透
缓存穿透是指用户请求缓存和数据库中都没有的数据,导致请求落在数据库上,造成数据短时间内承受大量请求而宕机。
解决方案:
- 可以在缓存中增加一个 key-null 值,用户请求时直接返回一个null值。缓存的有效时间可以设置短一点,设置太长可能导致正常情况也无法使用。
- 可以采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。
三、缓存击穿
缓存击穿是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞,数据库瞬间压力过大宕机。
解决方案:
-
如果这个 key 被经常访问说明这是个热点 key ,可以设置这个热点 key 永不过期。
-
加互斥锁,使用 mutex 。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作,比如 Redis 的 SETNX 去set一个mutex key,当操作返回成功时,再进行 load db 的操作并回设缓存;
也就是对缓存查询加锁,如果KEY不存在,就加锁,然后查数据库入缓存,然后解锁;其他进程如果发现有锁就等待,然后等解锁后返回数据。
四、缓存预热
缓存预热是指系统上限之后,将相关的缓存数据直接加载到缓存当中,这样可以避免在用户请求的时候直接查询数据库,这样用户直接请求到已被加载到缓存中数据。
解决方案:
- 直接写个缓存刷新页面,上线前手工操作。
- 相关的数据量不大的时候,可以在项目启动时自动加载。
- 定时刷新缓存。
五、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
使用keys指令可以扫出指定模式的key列表。
但因为是单线程的,如果这个redis正在给线上的业务提供服务,那使用keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。
这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律