Redis+Mysql数据不一致问题

目前各个大项目中多多少少用了写Redis缓存技术,通过对Redis中数据的读取来减少对DB的压力。

一 先淘汰缓存,再写数据库

写数据:删除缓存、更新数据库  读数据:读取缓存、缓存读取不到在读取数据库、将读取到的数据写入缓存

那么在读、写两个分离的技术中就容易造成,数据库和缓存不一致的问题

Redis+Mysql数据不一致问题_第1张图片

当用户在更新数据时,在第二个步骤还未执行,但是此时又通过获取数据接口,此时缓存已经删除,但是数据库中还是老数据,那么就会将老数据重新写入缓存,就会导致缓存和数据库中数据不一致。

所以需要解决的方式

1、在读数据的时候,数据库中读取的一定是最新的数据(可以通过分布式锁实现)。

2、读请求造成的脏数据能进行覆盖或是删除。

解决方案一:延迟双删

在写数据的时候加入一个,更新完数据库后,再进行一次删除缓存的操作,具体延迟多久,就需要根据读数据中获取数据和写入缓存的这个时间估值

目的:确保读请求结束,写请求可以删除读请求造成的缓存脏数据。

Redis+Mysql数据不一致问题_第2张图片

 解决方案二:异步写入缓存

Redis+Mysql数据不一致问题_第3张图片

通过更新数据后,告知一个异步消息队列或是异步任务进行更新缓存,只要更新执行完成,就对缓存进行一个重新读取数据库(或是通过解析binlog)然后缓存更新的操作。实现最终一致性。

缺点:可能某个时间缓存一直不存在,导致数据都从数据库中获取。

解决方案三:实现串行写

写和读进行串行化,通过分布式锁,更新数据时通过加锁,直到更新数据完成,读取数据时,若缓存为空,则通过分布式锁(读写共用),获取到锁之后,再进行读取数据库,再写入缓存。

确保了数据库中读取的数据一定是最新数据。

 

 

 

你可能感兴趣的:(分布式,分布式)