第九章:了解特殊场景下的redis

一.特殊场景下的redis命令

概念:

Redis 提供了多种高级数据类型来应对不同的业务需求,其中 Streams 是一种日志结构化的消息队列类型,支持多生产者、多消费者模型,适用于事件流处理和任务分发等场景;Geospatial 则用于存储地理空间数据(如经纬度坐标),支持基于位置的半径查询,非常适合实现“附近的人”、“附近的商家”等功能;HyperLogLog 是一种基于概率的计数器,用于高效估算集合中唯一元素的个数,极大地节省内存,常用于 UV 统计;Bitmaps 通过位图实现高效状态标记,适用于布尔值记录场景,比如用户是否登录、是否签到等操作;Bitfields 是位图的进一步扩展,允许以结构化的方式存储和操作多个位段,可进行位级别的加减、赋值等操作,用于实现节省空间的复杂数值存储结构。这些数据类型都围绕“高性能、低内存”设计,在特定场景下比常规数据结构(如 String、List、Set 等)更具优势。

ps:因为用的少,所以不展示演示,需要用到请查看官方文档

1.1Streams

Stream 是 Redis 中用于处理消息流的数据类型,可在特定场景中使用,例如模拟实现事件传播机制。它类似于一个阻塞队列,是 Redis 作为消息队列的重要支撑,属于 List 的 blpop/brpop 升级版。

1.2Redis geospatial

实体信息:Redis geospatial 是 Redis(一种开源的内存数据结构存储系统,用作数据库、缓存和消息代理)的一个数据类型。
背景知识:它主要用于存储地理空间坐标(经纬度),在存储了一些点之后,用户可以给定一个坐标,在这些存储的点里按照半径、矩形区域等方式进行查找,在地图类应用中具有重要作用,例如查找附近的商家、用户等场景。

1.3Redis HyperLogLog

实体信息:Redis HyperLogLog 是 Redis 的一种数据类型。
背景知识:其唯一的应用场景是估算集合中的元素个数。在统计服务器 UV(用户访问次数)时,若使用 Set 存储 userld(假设每个 userld 为 8 个字节),1 亿 UV 会占用约 800MB 内存,而 HyperLogLog 最多仅需 12KB 空间就能实现类似效果。它不存储元素内容,而是记录元素特征,以此来判断新增元素是否为新元素,不过存在约 0.81% 的标准误差。

1.4Redis bitmaps

实体信息:Redis bitmaps 是 Redis 的一种数据类型。
背景知识:它使用 bit 位来表示整数,本质上是 Set 类型针对整数的特化版本,能够节省空间。与 HyperLogLog 相比,它更节省空间,且既可以存储数字也可以存储字符串,同样不存储元素内容,仅起到计数效果。但 HyperLogLog 在存储元素时提取特征的过程是不可逆的,会丢失信息。

1.5Redis bitfields

实体信息:Redis bitfields 是 Redis 的一种数据类型。
背景知识:它与 C 语言中的位域(位段)概念相似,可理解为一串二进制序列(字节数组)。用户可以把字节数组中的某几个位赋予特定含义,并进行读取、修改、算术运算等操作。其主要目的也是节省空间,相较于 Redis 中的 String 和 hash 数据类型,在空间利用上更具优势。

二.scan

Redis 渐进式遍历(Scan 命令)

2.1渐进式遍历的概念

Redis 中的keys *命令会一次性获取 Redis 中所有的键,这个操作比较危险,可能会一下子得到太多的键,从而阻塞 Redis 服务器。而通过渐进式遍历(即使用scan命令及其相关命令),可以做到既能获取到所有的键,同时又不会卡死服务器。

渐进式遍历不是一个命令就能把所有的键都拿到,而是每执行一次命令,只获取其中的一小部分,这样能保证当前这一次操作不会太卡。要想得到所有的键,就需要多次执行渐进式遍历命令,也就是 “化整为零”。

2.2Scan 命令

  1. 基本语法:
    ​​​​​​​SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
  2. 关键概念 - 光标(cursor):光标指向了当前遍历的位置。需要注意的是,cursor 不能理解成 “下标”,它不是一个连续递增的整数,仅仅就是一个 “字符串”。程序 / 客户端不能识别这个光标概念,只有 Redis 服务器知道这个光标对应的元素位置。当光标设置成 0 时,意味着这次遍历是从头开始获取。返回值的前半部分是下次继续遍历时光标要从哪里开始,后半部分是真正遍历到的键的内容。
  3. MATCH pattern:用于匹配指定的键模式,和之前介绍的keys命令功能类似(keys *命令可以忘记,推荐使用scan命令)。
  4. COUNT count:用于限制这一次遍历能够获取到的元素数量,默认是 10。但需要注意的是,此处的count和 MySQL 的limit不一样,它只是给 Redis 服务器一个 “提示” 或 “建议”,写入的count和实际返回的键的个数不一定完全相同,但不会差很多。
  5. TYPE type:可以指定要遍历的键的类型。

2.3Scan 命令的执行过程

以实际示例来看,比如执行scan 0 count 3等命令,每次执行会返回下次scan光标的位置以及本次遍历拿到的键。当命令返回的 cursor 回到 0 时,才说明遍历结束了。另外,scan命令有可能返回空的集合。在渐进式遍历过程中,不会在服务器端存储任何状态信息,遍历随时可以终止,不会对服务器产生任何副作用,而且每次遍历设置的count数字也不要求每次都一样。

2.4Redis 键值类型说明

Redis 里的键(key)都是字符串类型,但值(value)的类型不一样,包括 5 个通用的数据类型(String、List、Hash、Set、ZSet)和 5 个特殊场景使用的类型(如 Stream、Geospatial、HyperLogLog、Bitmaps、Bitfields)。

提醒:

渐进性遍历 scan 虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加、修改、删

除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑。


三.数据库管理命令

3.1Redis 中 Database 的概念

  1. 与 MySQL 的对比
    • 在 MySQL 中,一个服务器可以有多个 database,一个 database 上可以有多个表,并且可以随意创建和删除数据库。
    • Redis 也有 database 的概念,但不像 MySQL 那样随意。Redis 中的 database 是现成的,用户不能创建新的数据库,也不能删除已有的数据库。
  2. Redis 数据库的数量与隔离性
    • 默认情况下,Redis 提供了 16 个数据库,编号为 0 到 15。
    • 这 16 个数据库中的数据是相互隔离的,即不同数据库之间的数据不会相互影响。
  3. 默认使用的数据库
    • 默认情况下,Redis 使用的是 0 号数据库。
    • 可以使用select dbIndex命令来切换数据库,例如select 1会切换到 1 号数据库。
    • 实际使用 Redis 时,很少会关注到数据库,一般默认使用 0 号数据库即可。

3.2相关命令

  1. FLUSHDB
    • 作用:删除当前数据库中的所有 key。
    • 语法:FLUSHDB [ASYNC | SYNC]
      • ASYNC:异步执行,不会阻塞 Redis 服务器,立即返回 OK,但实际删除操作在后台进行。
      • SYNC:同步执行,会阻塞 Redis 服务器,直到删除操作完成才返回 OK。
  2. FLUSHALL
    • 作用:删除所有数据库中的所有 key。
    • 注意:这个命令非常危险,在公司尤其是生产环境中千万不能乱用,否则会造成严重的数据丢失。
  3. DBSIZE
    • 作用:获取当前数据库中 key 的个数。
    • 可用性:从 Redis 1.0.0 版本开始可用。
    • 时间复杂度:O (1),即获取键数量的操作是常数时间复杂度。
    • ACL 分类:属于 @keyspace、@read、@fast 类别。

举个栗子~:

切换数据库:

相关新闻

UFS 3.1协议学习路径:从第11章切入掌握UPIU与命令队列

UFS 3.1协议学习路径:从第11章切入掌握UPIU与命令队列

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 1:20:57 阅读更多 →
传统图像处理+YOLO:提升目标检测精度的实战指南

传统图像处理+YOLO:提升目标检测精度的实战指南

1. 为什么又要回头用传统方法先说个实际场景。去年有一个做工厂质检的朋友来找我,说他们产线上用了YOLO之后,表面缺陷的漏检率始终压不下来,尤其是那种特别细的划痕,在强光和反光条件下时有时无,模型自己也很矛盾。后来…

2026/10/21 1:20:57 阅读更多 →
DevExpress Winform登录跳转主窗体:ApplicationContext生命周期管理与皮肤统一实战

DevExpress Winform登录跳转主窗体:ApplicationContext生命周期管理与皮肤统一实战

1. 登录跳转主窗体的整体设计思路做过Winform项目的人都有一个共识:登录窗体虽然逻辑不复杂,但它是整个应用的门面,也是新手最容易翻车的地方。我见过太多项目把登录逻辑直接塞进主窗体的构造函数里,结果调试的时候主窗体一闪而过…

2026/10/21 1:20:57 阅读更多 →

最新新闻

Terminal-Bench完整指南:4步跑通你的第一个AI终端评测

Terminal-Bench完整指南:4步跑通你的第一个AI终端评测

Terminal-Bench完整指南:4步跑通你的第一个AI终端评测 【免费下载链接】terminal-bench-1 A benchmark for LLMs on complicated tasks in the terminal 项目地址: https://gitcode.com/GitHub_Trending/tb/terminal-bench-1 你的Agent演示很精彩&#xff0c…

2026/10/21 2:02:39 阅读更多 →
免 root 三步跑通 WorkTool:你的企业微信自动回复机器人

免 root 三步跑通 WorkTool:你的企业微信自动回复机器人

免 root 三步跑通 WorkTool:你的企业微信自动回复机器人 【免费下载链接】worktool 一款安全稳定的Android无障碍服务工具,支持控制企微/微信来运行的无人值守群管理企业微信机器人 项目地址: https://gitcode.com/GitHub_Trending/wo/worktool W…

2026/10/21 2:02:39 阅读更多 →
STM32驱动W25Q64 SPI Flash实战:从硬件连接到代码实现

STM32驱动W25Q64 SPI Flash实战:从硬件连接到代码实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/21 2:02:39 阅读更多 →
如何用 Jasna 自动修复 VR180 视频:从分眼处理到投影选择的完整新手教程

如何用 Jasna 自动修复 VR180 视频:从分眼处理到投影选择的完整新手教程

如何用 Jasna 自动修复 VR180 视频:从分眼处理到投影选择的完整新手教程 【免费下载链接】jasna Video restoration tool 项目地址: https://gitcode.com/GitHub_Trending/ja/jasna Jasna 是一款面向 GPU 的视频修复工具,内置 VR180 自动修复能力…

2026/10/21 2:02:39 阅读更多 →
gamdl:Apple Music 无损下载工具完全指南,一键收藏歌曲与 4K 音乐视频

gamdl:Apple Music 无损下载工具完全指南,一键收藏歌曲与 4K 音乐视频

gamdl:Apple Music 无损下载工具完全指南,一键收藏歌曲与 4K 音乐视频 【免费下载链接】gamdl A command-line app for downloading Apple Music songs, music videos and post videos. 项目地址: https://gitcode.com/GitHub_Trending/ga/gamdl …

2026/10/21 2:02:39 阅读更多 →
Django数据可视化实践:超市销售系统全流程开发与热词分析

Django数据可视化实践:超市销售系统全流程开发与热词分析

毕业设计做到一半才意识到"选对题"比“写代码”重要得多——这是我在带几个应届生做完整套毕设流程后最深的体会。今天这篇想好好拆解一个很有代表性的题目:基于PythonDjango的超市销售系统,以及其中数据可视化模块的具体实现。这个选题好在哪…

2026/10/21 2:01:38 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →