跳转至

数据类型与常用命令

Redis 的 key 是名字,value 是这个名字对应的数据。shop:product:1001 是一个 key,冒号只是方便人理解的命名习惯,并不会自动生成文件夹。

下面命令在实验 Redis 的 redis-cli 中执行,统一使用 learn: 前缀。命令针对不同的数据类型;用 GET 读取一个 Hash,会得到 WRONGTYPE,这通常是命令选错或 key 被其他应用写成了另一种类型。

String:一个值,最常见

SET learn:product:1001 '{"name":"keyboard","price":199}' EX 300
GET learn:product:1001
TYPE learn:product:1001
TTL learn:product:1001

这里把 JSON 文本当成一个 String 保存,EX 300 表示 300 秒后过期。Redis 的普通 String 命令不会理解里面的 price 字段,修改通常是应用重新写整段内容。

String 也能保存可递增的整数:

SET learn:views:1001 0
INCR learn:views:1001
INCRBY learn:views:1001 10
GET learn:views:1001

最后得到 11。INCR 是单条原子命令,同时有多个客户端加一时,不会像“先 GET 再自己加一 SET”那样互相覆盖。原子执行不代表已经同步到副本或磁盘。

Hash:一个对象的多个字段

HSET learn:user:1005 name "kk" city "Shanghai" visits 1
HGET learn:user:1005 city
HINCRBY learn:user:1005 visits 1
HGETALL learn:user:1005

它适合按字段读取或更新的小对象。HSET 可以只改 city,而不必重新提交整个对象。大 Hash 上 HGETALL 会一次返回很多内容,要用 HSCAN 分批遍历,或者直接按字段读取。

List:有先后顺序,允许重复

RPUSH learn:jobs job-a job-b job-a
LRANGE learn:jobs 0 9
LPOP learn:jobs

从右边放入、左边取出,形成先进先出的顺序。LPOP 返回并移除 job-a。简单队列容易理解,但消费者取出后崩溃,消息可能丢失;需要确认和重新投递时应设计可靠消费流程,或使用 Streams/专用消息队列。

BLPOP key timeout 可以等待数据,阻塞的是这条客户端连接,并不让整个 Redis 停下来;不要让它占住应用所有连接。

Set:不重复的成员集合

SADD learn:online-users user-a user-b user-a
SCARD learn:online-users
SISMEMBER learn:online-users user-a
SREM learn:online-users user-b

添加三次但只有两个不同成员,SCARD 返回 2。可以用来去重、记录标签或集合关系。普通 Set 的成员不会因用户断线自动消失,在线状态还需要应用心跳和清理规则。

Sorted Set:每个成员有一个分数

ZADD learn:ranking 90 user-a 80 user-b
ZINCRBY learn:ranking 15 user-b
ZRANGE learn:ranking 0 9 REV WITHSCORES

user-b 的分数变成 95,排在 90 分的 user-a 前面。它适合排行榜、按时间排序的任务索引等。成员唯一,score 决定排序;排名更新是应用主动执行的。

常用五类的数据结构与命令入口见 Redis 数据类型

TTL:这条数据什么时候失效

命令 用途
EXPIRE learn:user:1005 600 给已有 key 设置 600 秒有效期
TTL learn:user:1005 查看剩余秒数;-1 无过期时间,-2 key 不存在
PTTL learn:user:1005 查看剩余毫秒数
PERSIST learn:user:1005 移除过期时间,要确认是否允许长期保留
EXISTS learn:user:1005 检查 key 是否存在
UNLINK learn:user:1005 移除 key,并把适合异步处理的数据释放交给后台

覆盖 String 的普通 SET 默认会清除原 TTL;保留有效期要使用相应选项,或者写入时重新设置过期时间。对 String,SET ... EX ... 把写入与设置有效期合在一条命令,避免进程在 SET 后、EXPIRE 前退出留下永久 key。

Hash 等集合在这里演示的是整个 key 的过期时间,不把不同 Redis 版本的字段过期特性混在一起。覆盖和 TTL 选项参见 SET 命令

Streams 和 Pub/Sub:都能传消息,可靠性不同

Pub/Sub 像广播:在线订阅者收到消息,断线期间的消息不会等它回来。适合允许遗漏的实时通知,不适合直接作为必须可靠处理的订单任务通道。Pub/Sub 说明

Streams 像追加的事件记录,可以读取历史、使用消费者组和确认机制:

XADD learn:events * type order-created order_id 90001
XRANGE learn:events - + COUNT 5
XGROUP CREATE learn:events ops 0
XREADGROUP GROUP ops worker-1 COUNT 1 STREAMS learn:events >

读完后,消费者完成业务处理再 XACK learn:events ops <实际消息ID>XPENDING learn:events ops 能看到未确认消息,超时任务可由消费逻辑接管。确认不等于从流中删除,仍要设置保留和裁剪策略。消费可能重复,业务处理需要幂等。

其他结构先认识用途

能力 常见用途 注意点
Bitmap 签到、有无状态 按 bit 编码,需要规划位置与数据范围
HyperLogLog 估算不同访客数 结果是近似计数,不能拿到完整成员列表
GEO 附近位置查找 适合地理位置索引,不能代替完整 GIS 系统

Pipeline、事务和 Lua 分别做什么

Pipeline 是把多条命令批量发送,减少来回等待;它不保证这一批命令与其他客户端隔离,也不提供回滚,批次太大还会占用缓冲内存。

MULTI/EXEC 将一组命令排队后连续执行。执行阶段某条命令报错,不会回滚已经成功的命令。WATCH 可在执行前检查关注的 key 是否被修改,冲突时由应用重试。事务说明

Lua 可以把“判断再写入”放到服务端原子执行,减少竞争窗口,但长脚本会阻塞其他请求;脚本报错也不能依赖自动回滚此前写入。Cluster 中多 key 操作还要考虑同槽要求。

读完这一页,继续看 应用缓存,把这些命令放到业务请求里理解。