*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"(非连续)。