缓存知识点

概述

酷壳关于缓存的文章中提到 先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。 这一点主要是因为并发而导致的,我们来看一下还有那些方式更好地处理缓存。

缓冲四种模式

Cache Aside

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

ReadThrough

Read Through 和上面大致相同,不同的是失效后,客户端“从数据库中取数据,成功后,放到缓存中”这步操作由服务器来完成,

Write Through

Write Through 则是当更新数据时,先去缓冲中找是否有该数据,没有则直接更新数据库,然后返回。如果该数据存在缓存,则更新缓存,然后再由Cache自己更新数据库(这是一个同步操作)。图例如下 :

1297993-20191227154218675-193340632.png

Write Behind Caching

Write Behind 又叫 Write Back 。和我们的操作系统中的磁盘加载到内存,然后对数据进行更改的方式相同,将某个 page 标识为 dirty (脏页),当一定的时候进行回刷。

1297993-20191227154615686-1701638129.png

缓存一致性

缓存和持久化数据是否一致。

缓存穿透

缓存穿透的场景是查询一个根本不存在的数据,缓存不存在,数据库也不存在,这种情况下缓存没什么作用,当请求量大的时候,所有的请求都到了数据库,假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。 解决的方法

  • 将不存在的数据也存到缓存中去,设置失效时间短点
  • 布隆过滤器,相关知识将参考资料

缓存雪崩

缓存雪崩,是指在某一个时间段,缓存集中过期失效。 例如以下的例子

  • 双十一当晚某商城某些热卖商品加载进缓存,1点活动结束,缓存失效,之后的请求全部不命中,数据库查询陡增。
  • 缓存服务器某个节点宕机或断网。 解决方案 :
  • 设置较长的过期时间

缓存击穿

缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。 例如某个电商项目,某个商品成为“爆款”。

热点数据集中失效

参考资料

  • https://coolshell.cn/articles/17416.html
  • https://www.jianshu.com/p/2104d11ee0a2
  • https://hackernoon.com/probabilistic-data-structures-bloom-filter-5374112a7832
posted @ 2019-12-27 17:45  float123  阅读(205)  评论(0编辑  收藏  举报