缓存穿透及布隆过滤器

Redis的基于缓存,极大地提升了应用程序的性能和效率,特别是数据查询方面,但是也带来了一些问题,比如典型的

缓存穿透、缓存雪崩、缓存击穿。

本篇先讲缓存穿透及其解决办法。

(1)缓存穿透(大量查询一个不存在的key)定义

缓存穿透,是指查询一个数据库中不一定存在的数据;

正常使用缓存查询数据的流程是,依据key去查询value,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。

如果每次都查询一个不存在value的key,由于缓存中没有数据,所以每次都会去查询数据库;

当对key查询的并发请求量很大时,每次都访问DB,很可能对DB造成影响;

并且由于缓存不命中,每次都查询持久层,那么也失去了缓存的意义。

(2)解决方法

第一种是缓存层缓存空值

将数据库中的空值也缓存到缓存层中,这样查询该空值就不会再访问DB,而是直接在缓存层访问就行。

但是这样有个弊端就是缓存太多空值占用了更多的空间,可以通过给缓存层空值设立一个较短的过期时间来解决,例如60s。

第二种是布隆过滤器

将数据库中所有的查询条件,放入布隆过滤器中,

当一个查询请求过来时,先经过布隆过滤器进行查,如果判断请求查询值存在,则继续查;如果判断请求查询不存在,直接丢弃。

ps:布隆过滤器原理
原理就是一个对一个key进行k个hash算法获取k个值,在比特数组中将这k个值散列后设定为1,然后查的时候如果特定的这几个位置都为1,那么布隆过滤器判断该key存在。

布隆过滤器可能会误判,如果它说不存在那肯定不存在,如果它说存在,那数据有可能实际不存在;

Redis的bitmap只支持2^32大小,对应到内存也就是512MB,误判率万分之一,可以放下2亿左右的数据,性能高,空间占用率及小,省去了大量无效的数据库连接。

因此我们可以通过布隆过滤器,将Redis缓存穿透控制在一个可容范围内。

参考文章:

基于Redis的BloomFilter实战

层峦叠嶂——redis布隆过滤器

ps:布隆过滤器另一个用途——推荐去重
例如新闻客户端的推送去重功能,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。

实际上,如果历史记录存储在关系数据库里,去重就需要频繁地对数据库进行 exists 查询,当系统并发量很高时,数据库是很难扛住压力的。如果使用缓存把历史记录都放入缓存里,占用空间太大明显不现实,这个时候布隆过滤器就登场了,它就是专门用来解决这种去重问题的。它在起到去重的同时,在空间上还能节省 90% 以上,只是稍微有那么点不精确,也就是有一定的误判概率。

用户浏览记录存入数据库时,会在Filter上通过key的hash算法存储判断其是否存在,类似于数据存在数据库中,判断该数据是否存在的信息即元数据存放在BloomFilter中,避免了每次判断数据是否存在都要去数据库exist一遍;这样推送新闻时通过布隆过滤器判断,推送内容是否已经存在,如果存在则不推送,如果不存在则推送;

布隆过滤器可以准确过滤你已经看过的内容,没有看过的新内容,可能由于误判率过滤掉极小的一部分,这样就可以保证推荐给用户的都是无重复的。
原文链接:https://blog.csdn.net/wx1528159409/article/details/88357728

布隆过滤器避免redis缓存穿透相关推荐

  1. 清空缓存的命令_布隆过滤器应用——解决Redis缓存穿透问题

    1. 布隆过滤器 简要介绍布隆过滤器的概念和特点,详细知识请参考几篇参考文献或其它文章. 1.1 概念 简单点说,布隆过滤器本质是一个位数组. 当一个元素加入过滤器时,使用多个hash函数对元素求值, ...

  2. 解决Redis缓存穿透之布隆过滤器详解

    文章目录 1. 什么是Bloom Filter(布隆过滤器) 1.1 布隆过滤器优点 1.2 布隆过滤器缺点 1.3 布隆过滤器使用场景 1.4 布隆过滤器检索过程 1.5 布隆过滤器的算法描述 2. ...

  3. Redis 缓存穿透、缓存击穿和缓存雪崩

    目录 Redis 缓存穿透.缓存击穿和缓存雪崩 Redis 缓存穿透(查不到) Redis缓存穿透的解决方案 方案一:接口校验 方案二:缓存空对象 方案三:布隆过滤器 Redis 缓存击穿 Redis ...

  4. 布隆过滤器Redis缓存穿透雪崩击穿热点key

    目录 布隆过滤器 Redis 缓存 穿透 雪崩 击穿 热点KEY 布隆过滤器 布隆过滤器(判断某个key一定不存在) 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构 特点是高效地插入和查询, ...

  5. Bloom Filter布隆过滤器(解决redis缓存穿透)

    目录 1.什么是布隆过滤器: 2.用BitSet手写简单的布隆过滤器 3.redis中的缓存穿透 4.Redis中的布隆过滤器 4.1 RedisBloom 4.1.1直接编译进行安装 4.1.2使用 ...

  6. 二十七、Redis缓存穿透和雪崩(完)

    Redis缓存穿透和雪崩 一.服务的高可用问题 在这里我们不会详细的区分析解决方案的底层! Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中 ...

  7. Redis缓存穿透、击穿、雪崩及主从复制

    文章目录 Redis缓存穿透 概念 解决方案1-布隆过滤器 解决方案2-缓存空对象 缓存击穿 概念 解决方案1-热点数据永不过期 解决方案2-加互斥锁 缓存雪崩 概念 解决方案1-Redis高可用 解 ...

  8. Redis系列(二):Redis缓存穿透和缓存雪崩是什么?

    一.Redis穿透 缓存穿透现象:用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询.发现也没有,于是本次查询失败.当用户很多的时候,缓存都没有命中,于是都 ...

  9. Redis缓存穿透、击穿、雪崩来解释个明白

    随着用户的增长,用户的请求也越来越频繁,为了保证服务器在高并发的情况能正常提供服务,我们首先引入了缓存Redis,减少数据库的压力和数据的安全性同时提高了接口反应效率,解决了用户的请求直接与数据库建立 ...

最新文章

  1. NET::ERR_CACHE_MISS
  2. php先分组后排序,PHP数组分组排序实例代码
  3. linux sh 字符截取,shell字符截断
  4. Java SSH 集成框架开发中的错误解决
  5. 3.1.1 内存的基础知识
  6. Angular jasmine单元测试框架TestBed.inject的执行原理
  7. 最全的BAT大厂面试题整理,系列篇
  8. 需求、需求工程与需求工程师 — 1.定义、作用
  9. Java基础教程:Lambda表达式
  10. 01-操作数组的方法
  11. 使用cubemx工具的stm32用AT24C02实现简单密码(一点点面向对象的思想编程)
  12. 神经网络中经常使用的激活函数--sigmoid函数
  13. 博客线下推广的小技巧
  14. 【PS专题】PS钢笔压力有感叹号怎么消除
  15. Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Docker Duckling服务部署
  16. SQL的update语句
  17. 湘潭哪里学计算机编程,湘潭哪里学机器人编程?湘潭学机器人编程的学校有哪些?...
  18. SQL注入Cookie注入
  19. STM32蓝牙控制循迹避障小车源代码——4.蓝牙控制
  20. OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)

热门文章

  1. ASP.NET AJAX客户端编程之旅(二)——知其所以然
  2. 母根服务器对接 不准发信息,中国的母根服务器
  3. oracle hint禁用索引,【轉】Oracle索引HINT的使用
  4. Linux上装vscode需要认证,linux系统安装vscode方法 ubuntu等系统上部署VisualStudioCode
  5. oracle数据block默认是,oracleBLOCK(数据块)
  6. 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
  7. 计算机专业的校本教材,[中职计算机专业校本教材建设思路与实践]中职计算机专业课程...
  8. 十四、深入Python条件和循坏
  9. 怎样在Linux系统中编译,Linux操作系统如何编译程序?
  10. 可逆神经网络(Invertible Neural Networks)详细解析:让神经网络更加轻量化