Redis实战应用——位图和HyperLogLog详解,夯实基础再前行

本文深入探讨Redis中的位图和HyperLogLog数据结构。位图用于高效存储和操作bool型数据,节省存储空间,适用于用户签到记录等场景。HyperLogLog则是不精确但高效的去重计数方案,适用于大型网站的UV统计,标准误差0.81%。文章介绍了这两个数据结构的基本使用、统计和查找方法,并提供了实际应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前几天咱们介绍了Redis基本架构和简单应用,后续笔者还会进行更多的Redis应用和原理剖析,争取每天和朋友们进步一点点,充实自我。

今天,笔者继续带来Redis应用实战——位图和HyperLogLog

Redis实战应用——位图和HyperLogLog详解,夯实基础再前行

应用三:节衣缩食——位图

在我们平时开发过程中,会有一些bool 型数据需要存取,比如用户一年的签到记录,签了是1,没签是0,要记录365天。如果使用普通的key/value, 每个用户要记录365个,当用户上亿的时候,需要的存储空间是惊人的。

为了解决这个问题,Redis 提供了位图数据结构,这样每天的签到记录只占据一一个位,365天就是365个位,46个字节(一个稍长一点的字符串)就可以完全容纳下,这就大大节约了存储空间。

Redis实战应用——位图和HyperLogLog详解,夯实基础再前行

 

位图不是特殊的数据结构,它的内容其实就是普通的字符串,也就是 byte 数组。我们 可以使用普通的 get/set 直接获取和设置整个位图的内容,也可以使用位图操作 getbit/setbit 等将 byte 数组看成「位数组」来处理。 以老钱的经验,在面试中有 Redis 位图使用经验的同学很少,如果你对 Redis 的位图有 所了解,它将会是你的面试加分项。

基本使用

Redis的位数组是自动扩展,如果设置了某个偏移位置超出了现有的内容范围,就会自 动将位数组进行零充。 接下来我们使用位操作将字符串设置为 hello (不是直接使用 set 指令),首先我们需要得到 hello 的 ASCII 码,用 Python 命令行可以很方便地得到每个字符的 ASCII 码的二进制值。

>>> bin(ord('h')) 
'0b1101000' # 高位 -> 低位
>>> bin(ord('e'))
'0b1100101'
>>> bin(ord('l')) 
'0b1101100'
>>> bin(ord('l'))
'0b1101100'
>>> bin(ord('o'))
'0b1101111'

Redis实战应用——位图和HyperLogLog详解,夯实基础再前行

 

接下来我们使用 redis-cli 设置第一个字符,也就是位数组的前 8 位,我们只需要设置值为 1 的位,如上图所示,h 字符只有 1/2/4 位需要设置,e 字符只有 9/10/13/15 位需要 设置。值得注意的是位数组的顺序和字符的位顺序是相反的。

127.0.0.1:6379> setbit s 1 1 
(integer) 0 
127.0.0.1:6379> setbit s 2 1 
(integer) 0 
127.0.0.1:6379> setbit s 4 1 
(integer) 0 
127.0.0.1:6379> setbit s 9 1 
(integer) 0 
127.0.0.1:6379> setbit s 10 1 
(integer) 0 
127.0.0.1:6379> setbit s 13 1
(integer) 0 
127.0.0.1:6379> setbit s 15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值