如何保证Redis缓存和数据库数据的一致性?

1. Cache Aside Pattern(旁路缓存模式):

  • 读取操作:
  1. 先从缓存中读取数据。
  2. 如果缓存未命中,则从数据库中读取数据,并将数据写入缓存。
  • 写入操作:
  1. 更新数据库中的数据。
  2. 成功更新数据库后,再删除或更新缓存中的数据。

这种模式的关键在于确保数据库更新成功后再更新缓存,以避免缓存中的数据过时。

2. Write Through Cache(写直达缓存):

所有写操作同时更新数据库和缓存。这种方法可以确保缓存和数据库的一致性,但可能会增加写操作的延迟。

3. Write Behind Cache(写回缓存):

写操作首先更新缓存,然后异步地将数据写入数据库。这种方法可以提高写操作的性能,但在系统崩溃时可能导致数据丢失。

4. 使用消息队列:

在数据库更新后,发送一条消息到消息队列,消费者监听队列并更新缓存。这种方法可以解耦数据库和缓存的更新操作,并提高系统的可扩展性。

5. 分布式锁:

在更新数据库和缓存时使用分布式锁(如Redis的Redlock)来确保操作的原子性,避免并发写入导致的不一致。

6. TTL(Time to Live)策略:

为缓存数据设置TTL,确保数据在一段时间后自动过期,从而减少缓存和数据库不一致的时间窗口。

7. 延时双删:

  • 对于不可变操作(读取):
  1. 缓存命中:直接从 Redis 返回数据,不需要查询 MySQL;
  2. 缓存未命中:查询 MySQL 获取数据(可以使用只读副本来提高性能),将返回的数据保存到 Redis,将结果返回给客户端。
  • 对于可变操作(创建、更新、删除):
  1. 删除Redis中的条目;
  2. 向MySQL创建、更新或删除数据;
  3. 睡眠一段时间(比如500ms);
  4. 再次删除Redis中的条目。

8. 定期同步:

定期从数据库同步数据到缓存,确保缓存中的数据与数据库保持一致。

9. Cannal

通过Cannal订阅Binlog日志,然后同步到Redis。这种场景也是很多互联网项目使用比较多的解决方案。

关于缓存与DB一致性的方案有很多,每种方法都有其优缺点,选择合适的方法需要根据具体的应用场景、性能要求和一致性需求来决定。在实际应用中,可能需要结合多种方法来实现最佳效果。

相关推荐
小米里的大麦6 分钟前
16 MySQL 事务
数据库·mysql
西柚小萌新7 分钟前
【LLM&&AI应用开发 八股文】--4.3.Agent智能体(下)
java·开发语言·数据库
骉马代驾31 分钟前
代驾系统实战(三):抢单池的 Redis 锁 + RabbitMQ 异步消费怎么做
redis
邓工说电1 小时前
智慧断路器安全吗?数据加密、离线保护与合规认证全解读
大数据·数据库·人工智能·智能断路器·炜晔科技
adinnet20261 小时前
企业微调大模型(Fine-tuning):先吃透 RAG 还是先训自己的模型
大数据·数据库
行百里er2 小时前
Redis Streams——有确认、能回溯的消息队列
redis
上位机妹子2 小时前
EF Core 两种继承映射:每层次一张表(TPH)与每类型一张表(TPT)
数据库·c#·.netcore·ef core
小马同学-2 小时前
Redis消息队列与客户端编程
数据库·redis
weixin199701080162 小时前
《1688图片空间API踩坑:img.upload 与 album.* 的防盗链与CDN缓存问题》(附Python源码)
开发语言·python·缓存
for_ever_love__3 小时前
MySQL 高频面试题 30 问:索引、事务、锁、日志、主从与分库分表(MySQL 8.0 版)
java·数据库·spring boot·mysql·spring cloud·面试·总结