Redis篇
2023-04-03 15:00:46 13 举报
缓存更新\缓存穿透\缓存雪崩\缓存击穿
作者其他创作
大纲/内容
4.写入缓存
请求
客户端
1.缓存命中返回更新之后的数据
优点1.没有额外的内存消耗2.保证一致3.实现简单缺点1.性线程需要等待,性能受影响(一个线程拿到锁之后其他线程需要等待释放锁)2.可能有死锁风险3.逻辑过期
放行
3.释放锁资源
2.获取互斥锁成功
数据库
3.休眠一会在重试
优点:内存占用较少,没有多余key缺点:1.实现复杂2.存在误判可能
缓存命中返回
解决方案
解决方案:1.给不同的Key的TTL添加随机值(存活随机值)2.利用Redis集群提高服务的可用性(哨兵机制)3.给缓存业务添加降级限流策略4.给业务添加多级缓存
线程3
缓存穿透解决--布隆过滤器
数据存在放行
优点线程无需等待,性能较好缺点1.不保证一致性(会返回旧数据)2.有额外内存消耗(保存过期时间)3.实现复杂(需要维护逻辑过期)
2.获取互斥锁失败
redis缓存模型
线程1
未命中
redis
3.查询数据库重建缓存数据
数据未命中
2.写入缓存重置逻辑过期时间
1.查询缓存未命中
3.返回过期数据
缓存未命中查询数据库
命中
时间线
数据库返回数据
缓存更新策略
数据不存在拒绝请求
缓存击穿:也叫热点Key问题,就是一个被 并且 的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。
4.反复重试
redis宕机
线程2(更新数据)
缓存null设置TTL
线程4
缓存穿透解决--缓存空对象
线程2
3.开启新线程
5.释放锁
解决方式--逻辑过期
写缓存
拒绝
布隆过滤器
例:key --> ** : xx ; 00value-->{name:\"Jack\
缓存重建业务较复杂
缓存穿透产生的原因是什么?用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力缓存穿透的解决方案有哪些?缓存nu值布隆过滤增强id的复杂度,避免被猜测id规律做好数据的基础格式校验加强用户权限校验做好热点参数的限流
1.查询数据库重建缓存数据
高并发访问
缓存更新策略的最佳实践方案:1.低一致性需求:使用Redis自带的内存淘汰机制2.高一致性需求:走动更新,并以超时剔除作为兜底方案读操作:缓存命中则直接返回缓存未命中则查询数据库,并写入缓存,设定超时时间写操作:先写数据库,然后再删除缓存要确保数据库与缓存操作的原子性
1.删除缓存还是更新缓存?更新缓存:每次更新数据库都更新缓存,无效写操作较多删除缓存:更新数据库时让缓存失效,查询时再更新缓存(优先使用)2.如何保证缓存与数据库的操作的同时成功或失败?单体系统,将缓存与数据库操作放在一个事务分布式系统,利用TCC等分布式事务方案3.先操作缓存还是先操作数据库?先删除缓存,再操作数据库先操作数据库,再删除缓存
返回数据
解决方式--互斥锁
Redis篇缓存更新\\缓存穿透\\缓存雪崩\\缓存击穿
返回空
数据为空再次请求(循环请求)
缓存数据
4.返回过期数据
0 条评论
回复 删除
下一页