缓存更新策略

有两种策略

1.先删除缓存,再操作数据库(有缺点)

正常:线程1先删除缓存,然后线程1更新数据库

异常情况:线程1删除缓存之后,再线程1更新数据库之前,线程2查询缓存,因为缓存已经被删除,未命中,然后查询数据库,写入缓存。之后线程1执行了更新数据库的操作,此时发生了数据库与缓存不一致问题、

发生情况:高 因为查询数据库是比较慢的

2.先操作数据库,再删除缓存。

正常:线程1查询缓存,未命中,查询数据库,然后写入缓存

异常情况:线程1查询缓存,未命中,查询数据库,此时线程2进行了更新数据库的操作,然后把缓存删除,然后线程1写入缓存。此时发生了数据库与缓存不一致问题

发生情况:低 因为 查询缓存之后写入缓存是毫秒级别,数据库查询很慢,发生情况很低

1. 低一致性需求:使用Redis自带的内存淘汰机制

生活化类比:

像图书馆书架满了,按"最近最少借阅"自动下架旧书,腾出空间放新书。不需要手动管理,系统自动淘汰。

专业解释:

Redis 内存满时,按配置策略(如 LRU)自动淘汰旧数据。适合对实时性要求不高的场景,如热点数据、统计数据。


2. 高一致性需求:主动更新 + 超时剔除

生活化类比:

像银行账户余额,必须准确。查询时先看"小本子"(缓存),有就直接用;没有就去查"总账"(数据库),查到后记到"小本子"并标注过期时间。更新时先改"总账",再撕掉"小本子"上旧记录,保证两个操作同时完成。

专业解释:

读操作(Cache-Aside):

  • 缓存命中:直接返回缓存数据
  • 缓存未命中:查数据库,写入缓存并设置过期时间(TTL)

写操作(Write-Through/Write-Behind):

  • 先写数据库,再删除缓存(避免先删缓存再写库导致短暂不一致)
  • 保证数据库写与缓存删除的原子性(事务或分布式锁),确保一致性

核心要点:

  • 低一致性:依赖自动淘汰,简单但可能读到旧数据
  • 高一致性:主动更新 + 超时兜底,保证准确性,但实现更复杂
相关推荐
短剑重铸之日10 小时前
《7天学会Redis》Day 5 - Redis Cluster集群架构
数据库·redis·后端·缓存·架构·cluster
胡萝卜的兔14 小时前
ThinkPHP6.0 Redis 延迟队列 + 定时任务 实现超时取消订单完整部署脚本
数据库·redis·缓存
进阶的小名15 小时前
[超轻量级延时队列(MQ)] Redis 不只是缓存:我用 Redis Stream 实现了一个延时MQ(自定义注解方式)
java·数据库·spring boot·redis·缓存·消息队列·个人开发
短剑重铸之日15 小时前
《7天学会Redis》Day 6 - 内存&性能调优
java·数据库·redis·缓存·7天学会redis
a努力。16 小时前
字节跳动Java面试被问:一致性哈希的虚拟节点和数据迁移
java·开发语言·分布式·算法·缓存·面试·哈希算法
VT.馒头16 小时前
【力扣】2622. 有时间限制的缓存
javascript·算法·leetcode·缓存·typescript
短剑重铸之日16 小时前
《7天学会Redis》Day 3 - 持久化机制深度解析
java·redis·后端·缓存
qq_4351395716 小时前
多级缓存(Caffeine+Redis)技术实现文档
数据库·redis·缓存
am心18 小时前
学习笔记-缓存&添加购物车
笔记·学习·缓存
Codeking__18 小时前
Redis初识——Redis的基本特性
数据库·redis·缓存