先删缓存还是先更新缓存
目录
1.最经典的缓存+数据库读写的模式,cache aside pattern
1.1、Cache Aside Pattern
(1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应
(2)更新的时候,先删除缓存,然后再更新数据库
1.2、为什么是删除缓存,而不是更新缓存呢?
(1)、如果写数据库的值与更新到缓存值是一样的,不需要经过任何的计算,可以马上更新缓存,但是如果对于那种写数据频繁而读数据少的场景并不合适这种解决方案,因为也许还没有查询就被删除或修改了,这样会浪费时间和资源
(2)、如果写数据库的值与更新缓存的值不一致,写入缓存中的数据需要经过几个表的关联计算后得到的结果插入缓存中,那就没有必要马上更新缓存,只要删除缓存即可,等到查询的时候在去把计算后得到的结果插入到缓存中即可。其实删除缓存,而不是更新缓存,就是一个lazy计算的思想。
1.3、先删除缓存,再更新数据库 && 先更新数据库,再删除缓存的比较
第一种方案的分析见2.1和2.2
下面讨论第二种方案,该设计模式产生双写不一致的可能情况:
①一个是读操作,但是没有命中缓存,然后就到数据库中取数据,此时来了一个写操作,写完数据库后,让缓存失效,然后,之前的那个读操作再把老的数据放进去,所以,会造成脏数据。
该情况出现的概率可能非常低,因为这个条件需要发生在读缓存时缓存失效,而且并发着有一个写操作。而实际上数据库的写操作会比读操作慢得多,而且还要锁表,而读操作必需在写操作前进入数据库操作,而又要晚于写操作更新缓存,所有的这些条件都具备的概率基本并不大。
②删除缓存失败