先删缓存再更新数据库–不用
大概率缓存中是脏数据
先更新数据库再删缓存–应用比较广泛
只有很小的概率会造成脏数据,当缓存中还没有数据的时候
例如线程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系统故障退出的时候,会造成丢失数据的情况