缓存使用总结


以下只是个人工作中的一点总结,如有问题欢迎指正。
1.delete操作时,先删数据库还是先删缓存?

一般情况下应该先删除数据库。原因: 如果先删缓存,在删完缓存之后删数据库之前,另一个读请求可能将数据库里的数据读出并写到缓存,造成缓存和数据库不一致(数据库里的被删除了,缓存里还有一份)。如果没有超时设置,数据库中被删除的数据在缓存中一直存在。

A先删除数据,紧接着B获取该条数据,可能发生的执行顺序


A删除缓存;

A删除数据库;

B读数据库(返回null);

B写缓存(写的也是空数据,防止缓存穿透);

如果按照以上的顺序,是不会有问题的。但是如果是下面这种顺序,就会出问题

A删除缓存;

B读数据库;

B写缓存;

A删除数据库;

当然,以上讨论的是删缓存和删数据库这两步操作都能成功的前提下。下面简单考虑删除操作可能失败的情况:

如果先删数据库成功后,删缓存失败了,会造成数据库和缓存数据不一致(如果缓存设置有超时时间,会达到最终一致)。

如果是采用先删缓存的方案,缓存删除成功,但是数据库删除失败,读请求会将数据库的数据重新写缓存,不会有数据不一致的情况。

2.update操作时,应该删除缓存还是更新缓存?应该先操作数据库还是先操作缓存?

先给结论: 应该先操作数据库,然后删除缓存。

归纳一下,一共有四种可能的方案:

(1)、先删除缓存,然后更新数据库

缓存删除后,更新数据库前,数据库的旧数据可能会被其他请求写到缓存。

(2)、先更新数据库,然后更新缓存

假如A进行更新操作,B紧接着对同一数据进行更新,最终结果应该以后一次操作为准。然而可能发生的操作顺序是

A更新数据库;
B更新数据库;
B更新缓存;
A更新缓存;

这时数据库和缓存出现不一致,缓存的是A更新的数据(脏数据),数据库中是B更新的数据。

(3)、先更新缓存,然后更新数据库

如果缓存更新成功,数据库更新失败,会造成数据不一致。可能想到的解决方法之一就是在数据库更新失败时,删掉更新的缓存,然而依然无法避免数据库还未更新,更新的缓存就被其他请求读取的问题,因此不考虑该方案。

(4)、先更新数据库,然后删除缓存

相对来说比较合适的方案。

综合以上,删除和更新时,应该首先操作数据库,然后操作缓存。当然如果并发请求不大的情况下,操作顺序的不同一般是不会出现问题的(并发量低还用缓存干啥呢=。=

3. create操作时,应该操作缓存吗

为了防止缓存穿透,在读数据库里不存在的数据时,也需要写缓存。比如读取id为10的用户信息,但是目前没有该用户,那么缓存里存一份key为10,value为空的数据。但是create操作后,id为10的数据可能就有了,为了保证数据一致性,在create操作成功后,删除(或更新)对应key的缓存。


猜你喜欢

转载自blog.csdn.net/mrokayan/article/details/80987233