zoukankan      html  css  js  c++  java
  • 缓存知识点

    概述

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

    缓冲四种模式

    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
  • 相关阅读:
    html-webpack-plugin & clean-webpack-plugin
    Using webpack-dev-server
    Using Watch Mode
    webpack中devtool的配置方案[开发模式]---[线上模式]
    linux命令系列-mv(移动-重命名)
    洗牌函数[打乱数组的顺序] slice()的新运用 [原来arr.slice(start, end) 的start不是必需的]
    Currency Exchange (POJ1860)(判断正圈)(spfa) 最短路专题
    PTA L3-020 至多删三个字符 (DP) (天梯赛训练)
    Codeforces Round #658 (Div. 2)(D. Unmerge)
    Codeforces Round #656 (Div. 3) (E. Directing Edges)(拓扑排序)
  • 原文地址:https://www.cnblogs.com/Benjious/p/12108676.html
Copyright © 2011-2022 走看看