zoukankan      html  css  js  c++  java
  • 缓存穿透、缓存击穿、缓存雪崩

    常用的缓存处理流程:

    客户端发起请求,服务器端从缓存获取,获取到则返回,如果没有则从数据库获取,然后存放到缓存,最后返回结果,如果依旧没有则返回空。

    缓存穿透:

    缓存和数据库中均没有数据,但是客户端不断发起请求,会导致这些请求直接打到数据库上,导致数据压力增高。

    可以设置空置,如果数据库获取不到的缓存,存储key-null,超期时间设置60s或者根据业务设定其他时间。

    如果某些业务场景,有些key是永远不会存在的,是恶意访问。可以使用bitmap记录key是否存在,例如使用布隆过滤器。

    缓存击穿:

    由于缓存到期被清理,用户并发较多的时候,导致这个时间的请求打到数据库,引起数据库短时间压力增大。

    热点数据永不过期。

    使用分布式锁,redis使用setIfAbsent,如果获取到锁,从数据库获取,然后刷新缓存,返回值,没有获取到锁,等待100ms,重新从redis获取值,没有值就获取锁,最多重试3次,依旧没有获取成功则返回空。

    缓存雪崩:

    缓存中大批量数据到期,由于查询量巨大,导致这些查询短时间打到了数据库上,使得数据库压力过大。

    缓存数据的过期时间随机分布,尽量避免同时大量数据失效。

    热点数据设置永久有效。

  • 相关阅读:
    使 Inno Setup 打包出的安装程序以管理员身份运行
    SQL SERVER 数据库被标记为“可疑”的解决办法
    SQL SERVER 查看数据库信息
    【转】如何正确地处理时间
    如何获取 XAML 控件的模板代码
    Asp.Net MVC 把PartialView、View转换成字符串
    表达式树在LINQ动态查询
    ASP.NET MVC5 实现分页查询
    WPF
    正则表达式定义
  • 原文地址:https://www.cnblogs.com/avalon-merlin/p/9268072.html
Copyright © 2011-2022 走看看