文章目录
- 本篇摘要
- 一.五大类型补充(了解即可)
-
-
-
- [**1. Stream(消息流)------ Redis 的"消息队列"**](#1. Stream(消息流)—— Redis 的“消息队列”)
- [**2. Geospatial(地理空间)------ Redis 的"地图导航"**](#2. Geospatial(地理空间)—— Redis 的“地图导航”)
- [**3. HyperLogLog(基数统计)------ Redis 的"去重计数器"**](#3. HyperLogLog(基数统计)—— Redis 的“去重计数器”)
- [**4. Bitmaps(位图)------ Redis 的"打卡神器"**](#4. Bitmaps(位图)—— Redis 的“打卡神器”)
- [**5. Bitfields(位域)------ Redis 的"二进制乐高"**](#5. Bitfields(位域)—— Redis 的“二进制乐高”)
- **对比总结**
-
-
- 二.SCAN命令
-
-
-
- [1. 核心作用](#1. 核心作用)
- [2. 基本语法](#2. 基本语法)
- [4. 对比其他遍历/匹配命令](#4. 对比其他遍历/匹配命令)
- [5. 使用注意事项](#5. 使用注意事项)
-
-
- 三.数据库管理
-
-
- [Redis 面向数据库的操作命令](#Redis 面向数据库的操作命令)
- [切换数据库(select 命令)](#切换数据库(select 命令))
- [Redis 多数据库特性的建议](#Redis 多数据库特性的建议)
- [清除数据库(flushdb / flushall 命令)](#清除数据库(flushdb / flushall 命令))
-
- [四.认识Redis的RESP(REdis Serialization Protocol)](#四.认识Redis的RESP(REdis Serialization Protocol))
-
-
-
- [**1. Redis 通信协议(RESP)**](#1. Redis 通信协议(RESP))
- [**2. Redis 访问原理**](#2. Redis 访问原理)
-
-
- 五.本篇小结

本篇摘要
本文介绍 Redis 五大补充类型(如 Stream 做消息队列、Geospatial 用于地图导航等)及其命令,讲解 SCAN 渐进式遍历键、数据库管理(select、flush 等)、RESP 通信协议。
一.五大类型补充(了解即可)
1. Stream(消息流)------ Redis 的"消息队列"
用途 :用来处理实时消息,比如聊天记录、订单流水、日志流。
通俗理解:
- 就像微信群聊,新消息一条接一条,每个人都能看到历史记录。
- 支持"消费者组",比如外卖系统:一个订单消息可以被"商家""骑手""用户"三个角色各自处理。
核心命令:
XADD添加消息(如:XADD chat * user "张三" msg "你好")XREAD读取消息(支持阻塞等待新消息)XGROUP管理消费者组
2. Geospatial(地理空间)------ Redis 的"地图导航"
用途 :存储地理位置,计算距离、查找附近地点。
通俗理解:
- 像手机里的地图APP,可以标记"我家""公司",计算两者距离,或者搜索"附近3公里的奶茶店"。
核心命令:
GEOADD添加地点(如:GEOADD shops 116.40 39.90 "北京店")GEODIST计算距离(如:GEODIST shops "北京店" "上海店" km)GEORADIUS搜索附近(如:GEORADIUS shops 116.40 39.90 5 km)
3. HyperLogLog(基数统计)------ Redis 的"去重计数器"
用途 :快速统计海量数据中的不重复数量,它只记录特征,只用于统计,不记录元素,通过位运算进行。(如网站UV)。
通俗理解:
- 像统计一个广场上有多少人,每个人只算一次,即使他来回走了10遍。
- 特点:占用内存极小(12KB能统计上亿数据),但有0.81%误差。
核心命令:
PFADD记录数据(如:PFADD uv "用户A" "用户B")PFCOUNT统计总数(如:PFCOUNT uv)PFMERGE合并统计(如合并两天的UV)
4. Bitmaps(位图)------ Redis 的"打卡神器"
用途 :用二进制位记录状态,类似于特化的set,更节省空间,比较广泛实用(如签到、开关标记)。
通俗理解:
- 像一张表格,每天签到打钩(1)或没签(0),一年只需365比特(约46字节)。
- 适合高频小数据(如用户是否在线、活动是否参与)。
核心命令:
SETBIT设置位(如:SETBIT sign:user1 0 1表示第1天签到)GETBIT读取位(如:GETBIT sign:user1 0)BITCOUNT统计1的数量(如计算本月签到次数)
5. Bitfields(位域)------ Redis 的"二进制乐高"
用途 :把数字拆分成多个自定义小段,其实就是对一个结构体给这里面的变量分为不同位段大小,然后对它们进行操作存储而已。(如存储RGB颜色、协议头)。
通俗理解:
- 像把一个整数切成几块,比如用32位存储:前8位存年龄,中间8位存性别,后16位存ID。
- 节省内存,避免频繁读写大整数。
核心命令:
BITFIELD操作位段(如:BITFIELD user SET u8 0 25表示前8位存年龄25)- 典型场景:
- 游戏角色属性压缩存储
- 物联网设备状态编码
对比总结
| 类型 | 类比现实场景 | 优势 | 适用场景 |
|---|---|---|---|
| Stream | 微信群聊/订单流水 | 支持多消费者、持久化 | 消息队列、事件日志 |
| Geospatial | 地图APP | 快速计算距离和范围 | 附近搜索、物流路径 |
| HyperLogLog | 广场人数统计 | 超省内存、海量去重 | UV统计、大数据分析 |
| Bitmaps | 每日签到表 | 极致节省空间 | 布尔标记、高频小数据 |
| Bitfields | 乐高积木拼装 | 灵活操作二进制位 | 紧凑存储多字段数据 |
二.SCAN命令
1. 核心作用
SCAN 是 Redis 提供的渐进式遍历键空间 的命令,用来替代阻塞式的 keys *(keys * 会一次性拉取所有匹配键,在大数据量时极易引发服务阻塞)。它通过"游标 + 分批返回"的方式,让你在遍历过程中既能控制内存/性能开销,又能完整遍历所有键。
2. 基本语法

bash
SCAN cursor [MATCH pattern] [COUNT count]
- cursor :游标标识(类似"迭代指针"),初始传
0启动遍历;每次执行 SCAN 后会返回新的游标 ,直到返回游标为0时,代表遍历结束,注意这里不是普通下标,可以当字符串理解,客户端无需知道,服务端对应有记录。 - MATCH pattern (可选):键名的匹配模式(类似
keys的通配符),比如MATCH user:*只匹配以user:开头的键。 - COUNT count(可选):建议每次返回的键数量(Redis 实际返回数可能不同,仅作参考)。
使用如下:


4. 对比其他遍历/匹配命令
vs keys*:keys *是"一次性全量返回",大数据量时会卡死 Redis;SCAN 是"渐进式分批返回",对服务影响极小。- vs hscan/sscan/zscan :SCAN 遍历的是数据库级别的所有键 ;而
hscan(遍历 Hash 类型字段)、sscan(遍历 Set 成员)、zscan(遍历 Sorted Set 成员) 则是针对"单个 Key 内部的成员"做渐进式遍历,语法逻辑和 SCAN 几乎一致,只是作用对象不同。
5. 使用注意事项
- 游标管理:必须用上一次返回的游标继续调用,否则迭代会中断/重复。
- 非强一致性:SCAN 过程中如果有键被增删改,可能返回重复键或漏掉某些键------它只保证"最终能遍历完所有键",不保证"遍历过程中严格不重复/不遗漏"。
- COUNT 参数 :
COUNT只是"建议值",Redis 会根据内部数据结构动态调整实际返回数量。如果想更快遍历,可适当调大COUNT;如果想减少单次网络开销,可适当调小。
总之,SCAN 是 Redis 高并发场景下安全遍历键空间 的首选方案,理解"游标迭代 + 分批返回"的逻辑,就能用它替代 keys * 来做各类键查询、统计等操作。
三.数据库管理
Redis 面向数据库的操作命令
Redis 提供了 dbsize、select、flushdb、flushall 等面向 Redis 数据库的操作命令。
切换数据库(select 命令)

- 语法 :
select dbIndex - Redis 数据库特点 :
- 多数关系型数据库(如 MySQL)靠字符串区分不同数据库名,Redis 则以数字标识多个数据库。
- Redis 默认配置有 16 个数据库,
select 0切换到第一个,select 15切换到最后一个。 - 0 号和 15 号数据库数据完全不冲突(各自有独立键值对),默认处于 0 号数据库。
如:

Redis 多数据库特性的建议
Redis 虽支持多数据库,但随版本升级不建议优先使用该特性。若需完全隔离键值对,更推荐维护多个 Redis 实例而非单实例多数据库,原因如下:
- Redis 未给多数据库提供太多专属特性。
- 不管有多少数据库,Redis 用单线程模型,不同"数据库"间命令仍需排队执行。
- 多数据库会增加开发、调试、运维复杂度。实际场景中优先用 0 号数据库是更优选择。
清除数据库(flushdb / flushall 命令)
- 作用:用于清除数据库数据。
- 区别 :
flushdb:仅清除当前所在数据库的数据。flushall:清除所有数据库的数据。
- 风险提示:永远不要在线上环境执行清除数据操作,否则可能造成严重数据丢失(类似"删库跑路"风险)。
四.认识Redis的RESP(REdis Serialization Protocol)
1. Redis 通信协议(RESP)
Redis 使用 RESP(REdis Serialization Protocol) 协议进行客户端与服务端的通信,特点如下:
- 基于 TCP/IP:Redis 服务器默认监听 6379 端口,客户端通过 TCP 连接交互。
- 文本协议:简单、易读、易实现(相比二进制协议如 Protobuf)。
- 数据类型标识 :
+:简单字符串(如+OK\r\n)-:错误信息(如-ERR invalid command\r\n)::整数(如:100\r\n)$:批量字符串(如$5\r\nhello\r\n)*:数组(如*2\r\n$3\r\nGET\r\n$5\r\nkey1\r\n)
举个例子 (客户端发送 GET key1):
plaintext
*2\r\n # 数组,2个元素
$3\r\n # 第一个元素是3字节的字符串
GET\r\n # 命令"GET"
$5\r\n # 第二个元素是5字节的字符串
key1\r\n # 键名"key1"
2. Redis 访问原理
客户端与服务端交互流程

- 建立连接:客户端通过 TCP 连接到 Redis 服务器的 6379 端口。
- 发送命令 :客户端将命令按 RESP 协议编码后发送(如
*2\r\n$3\r\nGET\r\n$5\r\nkey1\r\n)。 - 执行命令 :服务端解析命令并执行(如读取
key1的值)。 - 返回结果 :服务端按 RESP 格式返回数据(如
$5\r\nhello\r\n)。 - 关闭连接(非必须):短连接场景下关闭,长连接可复用。
为什么能自定义客户端?
- 开放协议:RESP 协议公开且简单,任何语言只要实现 TCP 通信和 RESP 编解码即可操作 Redis。
- 多语言支持:Redis 官方和社区提供了 50+ 语言的客户端库(如 Java 的 Jedis、C++ 的 hiredis)。
与通用客户端的区别
- 通用客户端 (如命令行工具
redis-cli):功能固定,适合手动操作。 - 定制化客户端:通过编程调用 Redis API,实现业务逻辑(如自动重试、连接池、数据序列化)。
五.本篇小结
通过本篇你将了解了 Redis 五大补充类型(Stream、Geospatial 等)、SCAN 命令、数据库管理、RESP 协议及访问 GitHub 方法。知晓各类型用途与命令,学会安全遍历键,明白数据库操作风险,理解 RESP 原理,还掌握了访问 GitHub 的途径。