Skip to content
← 返回Redis列表
数据与原子性

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 只约定序列化格式,不会自动获得字段级命令。

基本操作示例 ​

text
SET learn:types:count 10
INCRBY learn:types:count 2
GET learn:types:count

预期最后读取到 12。INCRBY 在服务端完成加法,避免客户端先读再写的覆盖问题;值必须满足整数格式和范围要求。不要把一次命令的原子性推广成整个业务流程的原子性。

参考:String。

游戏与后端场景 ​

场景建模与操作需要补齐的业务规则
会话令牌SET sess:token uid EX 3600token 应不可预测;过期、撤销和续期需定义清楚
幂等请求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 对引号、>、*、括号等符号进行解释。每个例子独立使用;换例子前重新执行下面的准备段,否则删除、弹出、过期和修改操作会影响后续结果。准备段仅重置列出的教学键,确认这些键不承载业务数据。

text
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 LEN
abcdef 与 ace 的最长公共子序列长度为 3。
O(N×M)

数值运算 ​

命令与用途示例与结果复杂度
INCR
整数加一
INCR learn:{string}:count
10 变成 11,返回 11。
O(1)
INCRBY
整数增加指定值
INCRBY learn:{string}:count 5
10 变成 15。
O(1)
DECR
整数减一
DECR learn:{string}:count
10 变成 9。
O(1)
DECRBY
整数减少指定值
DECRBY learn:{string}:count 3
10 变成 7。
O(1)
INCRBYFLOAT
浮点数增加
INCRBYFLOAT learn:{string}:ratio 0.25
1.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)
版本与复杂度补充

下表保留每条命令的引入版本、兼容状态及复杂度符号含义;复杂度不包含全部网络传输、内存分配和等待成本。

命令引入版本与状态复杂度说明
SET1.0.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
GET1.0.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
APPEND2.0.0小追加摊还 O(1);扩容和大字节追加还有复制成本。
STRLEN2.2.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
GETRANGE2.4.0O(B),B 为返回字节数;小范围可近似看作常数开销。
SETRANGE2.2.0O(B),B 为写入字节数;扩容和填零还有额外成本。
MGET1.0.0O(K),K 为本次键数。
MSET1.0.1O(K),K 为本次键数。
MSETNX1.0.1O(K),K 为本次键数。
GETDEL6.2.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
GETEX6.2.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
LCS7.0.0O(N×M),N、M 为两个字符串长度。
INCR1.0.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
INCRBY1.0.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
DECR1.0.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
DECRBY1.0.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
INCRBYFLOAT2.6.0O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
GETSET1.0.0;从 6.2.0 起弃用(兼容保留)O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
SETNX1.0.0;从 2.6.12 起弃用(兼容保留)O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
SETEX2.0.0;从 2.6.12 起弃用(兼容保留)O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
PSETEX2.6.0;从 2.6.12 起弃用(兼容保留)O(1)。大值复制、扩容、网络输出和等待时间需另外考虑。
SUBSTR1.0.0;从 2.0.0 起弃用(兼容保留)O(B),B 为返回字节数;小范围可近似看作常数开销。

SET ... GET 从 6.2 起支持,NX 与 GET 联用从 7.0 起支持;KEEPTTL 从 6.0 起支持。条件写入要按具体选项判断返回语义。

通用键操作见键与过期时间,这里集中列出类型自身的命令。

继续阅读