|
5 | 5 | - Redis
|
6 | 6 | ---
|
7 | 7 |
|
8 |
| -### Bitmap |
| 8 | +## Bitmap |
9 | 9 |
|
10 |
| -#### 介绍 |
| 10 | +### 介绍 |
11 | 11 |
|
12 | 12 | Bitmap 存储的是连续的二进制数字(0 和 1),通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。
|
13 | 13 |
|
14 |
| -#### 常用命令 |
| 14 | +你可以将 Bitmap 看作是一个存储二进制数字(0 和 1)的数组,数组中每个元素的下标叫做 offset(偏移量)。 |
| 15 | + |
| 16 | + |
| 17 | + |
| 18 | +### 常用命令 |
| 19 | + |
| 20 | +| 命令 | 介绍 | |
| 21 | +| ------------------------------------- | ------------------------------------------------------------ | |
| 22 | +| SETBIT key offset value | 设置指定 offset 位置的值 | |
| 23 | +| GETBIT key offset | 获取指定 offset 位置的值 | |
| 24 | +| BITCOUNT key start end | 获取 start 和 end 之前值为 1 的元素个数 | |
| 25 | +| BITOP operation destkey key1 key2 ... | 对一个或多个 Bitmap 进行运算,可用运算符有AND, OR, XOR以及NOT | |
| 26 | + |
15 | 27 |
|
16 |
| -`setbit` 、`getbit` 、`bitcount`、`bitop` |
17 | 28 |
|
18 | 29 | ```bash
|
19 | 30 | # SETBIT 会返回之前位的值(默认是 0)这里会生成 7 个位
|
20 |
| -> setbit mykey 7 1 |
| 31 | +> SETBIT mykey 7 1 |
21 | 32 | (integer) 0
|
22 |
| -> setbit mykey 7 0 |
| 33 | +> SETBIT mykey 7 0 |
23 | 34 | (integer) 1
|
24 |
| -> getbit mykey 7 |
| 35 | +> GETBIT mykey 7 |
25 | 36 | (integer) 0
|
26 |
| -> setbit mykey 6 1 |
| 37 | +> SETBIT mykey 6 1 |
27 | 38 | (integer) 0
|
28 |
| -> setbit mykey 8 1 |
| 39 | +> SETBIT mykey 8 1 |
29 | 40 | (integer) 0
|
30 | 41 | # 通过 bitcount 统计被被设置为 1 的位的数量。
|
31 |
| -> bitcount mykey |
| 42 | +> BITCOUNT mykey |
32 | 43 | (integer) 2
|
33 | 44 | ```
|
34 | 45 |
|
35 |
| -#### 应用场景 |
| 46 | +### 应用场景 |
36 | 47 |
|
37 |
| -适合需要保存状态信息(比如是否签到、是否登录...)并需要进一步对这些信息进行分析的场景。比如用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频) |
| 48 | +**需要保存状态信息(0/1即可表示)的场景** |
38 | 49 |
|
39 |
| -**用户行为分析** |
40 |
| -很多网站为了分析你的喜好,需要研究你点赞过的内容。 |
| 50 | +- 举例 :用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。 |
| 51 | +- 相关命令 :`SETBIT`、`GETBIT`、`BITCOUNT`、`BITOP`。 |
41 | 52 |
|
42 |
| -```bash |
43 |
| -# 记录你喜欢过 001 号小姐姐 |
44 |
| -> setbit beauty_girl_001 uid 1 |
45 |
| -``` |
| 53 | +## HyperLogLog |
46 | 54 |
|
47 |
| -**统计活跃用户** |
| 55 | +### 介绍 |
48 | 56 |
|
49 |
| -使用时间作为 key,然后用户 ID 为 offset,如果当日活跃过就设置为 1 |
| 57 | +`HyperLogLog` 是一种有名的基数计数概率算法 ,并不是 Redis 特有的,Redis 只是实现了这个算法并提供了一些开箱即用的 API。 |
50 | 58 |
|
51 |
| -那么我该如何计算某几天/月/年的活跃用户呢(暂且约定,统计时间内只要有一天在线就称为活跃),有请下一个 redis 的命令 |
| 59 | +Redis 提供的 `HyperLogLog` 占用空间非常非常小,只需要 12k 的空间就能存储接近`2^64`个不同元素。这是真的厉害,这就是数学的魅力么!并且,Redis 对 HyperLogLog 的存储结构做了优化,采用两种方式计数: |
52 | 60 |
|
53 |
| -```bash |
54 |
| -# 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。 |
55 |
| -# BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数 |
56 |
| -BITOP operation destkey key [key ...] |
57 |
| -``` |
| 61 | +- **稀疏矩阵** :计数较少的时候,占用空间很小。 |
| 62 | +- **稠密矩阵** :计数达到某个阈值的时候,占用 12k 的空间。 |
58 | 63 |
|
59 |
| -初始化数据: |
| 64 | +不过, `HyperLogLog` 的计数结果并不是一个精确值,存在一定的误差(标准误差为 `0.81%` 。),这是由于它本质上是用概率算法导致的。 |
60 | 65 |
|
61 |
| -```bash |
62 |
| -> setbit 20210308 1 1 |
63 |
| -(integer) 0 |
64 |
| -> setbit 20210308 2 1 |
65 |
| -(integer) 0 |
66 |
| -> setbit 20210309 1 1 |
67 |
| -(integer) 0 |
68 |
| -``` |
| 66 | + |
69 | 67 |
|
70 |
| -统计 20210308~20210309 总活跃用户数: 1 |
| 68 | +`HyperLogLog` 的使用非常简单,但原理非常复杂。`HyperLogLog` 的原理以及在 Redis 中的实现可以看这篇文章:[HyperLogLog 算法的原理讲解以及 Redis 是如何应用它的](https://juejin.cn/post/6844903785744056333) 。 |
71 | 69 |
|
72 |
| -```bash |
73 |
| -> bitop and desk1 20210308 20210309 |
74 |
| -(integer) 1 |
75 |
| -> bitcount desk1 |
76 |
| -(integer) 1 |
77 |
| -``` |
| 70 | +再推荐一个可以帮助理解HyperLogLog原理的工具:[Sketch of the Day: HyperLogLog — Cornerstone of a Big Data Infrastructure](http://content.research.neustar.biz/blog/hll.html) 。 |
78 | 71 |
|
79 |
| -统计 20210308~20210309 在线活跃用户数: 2 |
| 72 | +### 常用命令 |
80 | 73 |
|
81 |
| -```bash |
82 |
| -> bitop or desk2 20210308 20210309 |
83 |
| -(integer) 1 |
84 |
| -> bitcount desk2 |
85 |
| -(integer) 2 |
86 |
| -``` |
87 | 74 |
|
88 |
| -**用户在线状态** |
89 | 75 |
|
90 |
| -对于获取或者统计用户在线状态,使用 Bitmap 是一个节约空间且效率又高的一种方法。 |
| 76 | +### 应用场景 |
| 77 | + |
| 78 | +## Geospatial index |
| 79 | + |
| 80 | +地理空间数据管理。 |
| 81 | + |
| 82 | + |
91 | 83 |
|
92 |
| -只需要一个 key,然后用户 ID 为 offset,如果在线就设置为 1,不在线就设置为 0。 |
| 84 | +## Stream |
93 | 85 |
|
94 |
| -### HyperLogLog |
| 86 | +## 参考 |
95 | 87 |
|
96 |
| -### Stream |
| 88 | +- |
0 commit comments