您当前的位置:首页 > 电脑百科 > 数据库 > Redis

Redis穿透的解决方法—布隆过滤器

时间:2020-01-17 10:12:43  来源:  作者:

redis概述:

Redis是一个开源的Key-Value存储系统,其中Value支持String、list、set、hash、zset五种数据结构,这些数据都支持push/pop、add/remove、取交集并集、排序等丰富的操作,并且这些操作都是原子性的。

与同为NoSQL型缓存数据库的memcached类似,Redis的数据都存在内存中,数据的运算都在内存中进行,不会发生IO,这也是Redis为什么这么快的一个原因;区别是Redis具备持久化方式,会周期性的把更新的数据写入磁盘(RDB)或者把修改操作追加写入记录文件中(AOF)。

也就是说,Redis的数据存放在内存中,但Redis也支持持久化将数据存入磁盘或文件。

Redis是单线程的,但是多任务并发时可以开启多个Redis,并且Redis支持主从同步,避免了宕机带来的影响,以及写时同步技术实现了数据读写分离(主机负责写入、从机负责读取)。

ps:Redis的特点是单线程+多路IO复用

 

Redis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那么就不能使用缓存。

另外的一些典型问题就是,缓存穿透、缓存雪崩和缓存击穿。目前,业界也都有比较流行的解决方案。本篇文章,来给大家讲解一下Redis穿透的解决方法—布隆过滤器

缓存穿透

缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。

Redis穿透的解决方法—布隆过滤器

 

代码流程

  1. 参数传入对象主键ID
  2. 根据key从缓存中获取对象
  3. 如果对象不为空,直接返回
  4. 如果对象为空,进行数据库查询
  5. 如果从数据库查询出的对象不为空,则放入缓存(设定过期时间)

想象一下这个情况,如果传入的参数为-1,会是怎么样?这个-1,就是一定不存在的对象。就会每次都去查询数据库,而每次查询都是空,每次又都不会进行缓存。假如有恶意攻击,就可以利用这个漏洞,对数据库造成压力,甚至压垮数据库。即便是采用UUID,也是很容易找到一个不存在的KEY,进行攻击。

布隆过滤器(Bloom Filter)

它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

Redis穿透的解决方法—布隆过滤器

 

布隆过滤器解决方法:

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

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

布隆过滤器原理

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

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

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

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

 

Redis穿透的解决方法—布隆过滤器

 



Tags:Redis   点击:()  评论:()
声明:本站部分内容来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除,谢谢。
▌相关评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
▌相关推荐
Redis定位在"快",MongoDB定位在"灵活",HBase定位于"大"。在一般使用情况下,MongoDB可以当作简单场景下的但是性能高数倍的MySQL,Redis基本只会用来做缓存,HBase用来存储海量数据...【详细内容】
2020-11-11   Redis  点击:(2)  评论:(0)  加入收藏
前言在这里我们先回忆一下普通链表的时间复杂度,可以看到除了 look up 操作是 O(n) 的,其他操作都是 O(1) 的时间复杂度。也就是说你需要随机访问里面的任何一个元素的话,它的...【详细内容】
2020-11-10   Redis  点击:(1)  评论:(0)  加入收藏
前言首发公众号:bigsai 头条号:程序员bigsai 还请关注、一键三连!对于Web来说,用户量和访问量在一定程度上推动项目技术和架构的更迭和进步。可能会有以下的一些状况: 页面并发量...【详细内容】
2020-11-10   Redis  点击:(1)  评论:(0)  加入收藏
应用场景分布式系统中,面对高并发场景,又对数据一致性有一定要求的情况下,使用分布式锁。例如商城中下单扣库存这种情况。解决方案基于数据库例如:select * from mall_spu where...【详细内容】
2020-11-09   Redis  点击:(2)  评论:(0)  加入收藏
简介Redis Cluster是Redis官方的一个高可用分布式解决方案,其优点是高可用,缺点是不能保证数据强一致。在这里使用docker容器来搭建一套6节点(3主,3从)Redis-Cluster集群环境。环...【详细内容】
2020-10-22   Redis  点击:(7)  评论:(0)  加入收藏
Redis 是互联网技术架构在存储系统中使用最为广泛的中间件,它也是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一,特别是那些优秀的、竞争激烈的大型互联网公司(比如...【详细内容】
2020-10-22   Redis  点击:(2)  评论:(0)  加入收藏
Redis集群详解Redis有三种集群模式,分别是:* 主从模式 * Sentinel模式 * Cluster模式三种集群模式各有特点,关于Redis介绍可以参考这里:NoSQL(二)——RedisRedis官网:ht...【详细内容】
2020-10-17   Redis  点击:(3)  评论:(0)  加入收藏
分布式缓存是分布式系统中的重要组件,主要解决高并发、大数据场景下,热点数据访问的性能问题,提供高性能的数据快速访问。使用缓存常见场景是:项目中部分数据访问比较频繁,对下游...【详细内容】
2020-10-15   Redis  点击:(9)  评论:(0)  加入收藏
写这篇的时候,相信有很多朋友还在用Jedis作为Redis的客户端,我不禁有很多问号,Jedis还香吗?如果你早些年说它香我信,但是都2020年了,它真的不那么香了。那为什么还继续使用它呢?大...【详细内容】
2020-10-12   Redis  点击:(6)  评论:(0)  加入收藏
大家都知道,Redis Desktop Manager 是一款非常好用的 Redis 可视化客户端工具,但可惜的是 v0.9.4 版本之后需要收费了: 这个工具不再免费提供安装包了,要对所有安装包收费,收费还...【详细内容】
2020-09-29   Redis  点击:(8)  评论:(0)  加入收藏
在之前的文章中,我曾介绍过好几个Redis的可视化管理客户端,像国产的RedisView、WebRedisManager以及一个官方收费的RedisDesktopManager,这几个不管是从颜值还是功能可能都有...【详细内容】
2020-09-28   Redis  点击:(12)  评论:(0)  加入收藏
SDS(simple dynamic string)是Redis提供的字符串的封装,在redis中也是存在最广泛的数据结构,它也是很多其他数据结构的基础,所以才选择先介绍SDS。 SDS也兼容部分C字符串API(st...【详细内容】
2020-09-27   Redis  点击:(10)  评论:(0)  加入收藏
分布式锁使用场景现在的系统都是集群部署,每个服务都不是单节点的了。比如库存服务,可能部署到3台机器上分别命名为节点1,节点2,节点3。库存服务需要扣减库存,扣减库存肯定需要锁...【详细内容】
2020-09-27   Redis  点击:(4)  评论:(0)  加入收藏
简介RediSearch是一个高性能的全文搜索引擎,可作为一个Redis Module 运行在Redis上,是由RedisLabs团队开发的。 更新内容RediSearch 2.0.0 的 GA 版本现已发布,此版本在 RediSe...【详细内容】
2020-09-21   Redis  点击:(6)  评论:(0)  加入收藏
1 命令行不知道大家在日常操作redis时用什么可视化工具呢?以前总觉得没有什么太好的可视化工具,于是问了一个业内朋友。对方回:你还用可视化工具?直接命令行呀,redis提供了这么多...【详细内容】
2020-09-17   Redis  点击:(5)  评论:(0)  加入收藏
【51CTO.com原创稿件】今天在容器环境发布服务,我发誓我就加了一行日志,在点击发布按钮后,我悠闲地掏出泡着枸杞的保温杯,准备来一口老年人大保健...... 图片来自 Pexels正当我...【详细内容】
2020-09-08   Redis  点击:(10)  评论:(0)  加入收藏
redis没有实现访问控制这个功能,但是它提供了一个轻量级的认证方式,可以编辑redis.conf配置来启用认证。1、初始化Redis密码:在配置文件中有个参数: requirepass 这个就是配置re...【详细内容】
2020-09-03   Redis  点击:(4)  评论:(0)  加入收藏
背景在查询类开发中我们有使用缓存的场景,一般可以使用Redis作为缓存,来缓解数据库如MySQL的压力。使用缓存的步骤为:“(1)从Redis缓存中获取数据,如果存在数据,直接返回值。(2)如果...【详细内容】
2020-08-28   Redis  点击:(1)  评论:(0)  加入收藏
本文转至Java架构日记前言Grafana是一个著名的、广泛应用的开源应用监控工具。现在,新的Redis Data Source for Grafana[1]插件可以和Redis一起使用了!有了这个新功能,DevOps...【详细内容】
2020-08-27   Redis  点击:(30)  评论:(0)  加入收藏
大家在使用redis时,是直接使用命令行还是使用可视化工具呢?对于大神来说可能直接用命令行飞快的敲打着键盘,看似电影中黑客疯狂的砸键盘的动作,菜鸟看似不合理的命令居然能显示...【详细内容】
2020-08-27   Redis  点击:(17)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条