Stream消息队列+地理空间计算+HyperLogLog去重,SCAN安全遍历+RESP协议全解析,一文把它啃透!

文章目录

  • 本篇摘要
  • 一.五大类型补充(了解即可)
        • [**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))
  • 五.本篇小结

本篇摘要

本文介绍 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 提供了 dbsizeselectflushdbflushall 等面向 Redis 数据库的操作命令。

切换数据库(select 命令)

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

如:

Redis 多数据库特性的建议

Redis 虽支持多数据库,但随版本升级不建议优先使用该特性。若需完全隔离键值对,更推荐维护多个 Redis 实例而非单实例多数据库,原因如下:

  1. Redis 未给多数据库提供太多专属特性。
  2. 不管有多少数据库,Redis 用单线程模型,不同"数据库"间命令仍需排队执行。
  3. 多数据库会增加开发、调试、运维复杂度。实际场景中优先用 0 号数据库是更优选择。

清除数据库(flushdb / flushall 命令)

  1. 作用:用于清除数据库数据。
  2. 区别
    • flushdb:仅清除当前所在数据库的数据。
    • flushall:清除所有数据库的数据。
  3. 风险提示:永远不要在线上环境执行清除数据操作,否则可能造成严重数据丢失(类似"删库跑路"风险)。

四.认识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 访问原理
客户端与服务端交互流程
  1. 建立连接:客户端通过 TCP 连接到 Redis 服务器的 6379 端口。
  2. 发送命令 :客户端将命令按 RESP 协议编码后发送(如 *2\r\n$3\r\nGET\r\n$5\r\nkey1\r\n)。
  3. 执行命令 :服务端解析命令并执行(如读取 key1 的值)。
  4. 返回结果 :服务端按 RESP 格式返回数据(如 $5\r\nhello\r\n)。
  5. 关闭连接(非必须):短连接场景下关闭,长连接可复用。
为什么能自定义客户端?
  • 开放协议:RESP 协议公开且简单,任何语言只要实现 TCP 通信和 RESP 编解码即可操作 Redis。
  • 多语言支持:Redis 官方和社区提供了 50+ 语言的客户端库(如 Java 的 Jedis、C++ 的 hiredis)。
与通用客户端的区别
  • 通用客户端 (如命令行工具 redis-cli):功能固定,适合手动操作。
  • 定制化客户端:通过编程调用 Redis API,实现业务逻辑(如自动重试、连接池、数据序列化)。

五.本篇小结

通过本篇你将了解了 Redis 五大补充类型(Stream、Geospatial 等)、SCAN 命令、数据库管理、RESP 协议及访问 GitHub 方法。知晓各类型用途与命令,学会安全遍历键,明白数据库操作风险,理解 RESP 原理,还掌握了访问 GitHub 的途径。

相关推荐
风哥2号2 小时前
数据库教程FGMT52‑PostgreSQL用户权限与安全管理
数据库·postgresql
风哥2号8 小时前
数据库教程FGMT27‑MySQL数据库基础知识与体系架构
数据库·mysql
YangYang9YangYan9 小时前
2026 校招商品分析岗位 JD 拆解,核心指标、工具与面试考点
大数据·数据库·数据分析
西安栈上月明软件科技10 小时前
从业务黑话到本体图谱:OAG本体建模五步法(西安老系统AI化改造实战)
数据库·人工智能·架构
anxiao_m10 小时前
跨云跨机房大数据迁移怎么选?不同场景工具适配指南
数据库·云启快传
wdfk_prog10 小时前
ROS教程:01 搭建 ROS1 Noetic Docker 开发环境
运维·缓存·docker·容器·ros
小程序设计11 小时前
某师范学院网络规划与设计
网络·安全
山东科恩光电11 小时前
安全触边技术在提升机械设备安全防护中的应用探讨
安全
wdfk_prog11 小时前
ros教程02:创建 catkin Workspace、Package 与第一个 ROS1 C++ Node
运维·缓存·docker·容器·ros
夕除12 小时前
redis--015
redis