秒杀(5)——缓存更新套路(数据不一致)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaojie_570/article/details/87611564

一、缓存更新存在的问题

在更新缓存数据代码的时候,如果使用:先删除缓存,然后再更新数据库,最后将数据再装在的缓存中这样的方式,会出现问题。会出现什么问题呢?假设:两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存之后,查询操作没有命中缓存,然后把老数据读出来之后放在了缓存中,然后更新操作更新了数据库。这个时候,在缓存中的数据还是老的数据,以后有查询操作进行查询的时候,缓存中就一直是这个脏数据。

我们先来了解一下更新缓存的现存的四种策略:

  • Cache Aside Pattern
  • Read Through Pattern’
  • Write Through Pattern
  • Write Behind caching

二、 Cache Aside Pattern

这是缓存中最长使用的一个模式。

  • 失效:应用程序先从 cache 中取出数据,没有得到,则从数据库中取数据,成功取出后,放到缓存中。
  • 命中:应用程序从cache 中取出数据,取到后返回。
  • 更新:先把数据存到数据库中,成功之后,再让缓存失效。

三、Read Through

Read Through 就是在查询操作中更新缓存,即,当缓存失效的时候(过期或者 LRU 换出),Cache Aside 是由调用方负责把数据加载到缓存,而Read Through 则用缓存服务自己来加载,从而对应用方是透明的。

四、Write Through

Write Through 是在更新数据的时候发生。当有数据更新的时候,如果没有命中缓存,则直接更新数据库,然后返回。如果命中了缓存,则更新缓存,然后在由缓存自己更新数据库(这是一个同步操作)

五、Write Behind Caching Pattern

在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。这个设计的好处就是让数据的 I/O 操作很快(因为直接操作的是内存),因为异步,所以 write backg 还可以合并对同一个数据的多次操作,所以性能的提高是非常可观的。

秒杀的例子

我们将热点对象放到缓存之后,可能会涉及到缓存中的对象的部分字段被修改的问题,这个时候,修改后的对象与缓存的对象就会出现数据不一致的问题。

解决这个问题的方法就是使用上面讲到的 :Cache Aside Pattern

在这里插入图片描述

参考并感谢

https://blog.csdn.net/tTU1EvLDeLFq5btqiK/article/details/78693323

猜你喜欢

转载自blog.csdn.net/xiaojie_570/article/details/87611564