Redis缓存系统常见问题及解决方案
首先了解以下Redis缓存机制
Redis缓存基于内存,查询时先进入Redis缓存,如若查询不到,则进入MySQL数据库查询信息。数据库取到则更新缓存并返回结果,否则返回空。
缓存穿透问题
-
什么是缓存穿透
当用户在 Redis 缓存系统执行一条无效查询时,这条无效查询将穿透 Redis 缓存系统并MySQL 数据库请求数据,而 MySQL 数据库也获取不到数据
解决方案1>
缓存空对象
用户查询Redis缓存和MySQL数据库中都不存在的数据时,MySQL会返回一个空对象。并将这个空对象和用户请求关联起来存到 Redis 缓存中;当存在相同用户请求,这时 Redis 缓存就会命中,就直接从缓存中返回这个空对象,这样可以减少访问数据库的压力,提高当前数据库的访问性能。
-
优点
-
机制原理和实现比较简单
-
代码修改维护容易
-
-
缺点
-
会带之Redis缓存中产生大量空对象
-
会占用许多内存控件
-
会浪费许多资源(可设置缓存空对象过期时间)
-
解决方案2>
过滤非法查询:在后台服务中过滤非法查询,使得其无法访问Redis缓存。
解决方案3>(推荐)
布隆过滤器
的底层是一种基于概率的数据结构,主要使用来判断当前某个元素是否在该集合中,运行速度快。但布隆过滤器不是绝对精确,只要参数设置的合理,它的精确度可以控制的一个期望精确值
-
解决方案
采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的二进制 bitmap 中,一个一定不存在的数据会被这个 bitmap拦截掉,从而避免了对底层数据库的查询压力
布隆过滤器在空间效率和查询效率都非常高
缓存击穿
缓存击穿是指 Redis 缓存中有一些的热点数据 key 同时过期失效,或有一些非热点数据key 突然有大量并发访问请求,这样会导致大量并发请求直接穿透 Redis 缓存,涌入MySQL 数据库,瞬间增大数据库的访问压力,甚至导致数据库崩溃。
解决方案
-
互斥锁
(Redis的分布式锁)对线程访问数据库加以限制,持有锁的线程才有权限访问数据库。
对于Key过期时Key查询数据库时加锁,此时允许第一个请求查询数据库,查询得到数据存入Redis缓存。
-
永不过期
维护简单但占用内存高。对非热点数据的高并发访问无效。
-
合理设置过期时期时间
设置不同的过期时间让缓存失效的时间点尽量均匀
缓存雪崩
何谓缓存雪崩
段时间内,Redis缓存宕机或者大量Key同时过期失效。恰好此时有大量请求涌入,且查询数据量巨大,大量请求进入MySQL数据库,导致数据库压力过大甚至宕机。
解决方案
-
Redis高可用
搭建 Redis 主从架构或集群架构
-
限流降级
在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,对某个 key只允许一个线程查询数据和写缓存,其他线程等待
-
数据预热
将部分可能大量访问的热点数据提前加载到 Redis 缓存中,或在即将发生高并发请求访问前手动触发加载缓存不同的 key
-
不同时期时间
__EOF__

本文链接:https://www.cnblogs.com/3-DG/p/17765696.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能