—1—
前言
在高并发的场景下,大量的请求直接访问Mysql很容易造成性能问题。所以,我们都会用Redis来做数据的缓存,削减对数据库的请求。但是,Mysql和Redis是两种不同的数据库,如何保证不同数据库之间数据的一致性就非常关键了。
—2—
数据不一致的原因
不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。
— 3—
解决方案
public void write( String key, Object data ){ redis.delKey( key ); db.updateData( data ); Thread.sleep( 500 ); redis.delKey( key );}br
问题:这个500毫秒怎么确定的,具体该休眠多久时间呢?
结合双删策略+缓存超时设置,这样最差的情况就是:
(1) 数据操作主要分为两种:
这里说的是增量,指的是mysql的update、insert、delate变更数据。
(2)读取binlog后分析 ,利用消息队列,推送更新各台的redis缓存数据。
这里的消息推送工具你也可以采用别的第三方:kafka、rabbitMQ等来实现推送更新Redis!
—4—
总结
在高并发应用场景下,如果是对数据一致性要求高的情况下,要定位好导致数据和缓存不一致的原因。
解决高并发场景下数据一致性的方案有两种,分别是延时双删策略和异步更新缓存两种方案。
另外,设置缓存的过期时间是保证数据保持一致性的关键操作,需要结合业务进行合理的设置。