Redis怎么进行去重?4种去重方法浅析

redis怎么进行去重?下面本篇文章给大家介绍一下redis去重的4种方法,希望对大家有所帮助!

Redis怎么进行去重?4种去重方法浅析

这篇文章主要介绍了Redis实现唯一计数的3种方法分享,本文讲解了基于SET、基于 bit、基于 HyperLogLog三种方法,需要的朋友可以参考下

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

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

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

1.基于 set

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

复制代码 代码如下:

SISMEMBER key member  # 判断 member 是否存在SADD key member  # 往集合中加入 memberSCARD 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:

1.png

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

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

更多编程相关知识,请访问:编程入门!!

以上就是Redis怎么进行去重?4种去重方法浅析的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2039828.html

(0)
上一篇 2025年2月24日 00:05:52
下一篇 2025年2月18日 09:31:52

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 浅析Redis中AOF的原理和缺点

    本篇文章带大家了解一下redis持久化中的aof,介绍一下aof原理、aof缺点,希望对大家有所帮助! AOF 上文我们提到了rRedis中的一种持久化方式就是RDB 此文我们来讲另一种实现方式那就是AOF AOF是通过只记录Redis写入…

    2025年2月24日
    200
  • redis中分布式session不一致性怎么办

    分布式session不一致性怎么办?下面本篇文章给大家介绍一下redis中分布式session不一致性的解决方案,希望对大家有所帮助! 分布式session不一致性解决方案 一、Session有什么作用? Session 是客户端与服务器通…

    2025年2月24日 数据库
    200
  • Redis中什么是慢查询、订阅模式

    本篇文章给大家介绍一下redis中的慢查询和订阅模式,希望对大家有所帮助! 慢查询 慢查询日志就是系统在命令执行时每条命令的执行时间,当超过阀值,就将这条命令记录下来。【相关推荐:Redis视频教程】 Redis命令执行流程 发送命令 命令…

    2025年2月24日 数据库
    200
  • 深入了解Redis中的主从同步机制

    本篇文章带大家了解一下redis中的主从同步,介绍一下redis主从的两种结构模型、主从关系的建立、主从复制策略等,希望对大家有所帮助! 之前的文章中详细分析了redis的特性和核心原理,从本篇开始将对redis的部署结构和运行模式进行分析…

    2025年2月24日 数据库
    200
  • 浅析Python中怎么用Redis

    python中怎么用redis?下面本篇文章给大家介绍一下python使用redis的方法,希望对大家有所帮助! 前面我们都是使用 Redis 客户端对 Redis 进行使用的,但是实际工作中,我们大多数情况下都是通过代码来使用 Redis…

    2025年2月24日 数据库
    200
  • 深入聊聊Redis中的5种基本数据类型

    本篇文章带大家详细了解一下redis中的5种基本数据类型(string字符串、list列表、set集合、hash散列、zset有序集合),希望对大家有所帮助! Redis数据结构简介 对redis来说,所有的key(键)都是字符串。我们在谈…

    2025年2月24日
    200
  • 聊聊Redis中的缓存穿透、缓存雪崩、缓存击穿和缓存一致性

    本篇文章带大家简单了解一下redis中的缓存穿透、缓存雪崩、缓存击穿和缓存一致性,介绍一下缓存穿透和缓存雪崩的解决方案,希望对大家有所帮助! 缓存雪崩 缓存同一时间大面积失效,后面的请求都会落到数据库上,造成数据库短时间内无法承受大量请求而…

    2025年2月24日
    200
  • 聊聊Redis的持久化机制,到底采用RDB还是AOF呢?

    本篇文章带大家了解一下redis的持久化机制(rdb和aof),聊聊到底采用rdb还是aof呢?希望对大家有所帮助! RDB 1. 什么是RDB RDB:每隔一段时间,把内存中的数据写入磁盘的临时文件,作为快照,恢复的时候把快照文件读进内存…

    2025年2月24日
    200
  • 浅谈Redis中缓存过期、内存被缓存占用要怎么处理?

    浅谈redis中缓存过期、内存被缓存占用要怎么处理?下面本篇文章带大家了解一下redis中的缓存过期处理策略和内存淘汰机制,希望对大家有所帮助! 已过期的key如何处理? 设置了expire的key缓存过期了,但是服务器的内存还是会被占用,…

    2025年2月24日
    200
  • 聊聊Redis中的哨兵模式(Sentine)

    本篇文章带大家了解一下redis中的哨兵模式(sentine),介绍一下sentinel工作机制、sentinel模式怎么搭建,希望对大家有所帮助! Redis Sentinel哨兵模式 是一个分布式系统, 你可以在一个架构中运行多个 Se…

    2025年2月24日
    200

发表回复

登录后才能评论