Redis 缓存问题及解决

所有问题解决的关键就是尽少的访问数据库,或者避免太集中的访问。

一,缓存穿透 (key在数据库不存在)


  • 当数据既不在缓存中,也不在数据库中,导致请求访问缓存没数据,访问数据库也没数据,即 每次都一穿到底。
  • 当有大量这样的请求到来时,数据库的压力骤增。

解决:

  1. 对请求过滤:参数检查、黑名单、白名单等,直接拒绝。
  2. 缓存空值:对查询不存在的数据也缓存下来(值为null),并设置较短过期时间。
  3. 使用布隆过滤器快速判断数据是否存在,避免通过查询数据库来判断(使用bitmaps实现):在写入数据库数据时,使用布隆过滤器做个标记,然后在用户请求发现缓存没有值时,查询布隆过滤器快速判断数据是否存在。

二,缓存击穿(热点key过期)


对于热点数据,当缓存失效的一瞬间,所有的请求都被下放到数据库去请求更新缓存,数据库被压垮。
解决:

  1. 访问数据库加分布式锁:获得锁的那个线程才能去访问数据库,并写回缓存,其他线程等待。
  2. 热点数据不过期:由后台异步更新缓存,或者在热点数据即将过期前,提前通知后台线程更新缓存以及重新设置过期时间。

三,缓存雪崩(大量key同时过期)


当大量缓存在同一时间过期,如果此时有大量的用户请求,瞬间所有的请求都被下放到数据库,数据库就崩掉了。
解决:

  1. 将缓存失效时间随机打散 在原有的失效时间基础上增加一个随机值(比如1到10分钟)这样每个缓存的过期时间都不重复了,也就降低了缓存集体失效的概率。
  2. 缓存设置为不过期 通过后台服务来更新缓存数据。
相关推荐
樹JUMP11 分钟前
Python虚拟环境(venv)完全指南:隔离项目依赖
jvm·数据库·python
用什么都重名14 分钟前
Redis 入门与实践:从基础到 Stream 消息队列
数据库·redis·缓存
Mistra丶17 分钟前
记一次 JVM+Postgresql的 “死锁” 问题排查
jvm·数据库·postgresql·死锁
一然明月19 分钟前
Qt QML 锚定(Anchors)全解析
java·数据库·qt
苦瓜小生22 分钟前
【黑马点评学习笔记 | 实战篇 】| 7-达人探店
redis·笔记·后端·学习
大树学长28 分钟前
【QT开发】Redis通信相关(一)
redis·qt
分享牛37 分钟前
Operaton入门到精通23-Operaton 2.0 原生支持 JUnit 6 核心指南
数据库·junit
常利兵1 小时前
Spring Boot缓存新玩法:一键切换,租户无忧
spring boot·后端·缓存
编码忘我1 小时前
mysq系列之事务
数据库
知识分享小能手1 小时前
Redis入门学习教程,从入门到精通,Redis进阶编程知识点详解(5)
数据库·redis·学习