Redis 位图基础到统计活跃用户
大家有没有想过如何统计活跃用户数量?如果是自己做 , 那该怎么做?
这里思考一分钟 , 后面我将分享一下如何使用 redis 中的位图来统计活跃用户数 。
正文什么是位图 ?位图(bitmap)是二进制的 byte 数组, 也可以简单理解成是一个普通字符串 。 它将二进制数据存储在 byte 数组中以达到存储数据的作用 。
文章插图
图 1.1
如何使用位图 ?理清概念在解释什么是位图的时候说过 , 位图可以理解成是一个普通字符串 ,那么我们为什么要用位图而不是字符串呢 ?
下面是在 redis 中存储字符串的一个示意图
文章插图
图 2.1
如图 , 存储字符串是将字符串二进制数组的形式存储在 redis 中 , 位图可以直接对 二进制的数组操作 ,位图的优势在于可以用 0 和 1来存储布尔值 , 这大大降低了我们的存储空间消耗。 由于这个特性 , 我们 用位图来记录签到信息 , 记录活跃用户等, 可以达到节省空间的能力(后面会有介绍) 。
那我们如何对二进制的数组进行操作呢?
基本存取setbit | getbit上文说的二进制数组我们可以对它做 添加、查找及修改 的功能
如何进行添加和查找呢?setbit [keyName] [offset] [value]
offset:偏移量 , 指的是数组的下标; value: 数据 ,只能是 0 和 1 。
这条命令既可以添加数据也可以修改数据 。
如何进行查找呢 ?getbit [keyName] [offset]
offset:偏移量 , 指的是数组的下标 。 这里 , 除了设置 value 为 1 的 offset, 查询其他的都返回 0
补充:上面说了位图可以理解成字符串 , 那么它们之间可以互相操作吗?
文章插图
图 2.2
请对照上图 , 我们一起完成下面的探究:
- 以字符串存储 , 可以通过 getbit 命令获取到值吗?我们可以结合查询和图片所示的 offset 及所对应的值来验证> set str hi OK > getbit str 0 (integer) 0 > getbit str 4 (integer) 1 > getbit str 7 (integer) 0 > getbit str 15 (integer) 1 复制代码结论:可以的
- 以字符串存储 , 可以通过 settbit 修改值吗?我们可以试着将 offset 7 对应的 value 改成 1 ,如果成功了 , h 字符应该变成 i> setbit str 7 1 (integer) 0 > get str "ii" 复制代码结论:可以
- 用 setbit 存储字符串的二进制数据 , 可以通过 get 获取字符串吗?我们将 字符 h 的二进制存入位图 , 看可以能通过 get 获取> setbit bitmap 0 0 (integer) 0 > setbit bitmap 1 1 (integer) 0 > setbit bitmap 2 1 (integer) 0 > setbit bitmap 3 0 (integer) 0 > setbit bitmap 4 1 (integer) 0 > setbit bitmap 5 0 (integer) 0 > setbit bitmap 6 0 (integer) 0 > setbit bitmap 7 0 (integer) 0 > get bitmap "h" 复制代码结论:可以
那么 , 如何将位图应用的项目中呢?
统计和查找bitcount | bitposbitcount 是用来查找 1 出现的次数 , 既可以对位图使用也可以对字符串使用, 用法如下:
bitcount [keyName] [startWith] [endWith]
注意:这里的 startWith 和 endWith 不是二进制数组的下标(offset)这里的 startWith 和 endWith 可以理解成是字符串的下标 , 一个字符串对应 8 位二进制数据;它们相当于是截取字符串 , 如 s= "hi" , s[0:0] = "h" , 它所对应的二进制数组的下标是 0 , 7 , 以此类推 。其实这里不好解释 , 先来带代码 , 可以结合着上面的 图 2.2 看一下 , 大家后面可以在领悟一下
> set str hi> bitcount str 0 0(integer) 4> bitcount str 0 1(integer) 8> bitcount str(integer) 8
注意:startWith 和 endWith 不设置的时候默认全部范围应用场景: 统计活跃用户的数量bitpos 用来查找指定范围内出现的第一个 0 或 1, 用法如下:
bitpos [keyName] [bit] [start] [end]
bit: 要找的 0 或者 1 ,start 和 end 同上面的 startWith 和 endWith应用场景: 获取第一次签到和第一次未签到的时间
应用场景上面大致说了 2 个应用场景:
- 统计活跃用户的数量
- 获取第一次签到和第一次未签到的时间
统计活跃用户的数量
- 将位图的 keyName 设置成需要统计的 行为和时间范围 [ation:date], 如: login:2020-3
- 将用户对应到位图中的 offset , 如 id 对应二进制数组的下标 ,id 为 int
- 分离基础|数据中心融合的过去、现在和未来
- 电脑知识|北大青鸟:零基础学电脑从哪里入手
- IT|信服云为IT基础架构演进提供新思路
- Python源码阅读-基础1
- 3天时间,我是如何解决redis bigkey 删除问题的?
- Python中文速查表-Pandas 基础
- 零基础小白Python入门必看:通俗易懂,搞定深浅拷贝
- 学习大数据需要具备哪些基础知识,以及应该重视哪些环节
- 信服云为IT基础架构演进提供新思路
- 非计算机专业在大一期间该选修计算机基础还是Python编程