cms网站模板套用教程,微信群领券网站怎么做,企业网站建设该入啥会计科目,房地产集团网站欣赏在我们的实际开发中#xff0c;我们用到了redis缓存一些常用的数据#xff08;如热点数据#xff09;用来提高系统的吞吐量。 但是不可以避免的出现了数据的修改场景#xff0c;这就导致了数据库中的数据和Redis中出现不一致性的情况。如何保证数据一致性就显得非常重要了我们用到了redis缓存一些常用的数据如热点数据用来提高系统的吞吐量。 但是不可以避免的出现了数据的修改场景这就导致了数据库中的数据和Redis中出现不一致性的情况。如何保证数据一致性就显得非常重要了下面介绍一下保证数据的双写一致性的方案。 1、先删缓存再操作数据库方案 在redis一般写的场景下对数据的更新操作是不推荐使用的推荐使用删除缓存数据的操作因为删除操作的效率更高。下图展示先删除缓存再操作数据库的过程图 在这种方式下会存在数据不一致的问题如下图所示 1线程1要更新数据它先删除redis中的缓存数据然后由于网络堵塞导致暂短的停顿没有继续执行操作数据库
2线程2要查询数据首先查询数据库但是由于Redis中的数据已经被线程1删除了那么它会去数据库中查询数据X并且要将数据X同步到Redis中
3线程1网络堵塞结束执行了数据库操作将数据X更改为Y 经过上述的过程就导致了Redis的数据和数据库中的数据不一致了即就是Redis中存放的依据是老数据。为了解决上述的问题我们采用缓存延迟双删的策略如下图所示的缓存延迟双删的过程 采用缓存延迟双删策略最多在X毫秒内读取的数据是老数据在X毫秒之后读取的数据都是最新的数据。X的具体值如何确定那就需要根据自身的业务了来确定。 延迟双删策略只能保证最终的一致性不能保证强一致性。由于对Redis的操作和Mysql的操作不是原子性操作所以如果想保证数据的强一致性就需要加锁控制如下图所示 加锁之后势必会带来系统的吞吐量的下降所以需要衡量利弊来确定是否使用加锁。
2、先操作数据库再删除缓存方案 此方案就是先操作数据库数据库写入成功之后再来删除Redis缓存中的数据。多个线程之间的数据读取和更新如下图所示 这种方案下在数据库更新成功后到删除Redis缓存数据之前的这段时间中其他线程读取的数据都是旧数据等Redis删除缓存后会重新从数据库中读取最新数据同步到Redis这样可以在一定程度上保证数据的最终一致性。极端情况下会出现数据不一致的情况如下图所示 1线程1先成功的更新数据到数据库中然后执行删除Redis缓存中的数据的时候失败了
2线程2要读取数据此时优先从Redis中查询数据由于此时Redis中老数据没有删除所以线程2可以拿到旧数据直接返回。直到Redis中缓存的数据过期之后才可以从数据库中获取最新的到Redis中
3、删除重试机制 无论是先删除缓存再操作数据还是先操作数据库再删除缓存的机制都有可能会出现删除缓存失败的情况如下图所示 为了应对删除缓存失败的情况发生于是加入了删除重试机制如下图所示 通过canal监听binlog感知数据的变动后canal客户端执行删除Redis缓存数据如果缓存数据删除失败那么发送一条MQ消息让canal客户端继续执行删除操作这样可以保证数据的最终一致性。但是这样也增加了系统的复杂性。
4、总结
1实际开发中推荐使用先操作数据库再删除缓存的方案因为此方案最大程度上保证了数据的一致性并且实现也最简单。
2无论是先操作数据库再删除缓存还是先删除缓存再操作数据库都有可能会出现删除缓存失败的情况所以需要加入删除重试机制。
3如果想要Redis和Mysql的数据强一致性可以考虑使用加锁的方式实现。
5、实际应用
在实际应用中我们一般会采取云服务器使用并处理实时同步RDS与Redis构建缓存一致性可参考我的上一篇文章实时同步RDS与Redis构建缓存一致性-CSDN博客 通过DTS数据订阅能力用户可以实时订阅RDS日志数据变更并将其写入Redis以实现缓存数据的更新。这样的配置可以实现MySQL与Redis之间的缓存同步一致性采用了Cache-Aside Pattern模式。通过DTS的服务化能力用户可以保证高效、稳定和实时的数据同步。从而用户能够实现商品信息的实时同步确保在系统中的商品信息始终是最新的。同时对于账单信息的查询也能够变得高效用户可以从Redis中获取已缓存的数据减少对MySQL的频繁访问提升查询性能。这样的解决方案不仅能够提高系统的响应速度还能够保证数据的一致性和准确性为用户提供更好的使用体验。 我使用的服务器组合是云服务器ECS省钱攻略可以试用。 通过RDS MySQLDTSRedis的架构实现RDS MySQL与Redis缓存之间的数据同步和一致性。通过实时同步MySQL数据库数据到Redis缓存提高数据查询速度降低数据库压力确保业务数据的实时性和准确性。