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 的途径。

相关推荐
ao_lang2 小时前
MySQL--多版本并发控制(MVCC)
数据库·mysql
JIAWAP2 小时前
Redis数据安全性分析之RDB详解
数据库·redis·分布式·缓存
霸王大陆2 小时前
《零基础学PHP:从入门到实战》教程-模块七:MySQL 数据库基础-5
数据库·mysql·php
翔云1234562 小时前
mysql.gtid_executed 表的初始化和更新机制
数据库·mysql·adb
alphaTao2 小时前
LeetCode 每日一题 2025/12/1-2025/12/7
数据库·算法·leetcode
2501_916766542 小时前
【Mybatis】延迟加载与多级缓存
缓存·mybatis
马克学长2 小时前
SSM特种设备全生命周期管理系统8b729(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·特种设备管理·全生命周期
!!!!!!!!!!!!!!!!.2 小时前
CTF WEB入门 命令执行篇71-124
笔记·学习·安全·ctf
小馒头学python2 小时前
openEuler 向量数据库:Milvus 相似度搜索性能测试
数据库·milvus·openeuler