Redis String(字符串) · 1. 定位:解决什么问题至2. 命令速查与示例
本文按 Redis 8.2.10 核对编码与配置默认值;命令的引入版本另行标注。生产配置可能不同,可通过 CONFIG GET 查询。示例面向独立实验服务,运行结果和内存数字未在本次实测。
Redis String(字符串)
本文按 Redis 8.2.10 核对编码与配置默认值;命令的引入版本另行标注。生产配置可能不同,可通过 CONFIG GET 查询。示例面向独立实验服务,运行结果和内存数字未在本次实测。
1. 定位:解决什么问题
String 是一个整体字节串,适合会话、序列化缓存和计数。需要按字段更新对象时比较 Hash;需要唯一成员及排名时比较 Set / ZSet。把 JSON 存入 String 只约定序列化格式,不会自动获得字段级命令。
基本操作示例
SET learn:types:count 10
INCRBY learn:types:count 2
GET learn:types:count预期最后读取到 12。INCRBY 在服务端完成加法,避免客户端先读再写的覆盖问题;值必须满足整数格式和范围要求。不要把一次命令的原子性推广成整个业务流程的原子性。
参考:String。
游戏与后端场景
| 场景 | 建模与操作 | 需要补齐的业务规则 |
|---|---|---|
| 会话令牌 | SET sess:token uid EX 3600 | token 应不可预测;过期、撤销和续期需定义清楚 |
| 幂等请求 | SET idem:req-id processing NX EX 86400 | 未取得占位不代表业务已成功;还需存处理状态、结果和请求摘要 |
| 固定窗口限流 | INCR,首次写入设置过期 | 增加与首次过期设置需在同一 Lua 操作中完成,避免永久计数键 |
| 缓存击穿保护 | 读缓存未命中后短租约合并回源 | 失败时释放或等待租约到期,回填须考虑旧值覆盖 |
| 每日任务 | 键包含业务日期,使用 EXPIREAT | 按约定时区计算下一次重置,不把一天固定当成 86400 秒 |
| 分布式锁 | SET lock:x token NX PX 10000 | 只由持有同一 token 的调用者释放,处理租约过期和故障切换 |
2. 命令速查与示例
按用途分组,共 22 项,覆盖 Redis 8.2.10 的本类型命令及子命令。点击命令名查看官方参数。示例在 redis-cli 中逐行输入,每次换例子前重置下面的教学数据。
准备与重置示例数据
在独立实验实例的 redis-cli 交互模式逐行输入,避免 shell 对引号、>、*、括号等符号进行解释。每个例子独立使用;换例子前重新执行下面的准备段,否则删除、弹出、过期和修改操作会影响后续结果。准备段仅重置列出的教学键,确认这些键不承载业务数据。
UNLINK learn:{string}:text learn:{string}:count learn:{string}:ratio learn:{string}:left learn:{string}:right learn:{string}:new1 learn:{string}:new2
SET learn:{string}:text hello
SET learn:{string}:count 10
SET learn:{string}:ratio 1.5
SET learn:{string}:left abcdef
SET learn:{string}:right ace示例的返回说明以刚完成准备段为前提,随机结果与剩余 TTL 不固定。带同一 {...} 的教学键便于在 Cluster 中满足相关多键操作的同槽要求。
读写与子串
| 命令与用途 | 示例与结果 | 复杂度 |
|---|---|---|
| SET 写入或覆盖字符串 | SET learn:{string}:text world GET返回旧字符串 hello;GET 选项从 6.2 起支持。 | O(1) |
| GET 读取字符串 | GET learn:{string}:text返回 hello;不存在时返回空值。 | O(1) |
| APPEND 追加内容 | APPEND learn:{string}:text "!"字符串变成 hello!,返回新长度 6。 | 小追加摊还 O(1) |
| STRLEN 读取字节长度 | STRLEN learn:{string}:text返回 5;不是 Unicode 字符数。 | O(1) |
| GETRANGE 读取字节区间 | GETRANGE learn:{string}:text 0 1返回 he,结束下标包含在内。 | O(B) |
| SETRANGE 覆盖指定偏移的字节 | SETRANGE learn:{string}:text 1 a得到 hallo,返回长度 5;大偏移可能扩容。 | O(B) |
| MGET 批量读取 | MGET learn:{string}:text learn:{string}:count依次返回 hello 与 10。 | O(K) |
| MSET 批量设置 | MSET learn:{string}:text hi learn:{string}:count 20返回 OK,两个键一起设置。 | O(K) |
| MSETNX 所有键不存在时批量写入 | MSETNX learn:{string}:new1 a learn:{string}:new2 b返回 1;任意目标已存在则全部不写并返回 0。 | O(K) |
| GETDEL 读取并删除 | GETDEL learn:{string}:text返回 hello 并删除键。 | O(1) |
| GETEX 读取并设置过期 | GETEX learn:{string}:text EX 60返回 hello,并设置整个键 60 秒过期。 | O(1) |
| LCS 最长公共子序列 | LCS learn:{string}:left learn:{string}:right LENabcdef 与 ace 的最长公共子序列长度为 3。 | O(N×M) |
数值运算
| 命令与用途 | 示例与结果 | 复杂度 |
|---|---|---|
| INCR 整数加一 | INCR learn:{string}:count10 变成 11,返回 11。 | O(1) |
| INCRBY 整数增加指定值 | INCRBY learn:{string}:count 510 变成 15。 | O(1) |
| DECR 整数减一 | DECR learn:{string}:count10 变成 9。 | O(1) |
| DECRBY 整数减少指定值 | DECRBY learn:{string}:count 310 变成 7。 | O(1) |
| INCRBYFLOAT 浮点数增加 | INCRBYFLOAT learn:{string}:ratio 0.251.5 变成 1.75;不用于精确资金账目。 | O(1) |
旧版兼容命令
| 命令与用途 | 示例与结果 | 复杂度 |
|---|---|---|
| GETSET 旧式读取并覆盖 | GETSET learn:{string}:text world返回 hello;新代码优先 SET ... GET。 | O(1) |
| SETNX 旧式仅不存在时写入 | SETNX learn:{string}:new1 value返回 1;新代码优先 SET ... NX,可同时指定 TTL。 | O(1) |
| SETEX 旧式写入并设置秒过期 | SETEX learn:{string}:new1 60 value返回 OK;新代码用 SET key value EX 60。 | O(1) |
| PSETEX 旧式写入并设置毫秒过期 | PSETEX learn:{string}:new1 60000 value返回 OK;新代码用 SET key value PX 60000。 | O(1) |
| SUBSTR 旧式读取子串 | SUBSTR learn:{string}:text 0 1返回 he;新代码用 GETRANGE。 | O(B) |
版本与复杂度补充
下表保留每条命令的引入版本、兼容状态及复杂度符号含义;复杂度不包含全部网络传输、内存分配和等待成本。
| 命令 | 引入版本与状态 | 复杂度说明 |
|---|---|---|
| SET | 1.0.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| GET | 1.0.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| APPEND | 2.0.0 | 小追加摊还 O(1);扩容和大字节追加还有复制成本。 |
| STRLEN | 2.2.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| GETRANGE | 2.4.0 | O(B),B 为返回字节数;小范围可近似看作常数开销。 |
| SETRANGE | 2.2.0 | O(B),B 为写入字节数;扩容和填零还有额外成本。 |
| MGET | 1.0.0 | O(K),K 为本次键数。 |
| MSET | 1.0.1 | O(K),K 为本次键数。 |
| MSETNX | 1.0.1 | O(K),K 为本次键数。 |
| GETDEL | 6.2.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| GETEX | 6.2.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| LCS | 7.0.0 | O(N×M),N、M 为两个字符串长度。 |
| INCR | 1.0.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| INCRBY | 1.0.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| DECR | 1.0.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| DECRBY | 1.0.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| INCRBYFLOAT | 2.6.0 | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| GETSET | 1.0.0;从 6.2.0 起弃用(兼容保留) | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| SETNX | 1.0.0;从 2.6.12 起弃用(兼容保留) | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| SETEX | 2.0.0;从 2.6.12 起弃用(兼容保留) | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| PSETEX | 2.6.0;从 2.6.12 起弃用(兼容保留) | O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。 |
| SUBSTR | 1.0.0;从 2.0.0 起弃用(兼容保留) | O(B),B 为返回字节数;小范围可近似看作常数开销。 |
SET ... GET 从 6.2 起支持,NX 与 GET 联用从 7.0 起支持;KEEPTTL 从 6.0 起支持。条件写入要按具体选项判断返回语义。
通用键操作见键与过期时间,这里集中列出类型自身的命令。
继续阅读
- 数据与原子性
- 数据与原子性
- 完整实践