烟台市网站建设_网站建设公司_jQuery_seo优化
2026/1/3 17:13:41 网站建设 项目流程

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

文章目录

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

在这里插入图片描述

本篇摘要

本文介绍 Redis 五大补充类型(如 Stream 做消息队列、Geospatial 用于地图导航等)及其命令,讲解 SCAN 渐进式遍历键、数据库管理(select、flush 等)、RESP 通信协议。

一.五大类型补充(了解即可)

1. Stream(消息流)—— Redis 的“消息队列”

用途:用来处理实时消息,比如聊天记录、订单流水、日志流。
通俗理解

  • 就像微信群聊,新消息一条接一条,每个人都能看到历史记录。
  • 支持“消费者组”,比如外卖系统:一个订单消息可以被“商家”“骑手”“用户”三个角色各自处理。

核心命令

  • XADD 添加消息(如:XADD chat * user "张三" msg "你好"
  • XREAD 读取消息(支持阻塞等待新消息)
  • XGROUP 管理消费者组
2. Geospatial(地理空间)—— Redis 的“地图导航”

用途:存储地理位置,计算距离、查找附近地点。
通俗理解

核心命令

3. HyperLogLog(基数统计)—— Redis 的“去重计数器”

用途:快速统计海量数据中的不重复数量,它只记录特征,只用于统计,不记录元素,通过位运算进行。(如网站UV)。
通俗理解

  • 像统计一个广场上有多少人,每个人只算一次,即使他来回走了10遍。
  • 特点:占用内存极小(12KB能统计上亿数据),但有0.81%误差。

核心命令

  • PFADD 记录数据(如:PFADD uv "用户A" "用户B"
  • PFCOUNT 统计总数(如:PFCOUNT uv
  • PFMERGE 合并统计(如合并两天的UV)
4. Bitmaps(位图)—— Redis 的“打卡神器”

用途:用二进制位记录状态,类似于特化的set,更节省空间,比较广泛实用(如签到、开关标记)。
通俗理解

核心命令

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. 基本语法

在这里插入图片描述

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 是 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) 协议进行客户端与服务端的通信,特点如下:

举个例子(客户端发送 GET key1):

*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 五大补充类型(Stream、Geospatial 等)、SCAN 命令、数据库管理、RESP 协议及访问 GitHub 方法。知晓各类型用途与命令,学会安全遍历键,明白数据库操作风险,理解 RESP 原理,还掌握了访问 GitHub 的途径。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询