Redis 笔记(十)-三种特殊类型 Hyperloglog(基数统计)、Bitmap(位图)

一、Hyperloglog(基数统计)

  • 基数:数据集中不重复的元素的个数
  • 应用场景:网页的访问量(UV):同一用户多次访问,也只能算作一个人
    优点:占用内存非常少(2^64 不同的元素基数,只需 12KB 内存)
    缺点:有 0.81% 的误差(一般可以接受)

传统实现方法:存储用户的 id,然后每次进行比较。当用户变多之后这种方式及其浪费空间,而我们的目的只是 计数Hyperloglog 就能帮助我们利用最小的空间完成。

  • 基本命令(以 pf 开头):
命令 描述
pfadd key member [member ….] 添加指定元素到 HyperLogLog 中
pfcount key [key…] 获得 Hyperloglog 中的成员数量,重复的成员不会统计
pfmerge key destkey sourcekey [sourcekey…] 将多个集合,合并成一个新的集合
  • 测试:
127.0.0.1:6379> pfadd mykey a b c d e f g h i j        # 添加元素
(integer) 1
127.0.0.1:6379> pfadd mykey2 z m k l b j a i c
(integer) 1
127.0.0.1:6379> type mykey        # hyperloglog 底层使用 String
string
127.0.0.1:6379> pfcount mykey         # 估算 mykey 的基数
(integer) 10
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2        # 合并 mykey 和 mykey2 成为 mykey3(并集)
OK
127.0.0.1:6379> pfcount mykey3        估算 mykey3 的基数
(integer) 14

二、Bitmap(位图)

  • 位存储:通常用来表示数据的状态,都是用来记录二进制位的操作,只有 01 两种状态

  • Bitmap 是一串连续的,从左到右的二进制串(01),每一位所在的位置为偏移(offset),在 bitmap 上可执行 ANDORXORNOT 以及其它位操作

  • 应用:统计用户信息(活跃、不活跃)、登录与未登录、打卡等,两种状态的都可以使用 Bitmap

  • 基本命令:

命令 描述
setbit key offset value 设置,value 只能存储 0 或者 1 两种状态
getbit key offset 获取,通过 key-value 取出对应的状态信息
bitcount key 统计,通过 key 来统计非 0 的数量
  • 测试:
127.0.0.1:6379> setbit sign 0 1      # 设置 sign 的第 0 位为 1
(integer) 0
127.0.0.1:6379> setbit sign 2 1        # 设置 sign 的第 2 位为 1,不设置,默认为 0
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> getbit sign 0        # 获取第 0 位的数值
(integer) 1
127.0.0.1:6379> getbit sign 3        # 未设置默认是 0
(integer) 0
127.0.0.1:6379> bitcount sign        # 统计 sign 中为 1 的个数
(integer) 4
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容