布隆过滤器避免redis缓存穿透
缓存穿透及布隆过滤器
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缓存穿透相关推荐
- 清空缓存的命令_布隆过滤器应用——解决Redis缓存穿透问题
1. 布隆过滤器 简要介绍布隆过滤器的概念和特点,详细知识请参考几篇参考文献或其它文章. 1.1 概念 简单点说,布隆过滤器本质是一个位数组. 当一个元素加入过滤器时,使用多个hash函数对元素求值, ...
- 解决Redis缓存穿透之布隆过滤器详解
文章目录 1. 什么是Bloom Filter(布隆过滤器) 1.1 布隆过滤器优点 1.2 布隆过滤器缺点 1.3 布隆过滤器使用场景 1.4 布隆过滤器检索过程 1.5 布隆过滤器的算法描述 2. ...
- Redis 缓存穿透、缓存击穿和缓存雪崩
目录 Redis 缓存穿透.缓存击穿和缓存雪崩 Redis 缓存穿透(查不到) Redis缓存穿透的解决方案 方案一:接口校验 方案二:缓存空对象 方案三:布隆过滤器 Redis 缓存击穿 Redis ...
- 布隆过滤器Redis缓存穿透雪崩击穿热点key
目录 布隆过滤器 Redis 缓存 穿透 雪崩 击穿 热点KEY 布隆过滤器 布隆过滤器(判断某个key一定不存在) 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构 特点是高效地插入和查询, ...
- Bloom Filter布隆过滤器(解决redis缓存穿透)
目录 1.什么是布隆过滤器: 2.用BitSet手写简单的布隆过滤器 3.redis中的缓存穿透 4.Redis中的布隆过滤器 4.1 RedisBloom 4.1.1直接编译进行安装 4.1.2使用 ...
- 二十七、Redis缓存穿透和雪崩(完)
Redis缓存穿透和雪崩 一.服务的高可用问题 在这里我们不会详细的区分析解决方案的底层! Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面.但同时,它也带来了一些问题.其中 ...
- Redis缓存穿透、击穿、雪崩及主从复制
文章目录 Redis缓存穿透 概念 解决方案1-布隆过滤器 解决方案2-缓存空对象 缓存击穿 概念 解决方案1-热点数据永不过期 解决方案2-加互斥锁 缓存雪崩 概念 解决方案1-Redis高可用 解 ...
- Redis系列(二):Redis缓存穿透和缓存雪崩是什么?
一.Redis穿透 缓存穿透现象:用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询.发现也没有,于是本次查询失败.当用户很多的时候,缓存都没有命中,于是都 ...
- Redis缓存穿透、击穿、雪崩来解释个明白
随着用户的增长,用户的请求也越来越频繁,为了保证服务器在高并发的情况能正常提供服务,我们首先引入了缓存Redis,减少数据库的压力和数据的安全性同时提高了接口反应效率,解决了用户的请求直接与数据库建立 ...
最新文章
- NET::ERR_CACHE_MISS
- php先分组后排序,PHP数组分组排序实例代码
- linux sh 字符截取,shell字符截断
- Java SSH 集成框架开发中的错误解决
- 3.1.1 内存的基础知识
- Angular jasmine单元测试框架TestBed.inject的执行原理
- 最全的BAT大厂面试题整理,系列篇
- 需求、需求工程与需求工程师 — 1.定义、作用
- Java基础教程:Lambda表达式
- 01-操作数组的方法
- 使用cubemx工具的stm32用AT24C02实现简单密码(一点点面向对象的思想编程)
- 神经网络中经常使用的激活函数--sigmoid函数
- 博客线下推广的小技巧
- 【PS专题】PS钢笔压力有感叹号怎么消除
- Rasa课程、Rasa培训、Rasa面试、Rasa实战系列之Docker Duckling服务部署
- SQL的update语句
- 湘潭哪里学计算机编程,湘潭哪里学机器人编程?湘潭学机器人编程的学校有哪些?...
- SQL注入Cookie注入
- STM32蓝牙控制循迹避障小车源代码——4.蓝牙控制
- OpenCV 4.5.1 - 新版本 中 BEBLID 描述符尝鲜 (基于 ubuntu / c++)
热门文章
- ASP.NET AJAX客户端编程之旅(二)——知其所以然
- 母根服务器对接 不准发信息,中国的母根服务器
- oracle hint禁用索引,【轉】Oracle索引HINT的使用
- Linux上装vscode需要认证,linux系统安装vscode方法 ubuntu等系统上部署VisualStudioCode
- oracle数据block默认是,oracleBLOCK(数据块)
- 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
- 计算机专业的校本教材,[中职计算机专业校本教材建设思路与实践]中职计算机专业课程...
- 十四、深入Python条件和循坏
- 怎样在Linux系统中编译,Linux操作系统如何编译程序?
- 可逆神经网络(Invertible Neural Networks)详细解析:让神经网络更加轻量化