redis之布隆过滤器
参考:https://blog.csdn.net/wx1528159409/article/details/88357728
背景:
布隆过滤器主要应用在redis缓存穿透的场景中(大量查询不存在的key,redis中不存在,就会将请求打到mysql之类的磁盘存储设备中,导致系统崩溃)
缓存穿透的解决方法
1.在redis中缓存空值,就是将空的key也缓存到redis中,但是会占用空间
2.使用布隆过滤器,将全部的有效数据都走一遍布隆过滤器,这样新来请求时,先走一遍请求的元素是否能通过布隆过滤器的验证,若未通过就直接放弃请求,若通过再执行查询
注意:布隆过滤器可能误判,即使元素通过布隆过滤器的拦截,也可能是无效请求,布隆过滤器只是可以大大降低无效请求的概率
布隆过滤器原理:
原理就是对一个key进行k个hash算法获取k个值,在比特数组中将这k个值散列后设定为1,然后查的时候如果特定的这几个位置都为1,那么布隆过滤器判断该key存在。
布隆过滤器可能会误判,如果它说不存在那肯定不存在,如果它说存在,那数据有可能实际不存在;
Redis的bitmap只支持2^32大小,对应到内存也就是512MB,误判率万分之一,可以放下2亿左右的数据,性能高,空间占用率极小,省去了大量无效的数据库连接。
因此我们可以通过布隆过滤器,将Redis缓存穿透控制在一个可容范围内。
ps:布隆过滤器另一个用途——推荐去重
例如新闻客户端的推送去重功能,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。
实际上,如果历史记录存储在关系数据库里,去重就需要频繁地对数据库进行 exists 查询,当系统并发量很高时,数据库是很难扛住压力的。如果使用缓存把历史记录都放入缓存里,占用空间太大明显不现实,这个时候布隆过滤器就登场了,它就是专门用来解决这种去重问题的。它在起到去重的同时,在空间上还能节省 90% 以上,只是稍微有那么点不精确,也就是有一定的误判概率。
用户浏览记录存入数据库时,会在Filter上通过key的hash算法存储判断其是否存在,类似于数据存在数据库中,判断该数据是否存在的信息即元数据存放在BloomFilter中,避免了每次判断数据是否存在都要去数据库exist一遍;这样推送新闻时通过布隆过滤器判断,推送内容是否已经存在,如果存在则不推送,如果不存在则推送;
布隆过滤器可以准确过滤你已经看过的内容,没有看过的新内容,可能由于误判率过滤掉极小的一部分,这样就可以保证推荐给用户的都是无重复的。
浙公网安备 33010602011771号