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

发布时间:2026/10/21 1:20:54
第九章:了解特殊场景下的redis 一.特殊场景下的redis命令概念:Redis 提供了多种高级数据类型来应对不同的业务需求其中 Streams 是一种日志结构化的消息队列类型支持多生产者、多消费者模型适用于事件流处理和任务分发等场景Geospatial 则用于存储地理空间数据如经纬度坐标支持基于位置的半径查询非常适合实现“附近的人”、“附近的商家”等功能HyperLogLog 是一种基于概率的计数器用于高效估算集合中唯一元素的个数极大地节省内存常用于 UV 统计Bitmaps 通过位图实现高效状态标记适用于布尔值记录场景比如用户是否登录、是否签到等操作Bitfields 是位图的进一步扩展允许以结构化的方式存储和操作多个位段可进行位级别的加减、赋值等操作用于实现节省空间的复杂数值存储结构。这些数据类型都围绕“高性能、低内存”设计在特定场景下比常规数据结构如 String、List、Set 等更具优势。ps:因为用的少,所以不展示演示,需要用到请查看官方文档1.1StreamsStream 是 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 数据类型在空间利用上更具优势。二.scanRedis 渐进式遍历Scan 命令2.1渐进式遍历的概念Redis 中的keys *命令会一次性获取 Redis 中所有的键这个操作比较危险可能会一下子得到太多的键从而阻塞 Redis 服务器。而通过渐进式遍历即使用scan命令及其相关命令可以做到既能获取到所有的键同时又不会卡死服务器。渐进式遍历不是一个命令就能把所有的键都拿到而是每执行一次命令只获取其中的一小部分这样能保证当前这一次操作不会太卡。要想得到所有的键就需要多次执行渐进式遍历命令也就是 “化整为零”。2.2Scan 命令基本语法​​​​​​​SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]关键概念 - 光标cursor光标指向了当前遍历的位置。需要注意的是cursor 不能理解成 “下标”它不是一个连续递增的整数仅仅就是一个 “字符串”。程序 / 客户端不能识别这个光标概念只有 Redis 服务器知道这个光标对应的元素位置。当光标设置成 0 时意味着这次遍历是从头开始获取。返回值的前半部分是下次继续遍历时光标要从哪里开始后半部分是真正遍历到的键的内容。MATCH pattern用于匹配指定的键模式和之前介绍的keys命令功能类似keys *命令可以忘记推荐使用scan命令。COUNT count用于限制这一次遍历能够获取到的元素数量默认是 10。但需要注意的是此处的count和 MySQL 的limit不一样它只是给 Redis 服务器一个 “提示” 或 “建议”写入的count和实际返回的键的个数不一定完全相同但不会差很多。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 的概念与 MySQL 的对比在 MySQL 中一个服务器可以有多个 database一个 database 上可以有多个表并且可以随意创建和删除数据库。Redis 也有 database 的概念但不像 MySQL 那样随意。Redis 中的 database 是现成的用户不能创建新的数据库也不能删除已有的数据库。Redis 数据库的数量与隔离性默认情况下Redis 提供了 16 个数据库编号为 0 到 15。这 16 个数据库中的数据是相互隔离的即不同数据库之间的数据不会相互影响。默认使用的数据库默认情况下Redis 使用的是 0 号数据库。可以使用select dbIndex命令来切换数据库例如select 1会切换到 1 号数据库。实际使用 Redis 时很少会关注到数据库一般默认使用 0 号数据库即可。3.2相关命令FLUSHDB作用删除当前数据库中的所有 key。语法FLUSHDB [ASYNC | SYNC]ASYNC异步执行不会阻塞 Redis 服务器立即返回 OK但实际删除操作在后台进行。SYNC同步执行会阻塞 Redis 服务器直到删除操作完成才返回 OK。FLUSHALL作用删除所有数据库中的所有 key。注意这个命令非常危险在公司尤其是生产环境中千万不能乱用否则会造成严重的数据丢失。DBSIZE作用获取当前数据库中 key 的个数。可用性从 Redis 1.0.0 版本开始可用。时间复杂度O (1)即获取键数量的操作是常数时间复杂度。ACL 分类属于 keyspace、read、fast 类别。举个栗子~切换数据库:

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询