缓存与数据库相关问题

更新数据库的同时更新缓存

  • 更新缓存还是删除缓存?
    更新缓存:每次更新数据库都更新缓存,无效写操作较多。比如数据库更新了100次,缓存也更新了100次,但这时很少有请求是查询请求,缓存无效写操作较多。-----写多读少的场景

  • 删除缓存
    更新数据库时让缓存失效,查询时再更新缓存。比如数据库更新了100次,缓存只删除1次,等到有查询请求进来时,先查询数据库,在更新值

先删除缓存,再操作数据库
缓存与数据库相关问题_第1张图片
上图是正常情况,缓存和数据库中刚开始值为10,线程1先删除缓存,缓存里面没有值了,在更新数据库,v=20;线程2进来查询缓存,缓存为空,查询数据库,将查到的20写入缓存。此时缓存和数据库中的值保持一致,都是20
缓存与数据库相关问题_第2张图片上图是另外1种情况,缓存和数据库中的值初始都为10,线程1先删除缓存,此时缓存里面的值为空,想更新数据库的时候,线程2进来了,抢占到cpu的时间片(由于查询缓存操作比更新数据库操作更轻量,这种情况很有可能发生),先查询缓存,缓存为空,查询数据库,得到值为10,写入缓存,缓存里的值变为10,此时线程1开始工作,更新数据库,将v=20。此时,缓存里面的值为10,数据库中值为20,缓存与数据库中值不一致

先操作数据库,再删除缓存
缓存与数据库相关问题_第3张图片
缓存与数据库中初始值为10,线程2先更新数据库,将v=20,删除缓存,线程1此时抢占到cpu的使用权,开始查询缓存,未命中,查询数据库,值为20,写入缓存,最终缓存和数据库中的值都为20
缓存与数据库相关问题_第4张图片
缓存和数据库中初始值为10,线程1开始查询缓存,未命中(缓存里面的值有可能刚过期),查询数据库,查到的值为10,线程2此时进来,更新数据库,v=20,删除缓存,线程1抢占到cpu使用权,将查询到的10写入缓存。此时,数据库中为20,缓存里值为10,两者数据不一致(这种情况发生的可能性不高,1.查询缓存时,缓存刚好失效 2.线程1查询数据库准备写入缓存时,(写入缓存的操作是微秒级别的,很快的),刚好线程2过来进行更新操作(更新数据库的操作相对耗时))

你可能感兴趣的:(缓存,redis,java)