提示:文章先作为初版,等后续时间充足后,补充更深的内容
String、StringBuffer、StringBuilder
一、普通方法
-
先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不一致
-
先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中,这种方案能解决1方案的问题,但是在高并发下性能较低,而且仍然会出现数据不一致的问题,比如线程1删除了Redis缓存数据,正在更新Mysql,此时另外一个查询在查询,那么就会把Mysq中老数据又查到Redis中
二、优化方案一:延迟双删
延时双删(或者称为延迟双删)是一种常用的数据一致性保障机制,主要用于保证Redis和MySQL的数据一致性。
具体步骤如下:
当有数据需要更新时,首先删除Redis缓存中对应的数据。
然后更新MySQL数据库中的数据。
延迟一段时间(通常是几百毫秒),再次删除Redis缓存中对应的数据。
这样做的目的是:
在更新MySQL数据期间,其他线程如果从Redis中读取到了旧数据,则可以在延迟时间内将旧数据从Redis中删除,以保证数据的一致性。
如果延迟时间内没有读取到旧数据,则第二次Redis删除操作将不会生效,也不会影响数据的一致性。
需要注意的是,延迟双删并不能完全避免数据不一致的情况,仍然存在极端情况下的数据不一致问题,带来的缺点有:
1、在缓存过期时间内发生数据存在不一致
2、同时又增加了写请求的耗时。
因此,在实际应用中,还需要根据具体业务需求综合考虑采用其他机制来提高数据一致性的保障。
三、优化方案二:异步更新缓存(基于Mysql binlog的同步机制)
异步更新缓存是指将数据库中的数据变更同步到缓存中的操作,可以提高系统的读性能和响应速度。基于MySQL binlog的同步机制是一种实现异步更新缓存的方法。
具体步骤如下:
1、涉及到更新的数据操作,利用Mysql binlog 进行增量订阅消费
2、将消息发送到消息队列
3、通过消息队列消费将增量数据更新到Redis上
4、操作情况
读取Redis缓存:热数据都在Redis上
写Mysql:增删改都是在Mysql进行操作
更新Redis数据:Mysql的数据操作都记录到binlog,通过消息队列及时更新到Redis上
也可以采用别的第三方:kafka、rabbitMQ等来实现推送更新Redis!