File tree Expand file tree Collapse file tree 1 file changed +20
-8
lines changed Expand file tree Collapse file tree 1 file changed +20
-8
lines changed Original file line number Diff line number Diff line change @@ -29,17 +29,29 @@ Redis的数据类型包括简单的键值数据类型String,集合类型(Lis
29
29
我以在电商网站上提供最新评论列表的场景为例,进行讲解。最新评论列表包含了所有评论中的最新留言,这就要求集合类型能对元素保序,也就是说,集合中的元素可以按序排列,这种对元素保序的集合类型叫作有 序集合。在 Redis 常用的 4 个集合类型中(List、Hash、Set、Sorted Set),List 和 Sorted Set 就属于有序集合。List 是按照元素进入 List 的顺序进行排序的,而 Sorted Set 可以根据元素 的权重来排序,我们可以自己来决定每个元素的权重值。比如说,我们可以根据元素插入 Sorted Set 的时间确定权重值,先插入的元素权重小,后插入的元素权重大。
30
30
* 应用场景
31
31
* 商品评论,博客评论
32
- 通过list的lrange,或者通过Sorted sets的ZRANGEBYSCORE
33
-
34
-
32
+ 通过list的lrange,或者通过Sorted sets的ZRANGEBYSCORE
35
33
36
-
37
- * 排序统计
38
- * 二值状态统计
39
- * 基数统计
34
+
35
+
40
36
41
37
* Bit arrays
42
- * HyperLogLogs
38
+ * 二值状态统计
39
+ 现在,我们再来分析下第三个场景:二值状态统计。这里的二值状态就是指集合元素的取值就只有 0 和 1 两种。在签到打卡的场景中,我们只用记录签到(1)或未签到(0),所以它就是非常典型的二值状态,在 签到统计时,每个用户一天的签到用 1 个 bit 位就能表示,一个月(假设是 31 天)的签到情况用 31 个 bit 位就可以,而一年的签到也只需要用 365 个 bit 位,根本不用太复杂的集合类型。这个时候,我 们就可以选择 Bitmap。这是 Redis 提供的扩展数据类型。我来给你解释一下它的实现原理。Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。String 类型是会保存为二进 制的字节数组,所以,Redis 就把字节数组的每个 bit 位利用起来,用来表示一个元素的二值状态。你可以把 Bitmap 看作是一个 bit 数组。Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计 二值状态的数据类型。String 类型是会保存为二进制的字节数组,所以,Redis 就把字节数组的每个 bit 位利用起来,用来表示一个元素的二值状态。你可以把 Bitmap 看作是一个 bit 数组。Bitmap 提供 了 GETBIT/SETBIT 操作,使用一个偏移值 offset 对 bit 数组的某一个 bit 位进行读和写。不过,需要注意的是,Bitmap 的偏移量是从 0 开始算的,也就是说 offset 的最小值是 0。当使用 SETBIT 对一个 bit 位进行写操作时,这个 bit 位会被设置为 1。Bitmap 还提供了 BITCOUNT 操作,用来统计这个 bit 数组中所有“1”的个数。
40
+
41
+ * 应用场景
42
+ * 签到统计
43
+ SETBIT uid:sign:3000:202008 2 1 //模拟用户8月3号签到
44
+ GETBIT uid:sign:3000:202008 2 //判断用户8月3号是否签到
45
+ BITCOUNT uid:sign:3000:202008 //统计用户8月份签到次数
46
+ * 连续N天签到统计
47
+ Bitmap 支持用 BITOP 命令对多个 Bitmap 按位做“与”“或”“异或”的操作,操作的结果会保存到一个新的 Bitmap 中。我以按位“与”操作为例来具体解释一下。可以看到,三个 Bitmap bm1、bm2 和 bm3,对应 bit 位做“与”操作,结果保存到了一个新的 Bitmap 中
48
+
49
+
50
+
51
+
52
+
53
+ * HyperLogLogs
54
+ * 基数统计
43
55
* Streams
44
56
* Geo
45
57
You can’t perform that action at this time.
0 commit comments