Redis和数据库的一致性
首先Redis和数据库的一致性
有四种解决方式 :
1.先删除缓存 ,在更新数据库
2.先更新数据库,在删除缓存
3.延时双删
4.cache aside
为什么是删除而不是更新?
因为更新缓存的过程中,我们存储的数据可能不是一个简单的字符串,可能是一个复杂的json数据,可能是一个map,如果我们去更新,那么这个动作相比于删除复杂很多
先删除缓存,在更新数据库
有一个风险点,删除缓存之后,这个瞬间又请求来读,这样就会导致不一致。但是这种概率其实是比较低的,因为我们读缓存+读数据库的操作可能也就在十几毫秒,在这十几毫秒很难再去完成一个写的操作。
还有一个风险点,就是说我们在删除缓存这一瞬间,可能会出现缓存击穿的情况。我们可以通过加锁的方式。
先更新数据库,在更新缓存
风险点在于 第二步的删除缓存失败
先写数据库,再更新缓存
W | W |
写数据库,更新成20 | |
写数据库,更新成10 | |
写缓存,更新成10 | |
写缓存,更新成20(数据不一致) |
先更新缓存,后写数据库:
W | W |
写缓存,更新成20 | |
写缓存,更新成10 | |
写数据库,更新成10 | |
写数据库,更新成20(数据不一致) |
Cache aside
这种方式就是 监听数据库,修改的时候,异步通知redis清空缓存