*Redis LCS 命令
LCS(Longest Common Subsequence,最长公共子序列)比较两个字符串键的值,返回它们的最长公共子序列。如果启用 LEN 选项,则只返回长度;如果启用 IDX 选项,则返回匹配的子串索引。
*语法
LCS key1 key2 [LEN] [IDX] [MINMATCHLEN min-match-len] [WITHMATCHLEN]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key1 | String | 是 | 第一个字符串键 |
| key2 | String | 是 | 第二个字符串键 |
| LEN | Flag | 否 | 只返回最长公共子序列的长度,不返回内容 |
| IDX | Flag | 否 | 返回匹配子串在 key1 和 key2 中的索引范围 |
| MINMATCHLEN | Integer | 否 | 配合 IDX 使用,只返回长度 >= min-match-len 的匹配 |
| WITHMATCHLEN | Flag | 否 | 配合 IDX 使用,返回匹配子串的长度 |
*返回值
- String:默认返回最长公共子序列的内容
- Integer:使用 LEN 选项时返回长度
- Array / Map:使用 IDX 选项时返回匹配的索引对(RESP3 返回 Map)
- Error:键不存在时视为空字符串、键不是字符串类型
*时间复杂度
O(N * M),其中 N 和 M 分别为两个字符串的长度。对大字符串执行 LCS 计算开销较大。
*示例
*基本用法
> SET str1 "hello world"
OK
> SET str2 "hello redis"
OK
> LCS str1 str2
"hello "
*只返回长度
> LCS str1 str2 LEN
(integer) 6
*返回匹配索引
> LCS str1 str2 IDX
1) "matches"
2) 1) 1) 1) (integer) 0
2) (integer) 4
2) 1) (integer) 0
2) (integer) 4
2) 1) 1) (integer) 6
2) (integer) 6
2) 1) (integer) 6
2) (integer) 6
3) "len"
4) (integer) 6
*过滤短匹配
> LCS str1 str2 IDX MINMATCHLEN 3
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| WRONGTYPE Operation against a key holding the wrong kind of value | 键不是字符串类型 | 确保 key1 和 key2 都是 String 类型 |
| ERR syntax error | 同时使用了 LEN 和 IDX | LEN 和 IDX 不能同时使用,两者语义互斥 |
*最佳实践
- LCS 适合文本 diff、版本比较、DNA 序列分析等场景
- 时间复杂度为 O(N*M),对长字符串(> 1KB)计算开销显著。超大文本建议在客户端使用专门的 diff 算法库
- LEN 选项在只需要判断相似度时更高效(虽然时间复杂度相同,但节省了结果序列化的开销和内存)
- IDX 选项返回的匹配索引可用于高亮显示差异部分
*FAQ
Q1: LCS 和 STRALGO LCS 有什么关系?
A: Redis 6.0 引入 STRALGO LCS;Redis 7.0 将其简化为独立的 LCS 命令,STRALGO LCS 仍保留作为别名。建议使用 LCS。
Q2: 键不存在会怎样? A: 如果 key1 或 key2 不存在,Redis 将其视为空字符串处理,不会报错。
Q3: LCS 返回的是最长公共子序列还是最长公共子串? A: 是最长公共子序列(Subsequence),不要求字符连续,但要求相对顺序一致。例如 "ABCD" 和 "AEBD" 的 LCS 是 "ABD"(非连续)。