缓存⼀致性问题
2022-07-21 本文已影响0人
嘘寒问暖
关于Redis的其他的⼀些⾯试问题已经写过了,⽐如常⻅的缓存穿透、雪崩、击穿、热点的问题,但是还有⼀个⽐较麻烦的问题就是如何保证缓存⼀致性。对于缓存和数据库的操作,主要有以下两种⽅式。
先删缓存,再更新数据库
先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的是旧值,缓存不⼀致发⽣。
解决⽅案
一:延时双删
延时双删的⽅案的思路是,为了避免更新数据库的时候,其他线程从缓存中读取不到数据,就在更新完数据库之后,再sleep⼀段时间,然后再次删除缓存。sleep的时间要对业务读写缓存的时间做出评估,sleep时间⼤于读写缓存的时间即可。
流程如下:
1. 线程1删除缓存,然后去更新数据库
2. 线程2来读缓存,发现缓存已经被删除,所以直接从数据库中读取,这时候由于线程1还没有更新完成,所以读到的是旧值,然后把旧值写⼊缓存
3. 线程1,根据估算的时间,sleep,由于sleep的时间⼤于线程2读数据+写缓存的时间,所以缓存被再次删除
4. 如果还有其他线程来读取缓存的话,就会再次从数据库中读取到最新值