怎样保证mysql和redis的双写一致性

一、场景:

双写一致性指的是当我们更新了数据库的数据之后redis中的数据 也要同步去更新。使用redis读取数据的流程,当用户访问数据的时候,会先从缓存中读取数据,如果命中缓存的话,那么直接把缓存中的数据返回给用户,如果缓存中没有数据的话,先查询数据库把查询到的数据保存到缓存中,然后返回给用户。

二、保证双写一致性的策略

双写一致性问题不再困扰,教你如何保证MySQL和Redis数据同步

1、先更新缓存,再更新数据库

2、先更新数据库,再更新缓存

3、先删除缓存,再更新数据库

4、先更新数据库,再删除缓存

三,四种策略的优缺点

1、先更新缓存,再更新数据库

问题很明显如果更新缓存成功,更新数据库失败,就会造成缓存的脏数据

2、先更新数据库,再更新缓存

如果再高并发的情况下,可能会存在如下的情况,线程A更新了数据库,如果由于网络或者其他的原因,线程A还没来得及更新缓存,这时候有一个进程B更新了数据库,更新了缓存,这时候进程A才更新缓存,这时候就会导致线程B对缓存的更新丢失了,像事务丢失的情况

3、先删除缓存,再更新数据库

这种策略可能已经避免掉了,策略2中缓存丢失的情况,但是再高并发的情况下,也会有不一致的情况,比如线程A做写操作,首先删除缓存然后准备跟新数据库,这时候,线程B执行了写操作,没有命中缓存,然后查询数据库,这时候读取的是旧值,并把查询到的旧值保存到缓存中,接着线程A完成了数据库的更新,这时候数据库和缓存又出现了不一致的情况,解决方案:我们只要再线程A,完成数据库的更新之后,稍作延迟再删除一次缓存,也叫做延迟双删。这里的延迟时间一定要大于业务的一次读操作的时间。

4、先更新数据库,再删除缓存

再高并发的情况下,也会有不一致的情况,比如线程A做读取数据的操作,正准备写入缓存的时候,线程B更新了数据库,然后执行了删除缓存的操作,这时候线程A才把旧值写入到缓存中,虽然这种情况出现的概率比较低,因为写操作的时候要大于一次读操作的时间的。作为替换,可以将原话简化并重新组织结构:

为处理删除失败的情况,建议采用延迟双删方案。即使延时双删仍存在问题,也可反复进行删除操作,直到缓存被彻底清除。如果删除失败,我们可以将需要删除的键放入队列中,一遍又一遍地尝试删除,直到删除成功为止。



MySQL和Redis作为当今最受欢迎的数据库管理系统,不可避免地会被用到同一个应用系统中。但是它们各自的工作机制不同,可能会存在数据不一致的问题,怎么办呢?下面将介绍几种保证MySQL和Redis双写一致的方法。
1. 了解双写一致性的概念
双写一致性是指将同一份数据同时写入两个或多个不同存储设备中,在同时更新时,这些设备必须保持数据的一致性。在MySQL和Redis中实现双写一致性技术可维持数据的可靠性和完整性。
2. 利用集群实现MySQL和Redis的数据同步
利用集群技术,将MySQL和Redis集成在同一个系统中。这样,MySQL和Redis之间的数据同步就可以变得简单而快速,因为两个数据库可以直接通过网络连接进行通信,而数据复制速度更加快速。
3. 使用数据同步工具来手动实现数据同步
Redis的复制功能只是将主服务器的所有指令复制到备份服务器,因此它的复制功能很基本。为了解决这个问题,许多公司和个人开发了一些数据同步工具,这些工具可以让我们手动的将MySQL和Redis的数据同步起来。
4. 在应用层面上解决数据同步的问题
为了避免使用数据同步工具,也可以在应用层面上解决MySQL和Redis的双写一致性。比如在数据写入MySQL之后,必须检查Redis是否正确地存储了相应的数据。如果没有正确存储,应用程序将终止,这样就可以避免MySQL和Redis数据不一致的问题。
总之,无论使用哪种方法,都需要充分了解双写一致性的概念,才能在MySQL和Redis中实现数据同步。通过以上方法,可以让你避免数据不一致的问题,确保MySQL和Redis数据的一致和准确。