确保Redis缓存一致性的N种方法
1、及时失效法
当程序需要update该数据时,先更新数据库数据数据,若数据库update成功,则重新为Redis该key值设置一个极短的过期时间,当过期之后,下一个请求自然会去数据库获取最新版本的数据
2、互斥锁
当程序需要update数据时,更新完数据库,再去更新缓存,当然这里会有一个逻辑漏洞:A线程在update数据时,刚擦除缓存。还没来得及写入缓存,此时若线程B执行查询操作,从数据库重新写入缓存一个老数据,当A再去写入缓存的时候就会发现已经有数据了,这样就会导致缓存和数据库不一致。
解决此类问题,需要把更新Redis的操作做互斥锁设计,单机环境使用sync互斥锁保证/分布式使用分布式锁,更新缓存和去数据库更新缓存必须只有一个线程执行才可,这样就可以保证缓存中是最新的数据
3、乐观锁
为数据添加一个版本号,每次去缓存中获取的时候都去数据库核对一下版本号,相同则直接返回,不相同则更新,更新的时候同样需要使用互斥锁,或分布式锁保证操作的原子性。