缓存更新策略

有两种策略

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

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

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

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

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

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

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

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

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

生活化类比:

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

专业解释:

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


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

生活化类比:

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

专业解释:

读操作(Cache-Aside):

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

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

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

核心要点:

  • 低一致性:依赖自动淘汰,简单但可能读到旧数据
  • 高一致性:主动更新 + 超时兜底,保证准确性,但实现更复杂
相关推荐
silvamux_12 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
石小千17 小时前
Redis开启ACL认证
数据库·redis·缓存
Vitaliy Kostrov(柯维远)17 小时前
谁来承担额外工作?CDN 参与者如何协商资源
nginx·缓存·系统架构·开源·cdn
hweiyu0018 小时前
Redis命令:LPOS
redis·缓存
大圣编蚕19 小时前
Redis 为什么快?现在还是单线程吗?
数据库·redis·缓存
路多辛19 小时前
全能 Go Agent 框架 covonaut v1.1.5 发布:改进检查点、Token用量与缓存
缓存·agent·ai编程
轮子大叔20 小时前
Redis深入浅出
redis·缓存
海绵宝宝转agent20 小时前
2026-10-14算法+面经总结
java·笔记·算法·缓存
旋生万物21 小时前
分形自相似:微服务、缓存、Prompt 模板为什么长一样
人工智能·缓存·微服务·云原生·prompt
计算机就业还在扩大21 小时前
Redis中的setnx是原子性的?
数据库·redis·缓存