【Redis篇】Redis缓存之双写一致性

1 引言

redis做为缓存,mysql的数据如何与redis进行同步呢?(本质上问的就是双写一致性)
注意:回答这个问题前一定要结合自己的业务背景,分两种情况,一个是你的业务一致性要求高;另一个是你的业务允许延迟一致

2 双写一致性

2.1 双写一致性定义

双写一致性:当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。
在这里插入图片描述
读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间;
写操作:延迟双删

在这里插入图片描述

2.2 问题分析

这里就会产生一个问题,上图步骤①②可以调换顺序吗?即先删除缓存,还是先修改数据库?

2.2.1先删除缓存,后修改数据库

①正常情况:
在这里插入图片描述
数据库和缓存数据变化:
在这里插入图片描述

### Redis 缓存一致性策略 为了确保在使用 Redis 作为缓存时实现一致性,即保持 Redis 和主数据库之间的数据同步,可以采用多种技术和最佳实践。这些技术旨在解决常见的不一致问题并提高系统的可靠性和性能。 #### 使用事务机制 通过引入分布式事务来管理 Redis 和主数据库的操作顺序,可以在一定程度上减少因并发操作引起的不一致现象。虽然 Redis 自身支持简单的多命令执行模式(MULTI/EXEC),但对于跨多个存储系统的场景,则需借助外部工具或框架完成更复杂的协调工作[^1]。 #### 实现最终一致性模型 考虑到强一致性的成本较高,在某些应用场景下可以选择较为宽松的最终一致性方案。具体做法是在更新源端之后异步通知目标端进行相应的变更处理;或者定期扫描对比两端的数据差异,并自动修复发现的不同之处。这种方式能够有效降低延迟时间的同时维持较高的吞吐量水平[^2]。 #### 应用消息队列中间件 利用 Kafka、RabbitMQ 等消息传递服务构建事件驱动架构也是一种常见手段。每当发生影响到共享资源状态变化的动作时就发送一条记录给订阅者们知晓。接收方监听特定主题的消息流后作出响应动作,比如刷新本地副本中的陈旧条目或是触发后台任务重新加载最新版本的信息集合[^3]。 ```java // Java伪代码示例:基于Spring Data Redis和JPA实现向同步逻辑 @Autowired private JpaRepo jpaRepository; @Autowired private StringRedisTemplate stringRedisTemplate; @Transactional(propagation = Propagation.REQUIRED) public void saveEntity(Entity entity){ // Save into main DB first. Entity saved = this.jpaRepository.save(entity); try { // Then update the cache with new value. ValueOperations<String, String> ops = template.opsForValue(); ops.set("entity:" + saved.getId(), objectMapper.writeValueAsString(saved)); } catch (Exception e) { throw new RuntimeException(e.getMessage()); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello_Success

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值