Skip to content

Commit a77eb04

Browse files
committedJul 20, 2022
[docs update]redis 内容拆分&数据结构部分内容完善
1 parent a96400c commit a77eb04

File tree

6 files changed

+394
-343
lines changed

6 files changed

+394
-343
lines changed
 

‎README.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,13 @@ JVM 这部分内容主要参考 [JVM 虚拟机规范-Java8 ](https://docs.oracle
191191

192192
### Redis
193193

194-
- [Redis 常见问题总结](docs/database/redis/redis-questions-01.md)
194+
**知识点/面试题总结** : (必看:+1: ):
195+
196+
- [Redis 常见问题总结(上)](docs/database/redis/redis-questions-01.md)
197+
- [Redis 常见问题总结(下)](docs/database/redis/redis-questions-02.md)
198+
199+
**重要知识点:**
200+
195201
- [3种常用的缓存读写策略详解](docs/database/redis/3-commonly-used-cache-read-and-write-strategies.md)
196202
- [Redis 5 种基本数据结构详解](./docs/database/redis/redis-data-structures-01.md)
197203
- [Redis 内存碎片详解](./docs/database/redis/redis-memory-fragmentation.md)

‎docs/.vuepress/sidebar.ts

+1
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ export const sidebarConfig = defineSidebarConfig({
258258
children: [
259259
"cache-basics",
260260
"redis-questions-01",
261+
"redis-questions-02",
261262
{
262263
text: "重要知识点",
263264
icon: "star",

‎docs/database/redis/redis-data-structures-02.md

+46-54
Original file line numberDiff line numberDiff line change
@@ -5,92 +5,84 @@ tag:
55
- Redis
66
---
77

8-
### Bitmap
8+
## Bitmap
99

10-
#### 介绍
10+
### 介绍
1111

1212
Bitmap 存储的是连续的二进制数字(0 和 1),通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 。我们知道 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。
1313

14-
#### 常用命令
14+
你可以将 Bitmap 看作是一个存储二进制数字(0 和 1)的数组,数组中每个元素的下标叫做 offset(偏移量)。
15+
16+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/database/redis/image-20220720194154133.png)
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+
1527

16-
`setbit``getbit``bitcount``bitop`
1728

1829
```bash
1930
# SETBIT 会返回之前位的值(默认是 0)这里会生成 7 个位
20-
> setbit mykey 7 1
31+
> SETBIT mykey 7 1
2132
(integer) 0
22-
> setbit mykey 7 0
33+
> SETBIT mykey 7 0
2334
(integer) 1
24-
> getbit mykey 7
35+
> GETBIT mykey 7
2536
(integer) 0
26-
> setbit mykey 6 1
37+
> SETBIT mykey 6 1
2738
(integer) 0
28-
> setbit mykey 8 1
39+
> SETBIT mykey 8 1
2940
(integer) 0
3041
# 通过 bitcount 统计被被设置为 1 的位的数量。
31-
> bitcount mykey
42+
> BITCOUNT mykey
3243
(integer) 2
3344
```
3445

35-
#### 应用场景
46+
### 应用场景
3647

37-
适合需要保存状态信息(比如是否签到、是否登录...)并需要进一步对这些信息进行分析的场景。比如用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)
48+
**需要保存状态信息(0/1即可表示)的场景**
3849

39-
**用户行为分析**
40-
很多网站为了分析你的喜好,需要研究你点赞过的内容
50+
- 举例 :用户签到情况、活跃用户情况、用户行为统计(比如是否点赞过某个视频)。
51+
- 相关命令 :`SETBIT``GETBIT``BITCOUNT``BITOP`
4152

42-
```bash
43-
# 记录你喜欢过 001 号小姐姐
44-
> setbit beauty_girl_001 uid 1
45-
```
53+
## HyperLogLog
4654

47-
**统计活跃用户**
55+
### 介绍
4856

49-
使用时间作为 key,然后用户 ID 为 offset,如果当日活跃过就设置为 1
57+
`HyperLogLog` 是一种有名的基数计数概率算法 ,并不是 Redis 特有的,Redis 只是实现了这个算法并提供了一些开箱即用的 API。
5058

51-
那么我该如何计算某几天/月/年的活跃用户呢(暂且约定,统计时间内只要有一天在线就称为活跃),有请下一个 redis 的命令
59+
Redis 提供的 `HyperLogLog` 占用空间非常非常小,只需要 12k 的空间就能存储接近`2^64`个不同元素。这是真的厉害,这就是数学的魅力么!并且,Redis 对 HyperLogLog 的存储结构做了优化,采用两种方式计数:
5260

53-
```bash
54-
# 对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。
55-
# BITOP 命令支持 AND 、 OR 、 NOT 、 XOR 这四种操作中的任意一种参数
56-
BITOP operation destkey key [key ...]
57-
```
61+
- **稀疏矩阵** :计数较少的时候,占用空间很小。
62+
- **稠密矩阵** :计数达到某个阈值的时候,占用 12k 的空间。
5863

59-
初始化数据:
64+
不过, `HyperLogLog` 的计数结果并不是一个精确值,存在一定的误差(标准误差为 `0.81%` 。),这是由于它本质上是用概率算法导致的。
6065

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+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/database/redis/image-20220720194154133.png)
6967

70-
统计 20210308~20210309 总活跃用户数: 1
68+
`HyperLogLog` 的使用非常简单,但原理非常复杂。`HyperLogLog` 的原理以及在 Redis 中的实现可以看这篇文章:[HyperLogLog 算法的原理讲解以及 Redis 是如何应用它的](https://juejin.cn/post/6844903785744056333)
7169

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)
7871

79-
统计 20210308~20210309 在线活跃用户数: 2
72+
### 常用命令
8073

81-
```bash
82-
> bitop or desk2 20210308 20210309
83-
(integer) 1
84-
> bitcount desk2
85-
(integer) 2
86-
```
8774

88-
**用户在线状态**
8975

90-
对于获取或者统计用户在线状态,使用 Bitmap 是一个节约空间且效率又高的一种方法。
76+
### 应用场景
77+
78+
## Geospatial index
79+
80+
地理空间数据管理。
81+
82+
![](https://guide-blog-images.oss-cn-shenzhen.aliyuncs.com/github/javaguide/database/redis/image-20220720194359494.png)
9183

92-
只需要一个 key,然后用户 ID 为 offset,如果在线就设置为 1,不在线就设置为 0。
84+
## Stream
9385

94-
### HyperLogLog
86+
## 参考
9587

96-
### Stream
88+
-

0 commit comments

Comments
 (0)