Redis生产问题

缓存穿透:

什么是缓存穿透

客户端发起大量请求,请求数据既不存在于缓存,也不存在于数据库。

直接导致请求全部打到数据库上,增加访问压力,可能发生宕机。

解决缓存穿透

1、缓存无效key:当缓存和数据库都查不到某个key,就写一个到缓存中(key : null)并设置过期时间。

2、布隆过滤器

当用户请求过来,先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走下面的流程。

3、接口限流

缓存击穿:

什么是缓存击穿?

某热点key过期,导致当前数据只存在于数据库中,而不在缓存中。导致大量请求直接打到了数据库上。

解决缓存击穿:

1、设置热点key较长的过期时间或者永不过期

2、提前预热。针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。

缓存击穿和缓存穿透区别

缓存穿透的数据 既不在缓存中也不在数据库中

缓存击穿的数据 只是不在缓存中,数据库中存在

缓存雪崩

什么是缓存雪崩

缓存在同一时间大面积失效 或者服务宕机,导致大量请求直接打在数据库上,造成压力。

解决缓存雪崩

1、服务宕机

1.1、Redis建立集群(一个宕机用其他的)

1.2、多级缓存(加一个本地缓存,缓存出问题去本地缓存获取)

2、大量缓存同时失效

2.1、为缓存设置随机失效时间

2.2、提前预热。针对热点数据提前预热,将其存入缓存中并设置合理的过期时间比如秒杀场景下的数据在秒杀结束之前不过期。

缓存预热怎么实现

1、定时任务:比如 xxl-job,来定时触发缓存预热的逻辑,将数据库中的热点数据查询出来并存入缓存中。

2、消息队列:异步进行,将db中的热点数据的主键或者 ID 发送到消息队列中,然后由缓存服务消费消息队列中的数据,根据主键或者 ID 查询数据库并更新缓存

缓存雪崩和缓存击穿区别

缓存穿透:大量key失效

缓存击穿:某个热点key

数据库和缓存数据一致性怎么保证?

旁路缓存模式会先更新数据库,再删除缓存

删除缓存可能执行失败,导致不一致性

解决办法:

1、缓存失效时间变短(删除失败也没事,过期自动删)

2、利用消息队列实现更新重试机制:缓存删除失败,直接将删除缓存的重试消息发送到消息队列,异步重试删除。

相关推荐
星恒随风8 小时前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql
吴名氏.10 小时前
Java转AI Agent教程(第十三周)混合检索与重排
java·数据库·人工智能·ai·ai agent
爱码少年10 小时前
Springboot下如何将CSV文件数据导入H2、Mysql数据库表
数据库·mysql·csv
我不会起名字32211 小时前
会话缓存失效排查:区分 Redis 失效与节点广播
redis·后端·go·即时通讯·im·故障排查
可乐ea11 小时前
智能体记忆该拆成几层:笔记、记忆表示与注入上下文
服务器·数据库·笔记·ai智能体·提示词工程·上下文工程·记忆系统
阿义有问题13 小时前
MySQL 迁移达梦全流程实战:DTS 七步图解 + 对象名全大写适配(附踩坑清单)
数据库
猫猫不是喵喵.15 小时前
从0到1创建一个微服务项目
java·数据库·微服务·1024程序员节
lsc_blog16 小时前
听到优化风声,先准备能由自己掌控的事
数据库·分布式·中间件·职场和发展·重构
墨痕诉清风16 小时前
SSRF漏洞实战记录+OSS桶命令执行+MCP漏洞
linux·服务器·数据库
aiks_yuan17 小时前
Redis 大key怎么排查和删除:--bigkeys 每类只报一个,DEL 百万字段的 Hash 卡 0.3 秒(Redis 7.2 实测)
redis