zoukankan      html  css  js  c++  java
  • redis缓存穿透

    缓存穿透:从缓存中查询不到所需数据,而不得不从后端系统查询的情况。

    少量不可避免的缓存穿透对系统是没有损害的,理由如下:

    1>互联网系统通常会面临大数据的考验,而缓存穿透在容量上是有限的,不可能存储系统的所有数据,那么在查询未缓存数据的时候就会发生穿透。

    2>互联网的访问模型一般会遵从"80/20"的原则。简单书,在一组事物中,最重要的部分只占20%,而其他的80%没那么重要,把它应用到数据访问的领域,就是我们会经常访问20%的热点数据。

    缺点:最大的问题在于数据库中并不存在用户的数据,无论查询多少次,都会造成穿透。

    缓存穿透的解决方案:

    回种空值或者使用布隆过滤器

    回种空值方案:

    当从数据库查询到空值或者返回异常时,我们向缓存中回种一个空值,单因为空值并不是一个准确的业务数据,并且会占用缓存的空间,所以我们会给这个空值加一个比较短的过期时间,让空值在短时间内能够快速过期淘汰。

    回种空值虽然能够抵挡大量请求的穿透,但是如果有大量获取未注册用户信息的请求,缓存内就会有大量的空值缓存,造成缓存的空间浪费。缓存空间被占满了,还会剔除掉一些已经被缓存的用户信息,反而会导致缓存的命中率下降。

    布隆过滤器方案:

    把集合中的每一个值按照提供的hash算法算出对应的hash值,然后将hash值对数组长度取模后得到需要计入数组的索引值,并将这个数组的位置的值由0改为1。在判断一个元素是否存在于这个集合时,只需要将这个值按照相同的算法计算出索引值,如果这个位置的值为1就认为这个元素在集合中,否则不存在。

    俩个缺陷:

    1>hash算法会存在一定的碰撞机率

    2>不支持元素的删除

  • 相关阅读:
    c++错误崩溃3
    c++崩溃错误2
    c++多线程崩溃错误1
    MySQL UNSIGNED
    2PC和3PC
    proxy-target-class="false"与proxy-target-class="true"区别
    Spring MVC processing flow
    Spring中自动装配的模式
    Spring中BeanFactory和ApplicationContext的区别
    什么是Spring
  • 原文地址:https://www.cnblogs.com/byfboke/p/13786401.html
Copyright © 2011-2022 走看看