Redis 入门 04:List、Set 与 Sorted Set
实验基线:Redis 7.4.11,先完成环境准备。除标注为宿主机终端的代码外,Redis 命令在该课指定的 redis-cli 中执行;不复制输出结果作为命令。
学习目标#
建立简单 FIFO 队列、唯一成员集合与按分数排序的排行榜,理解索引、排名和复杂度的限制。
原理:先确定是否有序、是否重复#
List 保存有序序列,允许重复,适合两端插入弹出。Set 保存唯一成员,没有固定顺序。Sorted Set 的成员唯一且有分数,按分数排序;同分时按成员字典序排列。分数是双精度浮点数,整数精度有范围限制。
List 弹出只是移走数据,不包含业务成功确认;消费者弹出后崩溃可能丢任务。有可靠性要求时学习 Streams 或显式处理中队列,而不是把简单 List 等同可靠消息系统。
实验:FIFO 队列#
UNLINK learn:collection:queue learn:collection:users learn:collection:rank
RPUSH learn:collection:queue task-1 task-2 task-3
LRANGE learn:collection:queue 0 -1
LPOP learn:collection:queue
LLEN learn:collection:queue
预期队列长度 3,遍历得到 task-1、task-2、task-3,弹出 task-1,剩余长度 2。LRANGE 的结束索引包含在结果内,-1 表示最后一个元素。大型 List 不要一次读取 0 到 -1。
实验:去重#
SADD learn:collection:users alice bob alice
SCARD learn:collection:users
SISMEMBER learn:collection:users alice
SMEMBERS learn:collection:users
SADD 返回 2,重复的 alice 不增加成员数。SCARD 是 2,SISMEMBER 是 1。SMEMBERS 得到 alice 和 bob,返回顺序不作保证;大集合使用 SSCAN 分批读取。
实验:排行榜#
ZADD learn:collection:rank 100 alice 80 bob 120 carol
ZREVRANGE learn:collection:rank 0 2 WITHSCORES
ZINCRBY learn:collection:rank 30 bob
ZREVRANK learn:collection:rank bob
ZSCORE learn:collection:rank bob
首次前三名为 carol 120、alice 100、bob 80。增加后 bob 是 110 分,逆序排名返回 1,即第二名;展示给用户时加一。同分成员并不是按提交时间排名,业务需要同分优先规则时必须单独设计。
常见错误#
- 把 List 下标 0 理解成最后插入:取决于你使用 LPUSH 还是 RPUSH。
- 假定 SMEMBERS 稳定排序:Set 无序。
- ZADD 相同成员生成两条记录:它更新分数。
- 使用 ZREVRANGE 0 -1 输出十万名:只读取实际展示范围。
练习与参考答案#
把 dave 以 115 分加入榜单,读取前两名,再判断是否在前三:
ZADD learn:collection:rank 115 dave
ZREVRANGE learn:collection:rank 0 1 WITHSCORES
ZREVRANK learn:collection:rank dave
预期 carol 120、dave 115;dave 的零基排名为 1,小于 3,所以在前三。所有实验键设置 10 分钟寿命:
EXPIRE learn:collection:queue 600
EXPIRE learn:collection:users 600
EXPIRE learn:collection:rank 600
清理#
UNLINK learn:collection:queue learn:collection:users learn:collection:rank
官方参考#
List · Set · Sorted Set
学习导航#
上一课:Redis 入门 03:String 与 Hash · 学习目录 · 下一课:Redis 入门 05:缓存读写与失效处理







