@gordon.gan/specflow 1.4.0-beta → 1.4.2-beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/prompts/approval/database-guidance.md +79 -0
  4. package/prompts/approval/generate.md +600 -290
  5. package/skills/database/LICENSE +405 -0
  6. package/skills/database/ORIGIN.md +6 -0
  7. package/skills/database/README.md +30 -0
  8. package/skills/database/elasticsearch/LICENSE.txt +202 -0
  9. package/skills/database/elasticsearch/SKILL.md +199 -0
  10. package/skills/database/elasticsearch/examples/01-fulltext-search.md +215 -0
  11. package/skills/database/elasticsearch/examples/02-aggregation-report.md +206 -0
  12. package/skills/database/elasticsearch/examples/03-reindex-zero-downtime.md +200 -0
  13. package/skills/database/elasticsearch/examples/04-cluster-monitoring.md +204 -0
  14. package/skills/database/elasticsearch/references/01-query-dsl-fulltext.md +162 -0
  15. package/skills/database/elasticsearch/references/02-query-dsl-term.md +210 -0
  16. package/skills/database/elasticsearch/references/03-aggregations-metric.md +161 -0
  17. package/skills/database/elasticsearch/references/04-aggregations-bucket.md +236 -0
  18. package/skills/database/elasticsearch/references/05-mapping-types.md +134 -0
  19. package/skills/database/elasticsearch/references/06-analyzers.md +187 -0
  20. package/skills/database/elasticsearch/references/07-cluster-ops.md +225 -0
  21. package/skills/database/elasticsearch/references/08-elk-integration.md +170 -0
  22. package/skills/database/mysql/SKILL.md +195 -0
  23. package/skills/database/mysql/examples/01-connection-pool.md +75 -0
  24. package/skills/database/mysql/examples/02-slow-query-optimization.md +98 -0
  25. package/skills/database/mysql/examples/03-master-slave-setup.md +144 -0
  26. package/skills/database/mysql/examples/04-backup-strategy.md +212 -0
  27. package/skills/database/mysql/references/01-functions-string.md +103 -0
  28. package/skills/database/mysql/references/02-functions-date.md +152 -0
  29. package/skills/database/mysql/references/03-functions-aggregate-window.md +167 -0
  30. package/skills/database/mysql/references/04-functions-json.md +129 -0
  31. package/skills/database/mysql/references/05-sql-ddl-types.md +235 -0
  32. package/skills/database/mysql/references/06-index-optimization.md +232 -0
  33. package/skills/database/mysql/references/07-replication-ha.md +213 -0
  34. package/skills/database/mysql/references/08-backup-restore.md +207 -0
  35. package/skills/database/mysql/references/09-advanced-features.md +345 -0
  36. package/skills/database/oracle/LICENSE.txt +202 -0
  37. package/skills/database/oracle/SKILL.md +238 -0
  38. package/skills/database/oracle/examples/01-plsql-procedure.md +90 -0
  39. package/skills/database/oracle/examples/02-awr-analysis.md +99 -0
  40. package/skills/database/oracle/examples/03-rman-backup.md +108 -0
  41. package/skills/database/oracle/examples/04-dataguard-setup.md +146 -0
  42. package/skills/database/oracle/references/01-functions-string.md +91 -0
  43. package/skills/database/oracle/references/02-functions-date.md +71 -0
  44. package/skills/database/oracle/references/03-analytic-functions.md +103 -0
  45. package/skills/database/oracle/references/04-plsql-guide.md +303 -0
  46. package/skills/database/oracle/references/05-performance-tuning.md +164 -0
  47. package/skills/database/oracle/references/06-backup-recovery.md +115 -0
  48. package/skills/database/oracle/references/07-dataguard-rac.md +76 -0
  49. package/skills/database/oracle/references/08-security.md +170 -0
  50. package/skills/database/oracle/references/09-sql-syntax.md +152 -0
  51. package/skills/database/oracle/references/10-features.md +174 -0
  52. package/skills/database/postgresql/LICENSE.txt +202 -0
  53. package/skills/database/postgresql/SKILL.md +182 -0
  54. package/skills/database/postgresql/examples/.gitkeep +0 -0
  55. package/skills/database/postgresql/examples/01-jsonb-query.md +72 -0
  56. package/skills/database/postgresql/examples/02-cte-recursive.md +110 -0
  57. package/skills/database/postgresql/examples/03-performance-tuning.md +114 -0
  58. package/skills/database/postgresql/examples/04-streaming-replication.md +113 -0
  59. package/skills/database/postgresql/references/.gitkeep +0 -0
  60. package/skills/database/postgresql/references/01-functions-string.md +174 -0
  61. package/skills/database/postgresql/references/02-functions-datetime.md +54 -0
  62. package/skills/database/postgresql/references/03-functions-aggregate-window.md +142 -0
  63. package/skills/database/postgresql/references/04-functions-jsonb.md +117 -0
  64. package/skills/database/postgresql/references/05-fulltext-search.md +109 -0
  65. package/skills/database/postgresql/references/06-index-types.md +95 -0
  66. package/skills/database/postgresql/references/07-partition-fdw.md +133 -0
  67. package/skills/database/postgresql/references/08-replication-backup.md +215 -0
  68. package/skills/database/redis/LICENSE.txt +202 -0
  69. package/skills/database/redis/SKILL.md +922 -0
  70. package/skills/database/redis/examples/01-cache-usage.md +104 -0
  71. package/skills/database/redis/examples/02-session-storage.md +72 -0
  72. package/skills/database/redis/examples/03-leaderboard.md +63 -0
  73. package/skills/database/redis/examples/04-redis-cluster-setup.md +70 -0
  74. package/skills/database/redis/examples/05-stream-queue.md +65 -0
  75. package/skills/database/redis/references/command-quick-ref.md +180 -0
  76. package/skills/database/redis/references/commands-admin-key.md +413 -0
  77. package/skills/database/redis/references/commands-set-sorted-advanced.md +539 -0
  78. package/skills/database/redis/references/commands-string-hash-list.md +458 -0
  79. package/skills/database/redis/references/memory-optimization.md +150 -0
  80. package/skills/database/redis/references/redis-conf-production.md +139 -0
  81. package/skills/specflow-approval/SKILL.md +102 -181
  82. package/templates/approval.md +321 -221
@@ -0,0 +1,539 @@
1
+ # Redis 命令详解 — Set / ZSet / Bitmap / Geo / HyperLogLog / Stream
2
+
3
+ > 内容源自 doc.redisfans.com 完整翻译版 (Redis 2.8+),每个命令包含简介、参数说明、业务场景。
4
+
5
+ ---
6
+
7
+ ## 1. Set(集合)命令
8
+
9
+ | 命令 | 时间复杂度 | 可用版本 | 说明 |
10
+ |------|-----------|---------|------|
11
+ | SADD | O(1)/member | ≥1.0.0 | 添加成员 |
12
+ | SREM | O(1)/member | ≥1.0.0 | 移除成员 |
13
+ | SISMEMBER | O(1) | ≥1.0.0 | 判断存在 |
14
+ | SMEMBERS | O(N) | ≥1.0.0 | 获取全部 |
15
+ | SCARD | O(1) | ≥1.0.0 | 成员数量 |
16
+
17
+ ### SADD
18
+ **SADD key member [member ...]**
19
+
20
+ 将一个或多个成员添加到集合。已存在的成员被忽略。
21
+
22
+ **业务场景**:
23
+ - **标签系统**:`SADD article:42:tags redis database cache`
24
+ - **社交关系**:`SADD user:42:followers user:100`
25
+ - **白名单/黑名单**:`SADD blacklist:ip 192.168.1.1`
26
+ - **去重记录**:谁访问过某页面
27
+
28
+ **返回值**:新增成员的数量(不含已存在的)
29
+
30
+ ---
31
+
32
+ ### SREM
33
+ **SREM key member [member ...]**
34
+
35
+ 移除集合中的一个或多个成员。不存在的成员被忽略。
36
+
37
+ **业务场景**:取消关注 (`SREM user:42:following user:100`)、标签删除
38
+
39
+ ---
40
+
41
+ ### SISMEMBER
42
+ **SISMEMBER key member**
43
+
44
+ 判断 member 是否是集合的成员(O(1) 级快速),这是 Set 最核心优势之一。
45
+
46
+ **业务场景**:
47
+ - 检查用户是否已点赞:`SISMEMBER post:42:likes user:1001`
48
+ - IP 是否在黑名单
49
+ - 用户是否已有某个角色/权限
50
+
51
+ **返回值**:1(存在)| 0(不存在)
52
+
53
+ ---
54
+
55
+ ### SMEMBERS
56
+ **SMEMBERS key**
57
+
58
+ 返回集合中所有成员。O(N) 操作,**大集合场景慎用**(可能阻塞)。用 SSCAN 替代。
59
+
60
+ ---
61
+
62
+ ### SCARD
63
+ **SCARD key**
64
+
65
+ 返回集合的基数(成员数量)。O(1),不扫描。
66
+
67
+ **业务场景**:粉丝数 `SCARD user:1001:followers`、标签数量
68
+
69
+ ---
70
+
71
+ ### 集合运算
72
+
73
+ #### SINTER / SINTERSTORE
74
+ **SINTER key [key ...]**
75
+ **SINTERSTORE destination key [key ...]**
76
+
77
+ 返回/存储所有给定集合的交集。
78
+
79
+ **业务场景**:
80
+ - **共同好友**:`SINTER user:42:friends user:100:friends`
81
+ - **权限交集**:同时拥有权限 A 和 B 的用户
82
+ - **标签匹配**:同时包含 redis 和 database 标签的文章
83
+
84
+ #### SUNION / SUNIONSTORE
85
+ **SUNION key [key ...]**
86
+ **SUNIONSTORE destination key [key ...]**
87
+
88
+ 返回/存储所有给定集合的并集。自动去重。
89
+
90
+ **业务场景**:
91
+ - **合并好友列表**:获取共同好友的总集
92
+ - **群体权限合并**
93
+ - **内容推荐去重**
94
+
95
+ #### SDIFF / SDIFFSTORE
96
+ **SDIFF key [key ...]**
97
+ **SDIFFSTORE destination key [key ...]**
98
+
99
+ 返回/存储第一个集合与后续集合的差集。(即:在 A 中但不在 B 中的元素)
100
+
101
+ **业务场景**:
102
+ - **推荐新关注**:`SDIFF user:42:may_know user:42:following`
103
+ - **新粉丝检测**:昨天的新增粉丝
104
+ - **增量处理**:这批数据中哪些是新的
105
+
106
+ ---
107
+
108
+ ### SPOP / SRANDMEMBER
109
+
110
+ **SPOP key [count]** — 随机移除并返回 count 个成员
111
+ **SRANDMEMBER key [count]** — 随机返回但不移除 count 个成员
112
+ - count > 0:返回 count 个不重复成员
113
+ - count < 0:返回 |count| 个可重复成员(允许重复)
114
+
115
+ **业务场景**:
116
+ - **抽奖系统**:`SRANDMEMBER lucky:draw:users 1`
117
+ - **随机推荐**:`SRANDMEMBER articles 5`
118
+ - **资源抽取**:随机分配任务(SPOP 消耗)
119
+
120
+ ---
121
+
122
+ ### SMOVE
123
+ **SMOVE source destination member**
124
+
125
+ 将 member 从 source 移动到 destination。原子操作。
126
+
127
+ **业务场景**:任务流转(待处理 → 处理中)、队列状态迁移
128
+
129
+ ---
130
+
131
+ ### SSCAN
132
+ **SSCAN key cursor [MATCH pattern] [COUNT count]**
133
+
134
+ 渐进式迭代集合元素。替代 SMEMBERS 的大集合场景。
135
+
136
+ ---
137
+
138
+ ## 2. Sorted Set(有序集合)命令
139
+
140
+ | 命令 | 时间复杂度 | 可用版本 | 说明 |
141
+ |------|-----------|---------|------|
142
+ | ZADD | O(log N)/item | ≥1.2.0 | 添加/更新 |
143
+ | ZRANGE | O(log N+M) | ≥1.2.0 | 按排名查 |
144
+ | ZRANK | O(log N) | ≥2.0.0 | 获取排名 |
145
+ | ZSCORE | O(1) | ≥1.2.0 | 获取分数 |
146
+ | ZINCRBY | O(log N) | ≥1.2.0 | 增加分数 |
147
+
148
+ ### ZADD
149
+ **ZADD key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]**
150
+
151
+ 将一个或多个 member 及其 score 加入有序集合。如果 member 已存在则更新 score。
152
+
153
+ **参数说明**:
154
+ - `NX`:仅新成员,不更新已存在
155
+ - `XX`:仅更新已存在,不添加新成员
156
+ - `GT|LT`:仅当新分数大于/小于当前分数时更新
157
+ - `CH`:返回值包含更新而不是新增的数量
158
+ - `INCR`:增加分数(等价 ZINCRBY)
159
+
160
+ **业务场景**:
161
+ - **实时排行榜**:`ZADD leaderboard 9527 "player_42"`
162
+ - **延时队列**:`ZADD delay:queue <unix_timestamp> "job_id"`(用 ZRANGEBYSCORE 轮询到期任务)
163
+ - **带权重的标签匹配**
164
+
165
+ **返回值**:新增成员数量(不含更新)
166
+
167
+ ---
168
+
169
+ ### ZRANGE / ZREVRANGE
170
+ **ZRANGE key start stop [WITHSCORES]**
171
+ **ZREVRANGE key start stop [WITHSCORES]**
172
+
173
+ 按分数从小到大(ZRANGE)/ 从大到小(ZREVRANGE)返回排名区间内的成员。WITHSCORES 选项同时返回分数。
174
+
175
+ **业务场景**:
176
+ - ZREVRANGE 0 9 WITHSCORES → **排行榜 Top 10**
177
+ - ZRANGE 0 -1 → 全部成员(按分排序)
178
+
179
+ > 注意:ZRANGE 在 Redis 6.2.0+ 中扩展支持 BYSCORE / BYLEX / REV 参数,提供了更强的排序能力。
180
+
181
+ ---
182
+
183
+ ### ZRANGEBYSCORE / ZREVRANGEBYSCORE
184
+ **ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]**
185
+ **ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]**
186
+
187
+ 按分数范围返回成员。支持区间符号:
188
+ - `(5` 不包含 5
189
+ - `5` 包含 5
190
+ - `-inf` / `+inf` 负无穷 / 正无穷
191
+
192
+ **业务场景**:
193
+ - **延时队列消费**:`ZRANGEBYSCORE delay:queue 0 <current_timestamp LIMIT 0 10`
194
+ - **薪资范围查询**:`ZRANGEBYSCORE salary 10000 20000`
195
+ - **分数段统计**:`ZCOUNT leaderboard 1000 2000`
196
+
197
+ ---
198
+
199
+ ### ZRANK / ZREVRANK
200
+ **ZRANK key member**
201
+ **ZREVRANK key member**
202
+
203
+ 返回 member 在有序集合中的排名(0-based)。
204
+
205
+ **业务场景**:
206
+ - 查看自己的排名:`ZREVRANK leaderboard "player_42"`
207
+ - 排名变化监控:计算排名差
208
+
209
+ ---
210
+
211
+ ### ZSCORE
212
+ **ZSCORE key member**
213
+
214
+ 返回 member 的分数值。O(1) 操作。
215
+
216
+ ---
217
+
218
+ ### ZINCRBY
219
+ **ZINCRBY key increment member**
220
+
221
+ 将 member 的分数增加 increment(可正可负)。
222
+
223
+ **业务场景**:
224
+ - 实时更新分数:`ZINCRBY leaderboard 50 "player_42"`(+50 分)
225
+ - 扣分:`ZINCRBY leaderboard -10 "player_42"`
226
+
227
+ ---
228
+
229
+ ### ZCARD
230
+ **ZCARD key** — 返回有序集合的成员数量(O(1))
231
+
232
+ **业务场景**:排行榜总人数、队列长度
233
+
234
+ ---
235
+
236
+ ### ZCOUNT
237
+ **ZCOUNT key min max** — 返回分数在 min 和 max 之间的成员数量
238
+
239
+ **业务场景**:特定分段人数统计(不及格/及格/优秀各多少人)
240
+
241
+ ---
242
+
243
+ ### ZREM / ZREMRANGEBYRANK / ZREMRANGEBYSCORE
244
+ **ZREM key member [member ...]** — 移除指定成员
245
+ **ZREMRANGEBYRANK key start stop** — 移除排名区间
246
+ **ZREMRANGEBYSCORE key min max** — 移除分数区间
247
+
248
+ **业务场景**:
249
+ - 清除过期成员 `ZREMRANGEBYSCORE leaderboard -inf 0`(分数 ≤ 0 的移除)
250
+ - 排行榜缩容 `ZREMRANGEBYRANK leaderboard 100 -1`(保留前 100)
251
+
252
+ ---
253
+
254
+ ### ZINTERSTORE / ZUNIONSTORE
255
+ **ZINTERSTORE destination numkeys key [key ...] [WEIGHTS w] [AGGREGATE SUM|MIN|MAX]**
256
+ **ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS w] [AGGREGATE SUM|MIN|MAX]**
257
+
258
+ 计算多个有序集的交集/并集,结果保存到 destination。
259
+ - WEIGHTS:每个 key 的权重乘数
260
+ - AGGREGATE:SUM(分数相加)/ MIN(取最小分数)/ MAX(取最大分数)
261
+
262
+ **业务场景**:
263
+ - **多周期合并**:`ZUNIONSTORE monthly 4 week1 week2 week3 week4`(月排行榜 = 4 周合并)
264
+ - **加权推荐**:`ZINTERSTORE recommend 2 clicks:user purchases:user WEIGHTS 0.3 0.7`(点击 ×0.3 + 购买 ×0.7 的加权推荐)
265
+
266
+ ---
267
+
268
+ ### ZSCAN
269
+ **ZSCAN key cursor [MATCH pattern] [COUNT count]**
270
+
271
+ 渐进式迭代有序集合。
272
+
273
+ ### ZRANGEBYLEX / ZLEXCOUNT / ZREMRANGEBYLEX
274
+ **ZRANGEBYLEX key min max [LIMIT offset count]**
275
+ **ZLEXCOUNT key min max**
276
+ **ZREMRANGEBYLEX key min max**
277
+
278
+ 基于字典序范围操作(需要所有成员分数相同)。区间用 `[`(闭区间)和 `(`(开区间)。
279
+
280
+ **业务场景**:字符串分组统计、按字母序浏览
281
+
282
+ ---
283
+
284
+ ## 3. Bitmap(位图)命令
285
+
286
+ | 命令 | 时间复杂度 | 可用版本 | 说明 |
287
+ |------|-----------|---------|------|
288
+ | SETBIT | O(1) | ≥2.2.0 | 设置位 |
289
+ | GETBIT | O(1) | ≥2.2.0 | 获取位 |
290
+ | BITCOUNT | O(N) | ≥2.2.0 | 统计 1 数量 |
291
+ | BITOP | O(N) | ≥2.2.0 | 位运算 |
292
+ | BITPOS | O(N) | ≥2.8.7 | 查找位 |
293
+
294
+ ### SETBIT / GETBIT
295
+ **SETBIT key offset value** (value: 0 或 1)
296
+ **GETBIT key offset**
297
+
298
+ ```
299
+ # 用户 42 在 2024-01-15 签到
300
+ SETBIT sign:2024-01-15 42 1
301
+ # 查询签到状态
302
+ GETBIT sign:2024-01-15 42
303
+ ```
304
+
305
+ **业务场景**:
306
+ - **每日签到**:亿级用户只需 (用户数/8) 字节
307
+ - **独立用户标记**:`SETBIT online:2024-01-15 user_id 1`
308
+
309
+ ### BITCOUNT
310
+ **BITCOUNT key [start end [BYTE|BIT]]**
311
+
312
+ **业务场景**:
313
+ - 日活统计:`BITCOUNT online:2024-01-15`
314
+ - 签到人数:`BITCOUNT sign:2024-01`
315
+
316
+ ### BITOP
317
+ **BITOP operation destkey key [key ...]**
318
+
319
+ **业务场景**:
320
+ - 月活:`BITOP OR monthly dest week1 week2 week3 week4`
321
+ - 连续活跃:`BITOP AND dest day1 day2 day3`
322
+
323
+ ### BITPOS
324
+ **BITPOS key bit [start [end [BYTE|BIT]]]**
325
+
326
+ 返回第一位为 0 或 1 的位置。用于找到第一个空闲位或第一个标记位。
327
+
328
+ ---
329
+
330
+ ## 4. HyperLogLog 命令
331
+
332
+ | 命令 | 时间复杂度 | 可用版本 | 说明 |
333
+ |------|-----------|---------|------|
334
+ | PFADD | O(1) | ≥2.8.9 | 添加元素 |
335
+ | PFCOUNT | O(1) | ≥2.8.9 | 基数估算 |
336
+ | PFMERGE | O(N) | ≥2.8.9 | 合并 |
337
+
338
+ ### PFADD
339
+ **PFADD key element [element ...]**
340
+
341
+ 添加元素到 HyperLogLog 数据结构。元素可重复添加(自动去重)。
342
+
343
+ ### PFCOUNT
344
+ **PFCOUNT key [key ...]**
345
+
346
+ 返回 HyperLogLog 的基数估算值。单 key O(1),多 key O(N)(需合并临时结构)。
347
+
348
+ **误差**:标准误差 0.81%
349
+
350
+ **业务场景**:
351
+ - **UV 统计**:`PFADD uv:2024-01-15 "user_42"` → `PFCOUNT uv:2024-01-15`
352
+ - **多日合并 UV**:`PFCOUNT uv:day1 uv:day2 uv:day3`
353
+ - **搜索词去重**:`PFADD search:terms "redis cluster"`
354
+
355
+ ### PFMERGE
356
+ **PFMERGE destkey sourcekey [sourcekey ...]**
357
+
358
+ 合并多个 HyperLogLog 到 destkey。
359
+
360
+ **业务场景**:月 UV = 合并 30 天的 UV `PFMERGE uv:2024-01 uv:0101 uv:0102 ... uv:0130`
361
+
362
+ ---
363
+
364
+ ## 5. Geo(地理位置)命令
365
+
366
+ | 命令 | 时间复杂度 | 可用版本 | 说明 |
367
+ |------|-----------|---------|------|
368
+ | GEOADD | O(log N)/item | ≥3.2.0 | 添加位置 |
369
+ | GEOPOS | O(log N)/item | ≥3.2.0 | 获取坐标 |
370
+ | GEODIST | O(log N) | ≥3.2.0 | 距离计算 |
371
+ | GEORADIUS | O(N+log M) | ≥3.2.0 | 半径查询 |
372
+ | GEOHASH | O(log N)/item | ≥3.2.0 | 编码转换 |
373
+
374
+ ### GEOADD
375
+ **GEOADD key longitude latitude member [longitude latitude member ...]**
376
+
377
+ 将指定的地理空间位置(经度、纬度、名称)添加到 key 中。
378
+
379
+ ```
380
+ GEOADD cities 116.397 39.908 "北京" 121.474 31.230 "上海"
381
+ GEOADD cities 113.264 23.129 "广州" 114.057 22.543 "深圳"
382
+ ```
383
+
384
+ ---
385
+
386
+ ### GEODIST
387
+ **GEODIST key member1 member2 [m|km|mi|ft]**
388
+
389
+ 返回两个给定位置之间的距离。默认米(m)。
390
+
391
+ ```
392
+ GEODIST cities "北京" "上海" km → 1067.5
393
+ GEODIST cities "北京" "广州" km → 1889.6
394
+ ```
395
+
396
+ ---
397
+
398
+ ### GEORADIUS
399
+ **GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]**
400
+
401
+ 以给定的经纬度为中心,查找半径内的位置元素。
402
+ - `WITHDIST`:同时返回距离
403
+ - `WITHCOORD`:同时返回坐标
404
+ - `COUNT`:限制返回数量
405
+
406
+ **业务场景**:
407
+ - **附近的人/店铺**:`GEORADIUS locations 116.4 39.9 5 km WITHDIST COUNT 20`
408
+ - **地理围栏**:查询指定范围内的 POI
409
+
410
+ ---
411
+
412
+ ### GEORADIUSBYMEMBER
413
+ **GEORADIUSBYMEMBER key member radius m|km|ft|mi [...]**
414
+
415
+ 以已存储的成员为中心,查找附近的元素。
416
+
417
+ **业务场景**:基于用户当前位置查找附近服务
418
+
419
+ ---
420
+
421
+ ### GEOHASH
422
+ **GEOHASH key member [member ...]**
423
+
424
+ 返回 Geohash 编码字符串(11 字符)。
425
+
426
+ ---
427
+
428
+ ## 6. Stream(消息流)命令
429
+
430
+ | 命令 | 时间复杂度 | 可用版本 | 说明 |
431
+ |------|-----------|---------|------|
432
+ | XADD | O(1)/entry | ≥5.0.0 | 追加消息 |
433
+ | XREAD | O(N) | ≥5.0.0 | 读取消息 |
434
+ | XRANGE | O(N) | ≥5.0.0 | 范围查询 |
435
+ | XGROUP | O(1) | ≥5.0.0 | 管理消费组 |
436
+ | XREADGROUP | O(N) | ≥5.0.0 | 消费组读取 |
437
+ | XACK | O(1) | ≥5.0.0 | 确认消费 |
438
+
439
+ ### XADD
440
+ **XADD key [NOMKSTREAM] [MAXLEN|MINID [~] threshold] *|id field value [field value ...]**
441
+
442
+ 向 Stream 追加一条新消息。`*` 表示自动生成唯一时间戳 ID,格式 `unix_ms-sequence`。
443
+ - `NOMKSTREAM`:key 不存在时不自动创建
444
+ - `MAXLEN [~]`:限制长度(`~` 启用近似修剪提升性能)
445
+ - `MINID [~]`:按 ID 阈值修剪
446
+
447
+ **业务场景**:
448
+ ```
449
+ # 订单事件流
450
+ XADD orders * order_id 1001 user_id 42 amount 99.99 status created
451
+ XADD orders * order_id 1001 status paid
452
+ XADD orders * order_id 1001 status shipped
453
+ ```
454
+
455
+ ---
456
+
457
+ ### XRANGE / XREVRANGE
458
+ **XRANGE key start end [COUNT count]**
459
+ **XREVRANGE key end start [COUNT count]**
460
+
461
+ 按 ID 范围返回消息。用 `-` 和 `+` 表示最小/最大 ID。
462
+
463
+ **业务场景**:
464
+ - 查看最新消息:`XREVRANGE stream + - COUNT 10`
465
+ - 按时间段查询:`XRANGE orders 1700000000000-0 1700001000000-0`
466
+ - 全量回放:`XRANGE stream - +`
467
+
468
+ ---
469
+
470
+ ### XREAD
471
+ **XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] id [id ...]**
472
+
473
+ 读取一个或多个 Stream 中 ID 大于指定值的新消息。
474
+ - `BLOCK 0`:阻塞等待(不超时)
475
+ - `COUNT 10`:最多返回 10 条
476
+
477
+ **业务场景**:
478
+ ```
479
+ # 非阻塞读取
480
+ XREAD COUNT 10 STREAMS mystream 0
481
+
482
+ # 阻塞等待新消息
483
+ XREAD COUNT 1 BLOCK 5000 STREAMS mystream $
484
+ ```
485
+
486
+ ---
487
+
488
+ ### XGROUP
489
+ **XGROUP [CREATE|SETID|DESTROY|DELCONSUMER] key group [id|$] [MKSTREAM]**
490
+
491
+ 管理消费组。
492
+ - `XGROUP CREATE mystream mygroup $`:创建组,从最新消息开始
493
+ - `XGROUP CREATE mystream mygroup 0`:创建组,从第一条消息开始
494
+ - `MKSTREAM`:key 不存在时自动创建
495
+
496
+ ---
497
+
498
+ ### XREADGROUP
499
+ **XREADGROUP GROUP group consumer [COUNT count] [BLOCK ms] STREAMS key [key ...] id [id ...]**
500
+
501
+ 消费组读取。`>` 表示读取未被其他消费者读取的新消息。
502
+
503
+ **业务场景**:
504
+ ```
505
+ # 多消费者处理订单流
506
+ # 消费者 1
507
+ XREADGROUP GROUP orders-group consumer-1 COUNT 1 BLOCK 2000 STREAMS orders >
508
+
509
+ # 消费者 2 (自动负载均衡)
510
+ XREADGROUP GROUP orders-group consumer-2 COUNT 1 BLOCK 2000 STREAMS orders >
511
+ ```
512
+
513
+ ---
514
+
515
+ ### XACK
516
+ **XACK key group id [id ...]**
517
+
518
+ 确认消息已被处理。**消息确认后才从 Pending 列表移除**。
519
+
520
+ ---
521
+
522
+ ### XPENDING / XINFO
523
+ **XPENDING key group [start end count [consumer]]**
524
+ **XINFO GROUPS key**
525
+
526
+ 管理 Pending 消息(已投递但未 ACK)。
527
+ - `XPENDING orders payment-group`:查看待确认
528
+ - `XPENDING orders payment-group - + 10 consumer-1`:查看消费者 1 的待确认
529
+
530
+ ---
531
+
532
+ ## 7. 编码与空间效率对比
533
+
534
+ | 数据结构 | 小数据编码 | 内存效率 | 数据量阈值 |
535
+ |---------|-----------|---------|-----------|
536
+ | Hash | ziplist → hashtable | 高(小数据)→ 中 | entries:512, value:64B |
537
+ | ZSet | ziplist → skiplist | 高(小数据)→ 中 | entries:128, value:64B |
538
+ | Set | intset → hashtable | 高(全整数)→ 中 | entries:512 |
539
+ | List | quicklist (ziplist节点) | 高 | list-max-ziplist-size:-2 |