Redis 核心数据结构速查与终端演练
欢迎关注专栏CSDNAI 开发技术上一篇Redis 多环境安装部署与网络排错实战下一篇大模型 Agent 开发实战Redis 缓存与锁的高阶应用Redis 核心数据结构速查与终端演练Redis 核心数据结构速查与终端演练1. 业务背景 / 核心问题2. 全局键值管理 (Global Keys)终端实操演练3. 字符串 (String)终端实操演练4. 列表 (List)终端实操演练5. 集合 (Set)终端实操演练6. 有序集合 (ZSet / Sorted Set)终端实操演练7. 哈希 (Hash)终端实操演练8. 消息与流处理 (Pub/Sub Stream)8.1 传统发布订阅 (Pub/Sub)8.2 数据流 (Stream)终端实操演练9. 扩展结构空间、位图、事务9.1 地理空间 (Geospatial)Geospatial 演练9.2 位图 (Bitmap) 与 位域 (Bitfield)9.3 弱事务机制 (Transactions)Redis 核心数据结构速查与终端演练关键词命令速查, String, List, Set, Hash, ZSet, Stream, 终端回显阅读耗时约 25 分钟1. 业务背景 / 核心问题Redis 提供了多种数据结构不同结构对应不同的访问模式。本文按照“概念速查 → 命令表格 → 终端演练”展开重点说明命令用途以及容易被忽略的生产边界。前置说明Redis 键区分大小写字符串是二进制安全的。使用redis-cli --raw可以让客户端直接按原始形式显示中文等内容。2. 全局键值管理 (Global Keys)场景命令语法示例说明渐进式扫描键名SCAN [cursor] MATCH [pattern] COUNT [count]生产环境优先使用按游标分批遍历一次性匹配键名KEYS [pattern]仅建议在小型测试数据集或调试场景使用判断键是否存在EXISTS [key]返回 1 表示存在0 表示不存在删除指定键DEL [key]DEL session:01危险操作 (清空全库)FLUSHALL清空实例中的全部数据库不要在共享或生产实例演练查看过期时间TTL [key]-1 (无过期), -2 (已过期), 正数 (剩余秒数)设定过期时间EXPIRE [key] [seconds]EXPIRE token 3600清空屏幕输出clear仅清理终端显示终端实操演练检索与判断使用SCAN 0 MATCH user:* COUNT 100分批扫描键再用EXISTS判断目标键是否存在。过期管理使用EXPIRE为测试键设置过期时间并用TTL检查剩余时间。KEYS *会一次性遍历当前数据库的键空间数据量大时可能阻塞 Redis。FLUSHALL会删除整个实例的数据本文不把它列为常规练习步骤。更多说明可参考 Redis 键空间操作文档。3. 字符串 (String)最基础的数据类型适用于普通键值缓存和计数器。字符串也可作为分布式锁的底层原语但正确实现还需要唯一锁值、过期时间和原子校验释放不能只依赖一个SET NX。场景命令语法创建/更新键值SET [key] [value]获取键的值GET [key]创建/更新并设置过期时间SETEX [key] [seconds] [value]原子创建防重复SET [key] [value] NX EX [seconds]终端实操演练基础写入与读取SET keyname test0425-GET keyname。结合过期机制使用SETEX keyname 20 test0425一步完成写入与超时配置。4. 列表 (List)List 在命令层表现为有序字符串序列支持从头尾两端插入、读取和弹出。它可用于简单的先进先出队列但需要消费确认、重试或消费者组时应优先评估 Redis Stream 或专业消息队列。场景命令语法头部 (左侧) 插入LPUSH [key] [value1] [value2]...尾部 (右侧) 插入RPUSH [key] [value1] [value2]...弹出头部并删除LPOP [key] [count]弹出尾部并删除RPOP [key] [count]截取指定范围 (保留)LTRIM [key] [start_index] [stop_index]查看全部列表元素LRANGE [key] 0 -1查看列表长度LLEN [key]终端实操演练元素插入使用LPUSH从左侧压入若是多个元素会依次压入导致逆序。使用RPUSH从右侧追加保持顺序列队。范围读取与修剪LRANGE listname 0 -1查看所有内容。LTRIM listname 1 3实现只保留索引 1 到 3 的元素即截断滑动窗口。元素弹出机制使用RPOP和LPOP弹出并消耗列表两端的元素。获取队列长度LLEN返回当前剩余数量。5. 集合 (Set)无序不可重复的集合适合做好友关注、抽奖人员去重、以及高阶的交并差集运算。场景命令语法添加元素SADD [key] [member1] [member2]...获取集合所有元素SMEMBERS [key]删除特定元素SREM [key] [member]判断元素是否存在SISMEMBER [key] [member]求交集 (共有元素)SINTER [key1] [key2]求并集 (融合元素)SUNION [key1] [key2]求差集 (A 有 B 无)SDIFF [key1] [key2]终端实操演练基础去重插入与判断重复的插入操作如再插一次setnum1将返回0。删除单个元素使用SREM setname member。高级集合运算寻找共同好友交集SINTER汇总所有标签并集SUNION过滤掉已读名单差集SDIFF6. 有序集合 (ZSet / Sorted Set)在集合的基础上为每个元素关联一个浮点类型的分数 (score)Redis 会根据分数从小到大自动排序。适合处理积分排行榜、优先级队列。场景命令语法添加元素及分数ZADD [key] [score] [member]升序获取元素 (带分数)ZRANGE [key] 0 -1 WITHSCORES查看成员分数ZSCORE [key] [member]获取升序排名 (从0算起)ZRANK [key] [member]获取降序排名ZREVRANK [key] [member]为指定成员加分ZINCRBY [key] [increment] [member]删除成员ZREM [key] [member]终端实操演练批量添加并查看顺序注意ZADD的语法是先分数后元素名。积分查询与排名查询num1的绝对分数。查询排名ZRANK结果从 0 开始ZREVRANK是反向的高分第一名。动态加分与减分使用负数即可实现减分操作。移除成员使用ZREM leaderboard user:1。7. 哈希 (Hash)键值对的嵌套字典结构特别适合用来存储对象如用户详情的属性。场景命令语法添加单个/多个字段HSET [key] [field] [value]获取特定字段值HGET [key] [field]获取对象所有字段名HKEYS [key]提取对象全部键值对HGETALL [key]删除特定字段HDEL [key] [field]判断字段是否存在HEXISTS [key] [field]终端实操演练设置对象属性使用HSET person name Y age 36记录属性。提取对象数据只看字段名列表。读取单个字段的值。一键提取所有数据。字段删除与校验使用HDEL删除字段再用HEXISTS验证。8. 消息与流处理 (Pub/Sub Stream)8.1 传统发布订阅 (Pub/Sub)Pub/Sub 用于实时广播不持久化消息订阅者断线期间的消息无法在重连后补收因此不适合作为要求可靠交付的任务队列。场景命令语法订阅频道 (阻塞接收)SUBSCRIBE [channel]发布消息PUBLISH [channel] [message]8.2 数据流 (Stream)Redis 5.0 引入了 Stream支持保留消息、范围查询和消费者组。消息能否在故障后恢复仍取决于 Redis 持久化、复制及确认处理配置。场景命令语法发送新消息 (* 为自动ID)XADD [stream_key] * [field] [value]查看队列范围消息XRANGE [stream_key] - 阻塞轮询读取新消息XREAD COUNT [num] BLOCK [ms] STREAMS [key] 0创建消费者组XGROUP CREATE [stream_key] [group_name] 0组内消费者抢占消息XREADGROUP GROUP [group_name] [consumer] STREAMS [stream_key] 处理完毕后 ACK 确认XACK [stream_key] [group_name] [message_id]终端实操演练消息生产与基础查询自动生成 ID 发送与自定义 ID 发送。长度与内容检索。消息的删除与截断清空XTRIM MAXLEN 0。基础读取阻塞模型阻塞 1000ms 等待读取队列内容。高级特性消费者组处理流程消费者 A (ConsumerA) 首先使用XREADGROUP ... 抢占到最新的多条未读消息。消费者 A 处理完成后必须发送XACK通知服务器该消息已完结防止消息变成长期 Pending 状态。此时同组的另一个消费者 B 将无法再次读取到这些已被消费过且 ACK 的消息。9. 扩展结构空间、位图、事务9.1 地理空间 (Geospatial)基于经纬度的高级结构适用于外卖骑手位置、附近的人等距离计算业务。场景命令语法添加位置坐标GEOADD [key] [lon] [lat] [member]获取成员坐标GEOPOS [key] [member]计算两地直线距离GEODIST [key] [member1] [member2] [unit]圆形半径搜索GEOSEARCH [key] FROMMEMBER [member] BYRADIUS [radius] [unit]矩形区块搜索GEOSEARCH [key] FROMMEMBER [member] BYBOX [w] [h] [unit]Geospatial 演练写入坐标批量录入中国核心城市的经纬度。信息提取与距离计算查询坐标和计算“北京”到“上海”的绝对距离。附近范围检索搜索上海周边 300km 的城市圈圆形搜索。搜索坐标系中的矩形框块。9.2 位图 (Bitmap) 与 位域 (Bitfield)Bitmap基于 String 的位级操作。一位占 1 bit0 或 1适合高密度的签到、布尔状态记录。Bitfield允许在一段二进制数据中读写不同位宽的整数字段可用于紧凑状态编码。场景命令语法签到打卡 (写比特位)SETBIT [key] [offset] [0/1]查询签到状态GETBIT [key] [offset]统计总签到次数BITCOUNT [key]Bitfield 整段写入BITFIELD [key] set i8 [offset] [value]9.3 弱事务机制 (Transactions)利用MULTI开启命令队列EXEC让队列中的命令连续执行不会被其他客户端命令插入。注意如果某条命令在执行阶段出错Redis 不会像关系型数据库那样回滚已经执行的命令后续合法命令仍可能继续执行。