ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Redis双删

Redis双删 ^^《榴芒客服系统》是我们工作室开发的在线客服系统欢迎下载试用《榴芒客服系统》https://blog.csdn.net/look4liming/article/details/164755808Redis双删通常指延迟双删是一种在缓存与数据库一致性场景下常用的策略用来减少“缓存脏数据”的时间窗口。它通常用在写操作更新/删除数据时核心流程是先删除缓存再更新数据库延迟一段时间后再次删除缓存1. 为什么需要双删先看普通“删缓存 更新数据库”的问题场景并发读写导致脏数据假设线程 A写请求准备更新数据库线程 B读请求发现缓存失效去读数据库时序A 删除缓存B 读缓存未命中B 读数据库得到旧值B 把旧值写回缓存A 更新数据库为新值结果数据库是新值缓存是旧值不一致。2. 延迟双删怎么解决写请求流程变成删除缓存更新数据库休眠一段时间比如 500ms ~ 1s再次删除缓存3. 为什么叫“延迟”双删因为第二次删除不能立刻执行否则可能发生在“读请求写回旧缓存”之前就起不到清理作用。延迟时间要大于读请求从数据库读取旧值 写回缓存的耗时。通常设置为几百毫秒具体要看业务读请求耗时。4. 延迟双删的缺点延迟时间不好确定设短了没用设长了影响性能而且无法覆盖所有极端并发。休眠阻塞线程如果用 Thread.sleep会占用线程资源通常要放到异步线程或延迟队列里执行。不能保证强一致它只是降低不一致概率和持续时间不是银弹。第二次删除可能失败需要重试机制比如消息队列、定时任务补偿。主从延迟问题如果数据库有主从同步延迟删缓存时可能读到从库旧数据需要额外考虑。更常用的替代/增强方案先更新数据库再删除缓存Cache Aside这是最常用的方案更新数据库删除缓存问题如果删除缓存失败会长期不一致需要补偿。消息队列 重试删除更新数据库后发消息到 MQ消费者负责删缓存失败可重试。订阅数据库 binlog 删缓存通过 Canal 等订阅 MySQL binlog数据库变更后自动删缓存。优点解耦、可靠缺点架构复杂有延迟。分布式锁 / 读写锁对同一 key 的读写加锁保证串行化但性能较差。设置较短的缓存过期时间作为兜底即使不一致也会很快过期。6. 总结方案一致性复杂度适用场景先删缓存再更新DB差低不推荐先更新DB再删缓存较好低最常用延迟双删较好中写多读多、并发高MQ/binlog 删缓存好高对一致性要求高一句话延迟双删 删缓存 → 更新数据库 → 延迟再删缓存用来清理并发读写回缓存的旧值但它不是强一致方案通常要配合重试和过期时间兜底。^^《榴芒客服系统》是我们工作室开发的在线客服系统欢迎下载试用《榴芒客服系统》https://blog.csdn.net/look4liming/article/details/164755808
返回列表