Redis-实战篇-缓存更新策略(内存淘汰、超时剔除、主动更新)

文章目录

1、缓存更新策略

1.1、内存淘汰

说明:不用自己维护,利用Redis的内存淘汰机制,当内存不足时自动淘汰部分数据。下次查询时更新缓存。
一致性:差
维护成本:无

1.2、超时剔除

说明:给缓存数据添加TTL(Time To Live)时间,到期后自动删除缓存。下次查询时更新缓存。
一致性:一般
维护成本:低

1.3、主动更新

编写业务逻辑,在修改数据库的同时,更新缓存
一致性:好
维护成本:高

2、业务场景:

  • 低一致性需求:使用内存淘汰机制。例如店铺类型的查询缓存
  • 高一致性需求:主动更新,并以超时剔除作为兜底方案。例如店铺详情查询的缓存

3、主动更新在企业中业务实现有三种方式

3.1、Cache Aside Pattern

企业用的最多
由缓存的调用者,在更新数据库的同时更新缓存

3.1.1、操作缓存和数据库时有三个问题需要考虑:

3.1.1.1、删除缓存还是更新缓存?
  • 更新缓存:每次更新数据库都更新缓存,无效写操作较多
  • 删除缓存:更新数据库时让缓存失效,查询时再更新缓存,一般会选择删除缓存的这个方案
3.1.1.2、如何保证缓存与数据库的操作的同时成功或失败?
  • 单体系统:将缓存与数据库操作放在一个事务
  • 分布式系统:利用TCC等分布式事务方案
3.1.1.3、先操作缓存还是先操作数据库?
  • 先删除缓存,再操作数据库
  • 先操作数据库,再删除缓存,胜出

3.2、Read/Write Through Pattern

缓存与数据库整合为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性问题。

3.3、Write Behind Caching Pattern

调用者只操作缓存,由其它线程异步的将缓存数据持久化到数据库,保证最终一致。

4、缓存更新策略的最佳实践方案:

  1. 低一致性需求:使用Redis自带的内存淘汰机制
  2. 高一致性需求:主动更新,并以超时剔除作为兜底方案

5、读操作

  • 缓存命中则直接返回
  • 缓存未命中则查询数据库,并写入缓存,设定超时时间

6、写操作:

  • 先写数据库,然后再删除缓存
  • 要确保数据库与缓存操作的原子性
相关推荐
程序员夏洛6 小时前
MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
数据库·mysql
Wang's Blog7 小时前
PostgreSQL笔记34:索引优化策略全景解析——从B-tree到HOT的核心原理与实践
数据库·笔记·postgresql
mit6.8247 小时前
保持缓存的有效性
缓存
l1258657 小时前
# RAG向量数据库优化实战:HNSW索引调参与生产级性能设计
数据库·python·mysql·langchain
梦Arrebol7 小时前
Mysql内容及相关实验
数据库·mysql
OceanWaves19938 小时前
mysql 8.0.32 磁盘爆满,清理从库日志
数据库·mysql
凤山老林8 小时前
数据库读写分离与动态路由实战:Spring Boot + ShardingSphere-JDBC 生产配置
数据库·spring boot·后端·分库分表·sharding-jdbc
l1258659 小时前
# RAG噪声知识库治理:一致性与可信度的四层防线设计
数据库·人工智能·python·自然语言处理·langchain
聚美智数10 小时前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库
JavaPub-rodert10 小时前
Go 后台如何同时兼容 MySQL、PostgreSQL、SQLite 和 SQL Server?从 ShiyuAdmin 看 GORM 多数据库适配
数据库·mysql·postgresql·golang·javapub·王仕宇