[Redis]——数据一致性,先操作数据库,还是先更新缓存?

目录

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

1.删除缓存还是更新缓存?

2.如何保证缓存与数据库的操作同时成功或失效

3.先操作缓存还是先操作数据库(多线程并发问题)

[二、 缓存更新的最佳策略](#二、 缓存更新的最佳策略)


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

1.删除缓存还是更新缓存?

  • 更新缓存:每次更新数据库都更新缓存,如果写多读少,这样效率太低。
  • 删除缓存:更新数据的同时让缓存失效,查询时再更新缓存。

🌳我们一般会采用删除缓存策略。

2.如何保证缓存与数据库的操作同时成功或失效

  • 单体系统,将缓存与数据库操作放在一个事务,利用事物本身原子性来保证。
  • 分布式系统,利用TCC等分布式事务方案。

3.先操作缓存还是先操作数据库(多线程并发问题)

  • 先删除缓存,在操作数据库
  • 先操作数据库,在删除缓存

那哪一种比较好呢❓

解释:

如果在线程1删除缓存,更新数据库的时候,线程2查询该数据,未命中,然后写入缓存,这就导致了数据库与缓存不一致,并且这种情况发生的概率很大,因为更新的时间可能是比较久的,而操作缓存是很快的,所以这种方式不好

另一种方式

解释:

如果某一时刻,缓存突然失效了,线程1查询缓存未命中,准备写入缓存,这是线程2来更新数据库了,然后删除缓存,再然后线程1就要写入缓存了,数据又不一致了,但是这种情况发生的概率很小。

二、 缓存更新的最佳策略

主动更新缓存,并以超时剔除作为兜底方案,因为如果缓存过多可能导致内存不足

读操作:

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

写操作:

  • 先操作数据库,然后再删除缓存
  • 确保数据库和删缓存操作的一致性
相关推荐
hrrrrb43 分钟前
【Spring Security】Spring Security 概念
java·数据库·spring
心止水j1 小时前
spark
javascript·数据库·spark
xujiangyan_2 小时前
Redis详解
数据库·redis·缓存
Y编程小白5 小时前
PostgreSQL在Linux中的部署和安装教程
数据库·postgresql
程序员小凯7 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存
TiAmo zhang7 小时前
SQL Server 2019实验 │ 数据库和表的创建、修改与删除
数据库·oracle
泽02027 小时前
Linux之环境变量
java·linux·redis
disanleya8 小时前
MySQL默认密码不安全?如何首次登录并强化?
数据库·mysql·安全
花开富贵贼富贵8 小时前
MySQL 核心高级特性
运维·数据库·mysql
hello 早上好8 小时前
深入 Spring 依赖注入底层原理
数据库·sql·spring