zoukankan      html  css  js  c++  java
  • 缓存预热和缓存穿透

    缓存穿透

    一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。总结为一句话:去查找的key在DB中不存在,每次都要去DB中查,给DB带来巨大的压力,这就是缓存穿透。

    如何避免 : 

    1.对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert了之后清理缓存。

    问题一:
    空值做了缓存,这样就无形了增加了很多没有意义的缓存,内存吃紧。比较有效的方式就是在这些值上面设置一个过期时间,让起自动删除,一般设置不超过5分钟
    问题二:
    有可能与业务存在不一致的窗口时间,如:虽然商品ID=10000现在不存在,我们现在在redis中保存了一个空值,但业务后来就真的有了商品id为10000的数据,这样数据库和缓存的信息就不一致,导致业务出现问题。此时就可以利用消息中间件等方式系统剔除掉此缓存数据

    2:采用布隆过滤器,对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

    缓存预热(热备份)

    当数据量级不大时,可以先开启数据库,当客户端访问的数据不在缓存中,就从数据库中将数据取出并存入缓存,这是可以的。但是,当数据量非常大时,但是初始时缓存中没有内容,假设启动服务器程序后,客户端发来大量的请求,由于缓存中没有内容,大量的请求将会导致服务器查询数据库,使得数据库被击垮。 因此,在程序开始之前,先将数据库中的一部分数据(一般指经常访问的数据、访问频率高的热数据)先存到缓存中,然后再开启程序进行服务。这就是缓存预热(热备份)。

  • 相关阅读:
    mkconfig文件里的"cat << EOF >> config.h"
    (ARM v7)信号量、互斥体代码追踪
    (ARM v7)自旋锁、读写锁、顺序锁代码追踪
    mac 系统上安装navicat
    git2consul配置管理工具使用教程
    Spring Cloud Feign如何上传文件
    spring-cloud feign的多参数传递方案
    Consul下载安装及运行教程
    比SecureCRT更好用的工具MobaXterm下载安装使用教程
    Linux下RocketMQ下载安装教程
  • 原文地址:https://www.cnblogs.com/yhq-qhh/p/10226769.html
Copyright © 2011-2022 走看看