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、写操作:

  • 先写数据库,然后再删除缓存
  • 要确保数据库与缓存操作的原子性
相关推荐
Viktor_Ye12 分钟前
高效集成易快报与金蝶应付单的方案
java·前端·数据库
努力算法的小明1 小时前
SQL 复杂查询
数据库·sql
斗-匕1 小时前
MySQL 三大日志详解
数据库·mysql·oracle
代码中の快捷键1 小时前
MySQL数据库存储引擎
数据库·mysql
只因在人海中多看了你一眼1 小时前
数据库体系
数据库
尘浮生1 小时前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
六月闻君2 小时前
MySQL 报错:1137 - Can‘t reopen table
数据库·mysql
SelectDB技术团队2 小时前
兼顾高性能与低成本,浅析 Apache Doris 异步物化视图原理及典型场景
大数据·数据库·数据仓库·数据分析·doris
inventecsh2 小时前
mongodb基础操作
数据库·mongodb
白云如幻2 小时前
SQL99版链接查询语法
数据库·sql·mysql