Redis去重的方法有哪些

69次阅读
没有评论

共计 2012 个字符,预计需要花费 6 分钟才能阅读完成。

本篇内容主要讲解“Redis 去重的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“Redis 去重的方法有哪些”吧!

唯一计数是网站系统中十分常见的一个功能特性,例如网站需要统计每天访问的人数 unique visitor(也就是 UV)。计数问题很常见,但解决起来可能十分复杂:一是需要计数的量可能很大,比如大型的站点每天有数百万的人访问,数据量相当大;二是通常还希望扩展计数的维度,比如除了需要每天的 UV,还想知道每周或每月的 UV,这样导致计算十分复杂。

在关系数据库存储的系统里,实现唯一计数的方法就是 select count(distinct item_id),它十分简单,但是如果数据量很大,这个语句执行是很慢的。用关系数据库另外一个问题是插入数据性能也不高。

Redis 解决这类计数问题得心应手,相比关系数据库速度更快,消耗资源更少,甚至提供了 3 种不同的方法。

1. 基于 set

Redis 的 set 用于保存唯一的数据集合,通过它可以快速判断某一个元素是否存在于集合中,也可以快速计算某一个集合的元素个数,另外和可以合并集合到一个新的集合中。涉及的命令如下:

复制代码 代码如下:

SISMEMBER key member #  判断  member  是否存在
SADD key member #  往集合中加入  member
SCARD key #  获取集合元素个数 

基于 set 的方法简单有效,计数精确,适用面广,易于理解,它的缺点是消耗资源比较大(当然比起关系数据库是少很多的),如果元素个数很大(比如上亿的计数),消耗内存很恐怖。

2. 基于 bit

Redis 的 bit 可以用于实现比 set 内存高度压缩的计数,它通过一个 bit 1 或 0 来存储某个元素是否存在信息。例如网站唯一访客计数,可以把 user_id 作为 bit 的偏移量 offset,设置为 1 表示有访问,使用 1 MB 的空间就可以存放 800 多万用户的一天访问计数情况。涉及的命令如下:
复制代码 代码如下:

SETBIT key offset value #  设置位信息
GETBIT key offset #  获取位信息
BITCOUNT key [start end] #  计数
BITOP operation destkey key [key ...] #  位图合并 

基于 bit 的方法比起 set 空间消耗小得多,但是它要求元素能否简单映射为位偏移,适用面窄了不少,另外它消耗的空间取决于最大偏移量,和计数值无关,如果最大偏移量很大,消耗内存也相当可观。

3. 基于 HyperLogLog

实现超大数据量精确的唯一计数都是比较困难的,但是如果只是近似的话,计算科学里有很多高效的算法,其中 HyperLogLog Counting 就是其中非常著名的算法,它可以仅仅使用 12 k 左右的内存,实现上亿的唯一计数,而且误差控制在百分之一左右。涉及的命令如下:
复制代码 代码如下:

PFADD key element [element ...] #  加入元素
PFCOUNT key [key ...] #  计数 

这种计数方法真的很神奇,其中涉及到统计学中的一些均匀分布、随机概率、伯努利分布等,我也没有彻底弄明白,有兴趣可以深入研究相关文章。

redis 提供的这三种唯一计数方式各有优劣,可以充分满足不同情况下的计数要求。

4. 基于 bloomfilter

BloomFilter 是利用类似位图或者位集合数据结构来存储数据,利用位数组来简洁的表示一个集合,并且能够快速的判断一个元素是不是已经存在于这个集合。虽然 BloomFilter 不是 100% 准确,但是可以通过调节参数,使用 Hash 函数的个数,位数组的大小来降低失误率。这样调节完全可以把失误率降低到接近于 0。可以满足大部分场景了。

假如此时有一个集合 S = {x1, x2, … xn},Bloom Filter 使用 k 个独立的 hash 函数,分别将集合中的每一个元素映射到{1,…,m}的范围。对于任何一个元素,被映射到的数字作为对应的位数组的索引,该位会被置为 1。比如元素 x1 被 hash 函数映射到数字 8,那么位数组的第 8 位就会被置为 1。下图中集合 S 只有两个元素 x 和 y,分别被 3 个 hash 函数进行映射,映射到的位置分别为(0,3,6)和(4,7,10),对应的位会被置为 1:

现在假如要判断另一个元素是否是在此集合中,只需要被这 3 个 hash 函数进行映射,查看对应的位置是否有 0 存在,如果有的话,表示此元素肯定不存在于这个集合,否则有可能存在。

redis 使用布隆过滤器需要安装插件:https://blog.csdn.net/u013030276/article/details/88350641。

到此,相信大家对“Redis 去重的方法有哪些”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-24发表,共计2012字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)