文章目录

  • 先删缓存再更新数据库--不用
  • 先更新数据库再删缓存--应用比较广泛
  • 先更新数据库再更新缓存
  • read write through
  • write behind


先删缓存再更新数据库–不用

大概率缓存中是脏数据

先更新数据库再删缓存–应用比较广泛

只有很小的概率会造成脏数据,当缓存中还没有数据的时候

例如线程A,读
线程B 写
A先进入数据库,读取到老数据
B进入数据库,并更新数据数据,清除缓存
A将老数据读入到缓存中,这样缓存中的数据总是老的

所以缓存一定要设置过期时间,避免脏数据一直有

而且删除缓存,会造成高并发的时候,所以大量请求到直接到数据库上,造成雪崩

先更新数据库再更新缓存

这种方案比 ‘先更新数据库再删除缓存’的方案更好,可以避免高并发下瞬间大量请求穿透缓存到数据库上。

而且它也会出现脏数据 建议项目初始化的时候灌入到缓存中

A线程更新
B线程更新,更改缓存
A线程更改缓存 ,虽然B线程是后操作的,但是B的更改被A又覆盖了,造成了脏数据

所以一定要设置缓存的过期时间

read write through

读写,都经过统一的repository,respository对缓存和数据库进行统一的操作;

读—>repository—>cache—>有直接返回,没有读取db,将db缓存到cache中

写—>repository—>cache中有,则更新cache,更新db,cahce中没有,则直接写到db中

write behind

这种方式类似于uninx的页缓存,缓存和持久层数据不一致,只有当缓存空间不足,或者程序退出的时候,或者特定情况下,才会将缓存中的数据刷盘到持久层;

因为页缓存的原因,所以会导致linux系统故障退出的时候,会造成丢失数据的情况