
- 如果要统计一篇文章的阅读量,可以直接使用 Redis 的 incr 指令来完成。
- 如果要求阅读量必须按用户去重,那就可以使用 set 来记录阅读了这篇文章的所有用户 id,获取 set 集合的长度就是去重阅读量。
- 但是如果爆款文章阅读量太大,set 会浪费太多存储空间。这时候我们就要使用 Redis 提供的 HyperLogLog 数据结构 来代替 set,它只会占用最多 12k 的存储空间就可以完成海量的去重统计。但是它牺牲了准确度,它是模糊计数,误差率约为 0.81%。
按照官网的说法,Redis位图Bitmaps不是实际的数据类型,而是在字符串类型上定义的一组面向位的操作。在Redis中字符串限制最大为512MB, 所以位图中最大可以设置2^32个不同的位(42.9亿个)。图位的最小单位是比特(bit),每个bit的值只能是0或1。
位图适合存bool数据,当某个业务只有两种结果的时候,位图是不二之选
位图的存储大小计算: (maxOffset / 8 / 1024 / 1024)MB。其中maxOffset为位图的最大位数
基本操作
// bit 基本操作 |
返回值
/** |
BITFIELD
字母 | 数值 | 二进制(高位<-低位) |
---|---|---|
h | 104 | 0110 1000 |
e | 101 | 0110 0101 |
l | 108 | 0110 1100 |
l | 108 | 0110 1100 |
o | 111 | 0110 1111 |
127.0.0.1:6379> set w hello |
BITOP operation destkey key [key …]
基本操作其实还是用终端比较好,直接贴命令
127.0.0.1:6379> set a a # 二进制 01100001 |
127.0.0.1:6379> set a a # 二进制 01100001 |
127.0.0.1:6379> set a a # 二进制 01100001 |
实战前奏
如果对位运算不熟悉的同学,可以先复习一下。
链接放这里了:
位图实战
如果要统计一篇文章的阅读量
,可以直接使用 Redis 的 incr 指令来完成。
如果要求阅读量必须按用户去重
,那就可以使用 set 来记录阅读了这篇文章的所有用户 id,获取 set 集合的长度就是去重阅读量。
但是如果爆款文章阅读量太大
,set 会浪费太多存储空间
。这时候我们就要使用 Redis 提供的 HyperLogLog 数据结构 来代替 set,它只会占用最多 12k 的存储空间就可以完成海量的去重统计。
但是它牺牲了准确度,它是模糊计数,误差率约为 0.81%。
按照官网的说法,Redis位图Bitmaps不是实际的数据类型,而是在字符串类型上定义的一组面向位的操作。在Redis中字符串限制最大为512MB,
所以位图中最大可以设置2^32个不同的位(42.9亿个)。图位的最小单位是比特(bit),每个bit的值只能是0或1。
目标
- 打卡
- 判断某天是否打卡
- 统计某月打卡总次数
- 获取某用户在某月的打卡信息
- 连续打卡的起止时间
- 最长连续天数
- 统计指定区间的打卡次数
总的调用
|
返回值
➜ 2位图 git:(main) ✗ ts-node sign.ts |
具体实现
实现部分涉及:
- 位操作
- 多种实现方法
/** |
/** |
具体的实例代码:https://github.com/simuty/Integration/blob/main/Redis/
参考链接
Redis -位图为何能存亿级数据
redis专题04 数据结构之redis位图系列问题
Redis中bitmap的妙用
使用redis位图bitMap 实现签到功能(PHP版本)
Redis修行 — 位图实战
基于Redis位图实现用户签到功能
跬步千里 —— 阿里云Redis bitfield命令加速记