Redis --- 第四讲 --- 常用数据结构 --- 其他类型stream、bitmap……。补充内容scan命令。
通过前面的学习,我们已经学习了Redis最关键的五个数据结构:String、List、Hash、Set、ZSet。这五个数据结构应用广泛,频繁使用。
redis中包含的所有类型,下面将要介绍不常用的类型。
一、streams类型介绍
事件、epoll/IO多路复用,它就是一个事件驱动的方式。每次网卡/SOCKET上有可读可写的数据,都会通过这种事件机制来通知到自己的应用程序代码。所谓的事件:有些操作,我们也不知道它啥时候出现,只能这个事情出现了之后,再采取行动。官方文档的意思,就是streams类型就可以用来模拟实现这种事件传播的机制。
官方文档描述。

streams就是一个阻塞队列,redis作为一个消息队列的重要支撑。在工作用到这里的命令,我们可以查找官方文档就可以了。
二、geospatial类型介绍
英文翻译为地理空间。
这个类型的主要作用是存储坐标。

存储一些点之后,就可以让用户给定一个坐标,去从刚才存储的点里进行查找,(按照半径、矩形区域)。这个功能在地图应用中非常重要。

这是按照范围查找的应用。
三、hyperloglog类型介绍
应用场景只有一个,估算集合中的元素个数。

Set,有一个应用场景,统计服务器的UV(用户访问的次数),使用set当然可以统计UV,但是最大的问题在于,如果UV数据量非常大,Set就会消耗很多的内存空间。HyperLogLog最多可以使用12KB的空间实现上述效果。set之所以消耗这么大的空间Set需要存储每个元素,而HyperLogLog不存储元素的内容,但是能够记录元素的特征,从而在新增元素的时候,能够知道当前新增的元素是一个已经存在的元素,还是一个崭新的第一次出现的元素。用来计数,记录当前集合中有多少个不同的元素,但是不能告诉我们这些元素都是啥。但是这个类型会有一定的误差,官方文档为0.81%,这个类型不是Redis专有的。
四、bitmaps的介绍
这个类型为位图,使用bit位来表示整数。位图本质上,就还是一个集合,属于是Set类型针对整数的特化版本,为了节省空间来设计了这个类。计算机进行位运算,一般都是比较高效的。而hyperloglog既可以存储数字,也可以存储字符串,不存储元素内容,只是计数效果,而bitmap是存了元素的。hyperloglog存储元素的时候,提取特征的过程是不可逆的。猪肉做成火腿肠,火腿肠做不成猪肉。
五、bitfields类型
位域,c语言中,自定义数据类型 =》 结构体在内存中的布局 =》位段
位段也叫做位域。结构体成员后面加上冒号,后面加个数字

此处的数字,就描述这个成员实际占几个bit位!位于本质上是让我们精确进行位操作的一种方法。上述Redis中的bitfield和C中的位域,非常相似的!bitfield可以理解成一串二进制序列(字节数组),同时可以把这个字节数组中的某几个位,赋予特定的含义,并且进行读取/修改/算数运算相关操作。

位域这个东西,相比于之前的string还是要节省空间。
C语言和Redis中的bitfields的对比

六、渐进式遍历
keys一次性的把整个redis中所有的key都获取到,keys* 这个操作比较危险,可能会一下子得到太多的key,阻塞redis服务器。
通过渐进式遍历,就可以做到,既能够获取到所有的key,同时又不会卡死服务器。不是一个命令把所有的key都拿到,而是每次执行一次命令,只获取到其中的一小部分,这样的话保证当前这一次操作不会太卡。要想得到所有的key就需要多次遍历,多次执行渐进式遍历命令。化整为零。
渐进式遍历其实是一组命令,这一组命令的使用方法式一样的。主要是scan。

此处涉及到关键概念,光标。它就指向了当前遍历的位置。
光标设置为0了,以为着这次遍历是从头开始获取,返回值的前半部分是告诉你,下次继续遍历,光标要从哪里开始。
真正遍历到key的内容。
这里的cursor不能理解成下标,不是一个连续递增的整数!仅仅是一个字符串,光标这个概念程序员/客户端时不能认识的。redis服务器则知道这个光标对应的元素位置。
![]()
pattern和前面介绍过的keys命令是一样的。
COUNT 限制这一次遍历能够获取到多少个元素,默认是10。但是注意!此处的count和mysql的limit不一样。count只是给redis服务器一个提示或者建议。写入的count和实际返回的key的个数不一定是完全相同的,但是不会差很多。
TYPE:redis里的key都是string但是value的类型不一样。这次遍历就想要值为type类型的key。

scan命令返回的cursor回到0了,才说明遍历结束。scan是有可能返回空的集合的

整个的遍历过程

时间复杂度为O(1),count这里的数字,不是说每次遍历都得设置成一样。这里的渐进式遍历,在遍历过程中,不会在服务器这边存储任何的状态信息。此处的遍历时随时可以终止的,不会对服务器产生任何的副作用。
渐进式遍历scan虽然解决了阻塞的问题,但如果在遍历期间键有所变化(增加,修改,删除),可能导致遍历时键的重复遍历或者遗漏,这点务必在实际开发中考虑。这跟C++ STL遍历 + 修改/新增/删除 =》迭代器失效的问题相似。同理java中也是一样的。
虽然scan比keys要好点,但是使用的时候也还是有很多的注意事项,很多的出错是可能的。
相关文章:
Redis --- 第四讲 --- 常用数据结构 --- 其他类型stream、bitmap……。补充内容scan命令。
通过前面的学习,我们已经学习了Redis最关键的五个数据结构:String、List、Hash、Set、ZSet。这五个数据结构应用广泛,频繁使用。 redis中包含的所有类型,下面将要介绍不常用的类型。 一、streams类型介绍 事件、epoll/IO多路复…...
Java多线程--实现跑马小游戏
线程的实现方式 继承Thread类:void run()方法没有返回值,无法抛异常实现Runnable接口:void run()方法没有返回值,无法抛异常实现Callable接口:V call() throws Exception 返回结果,能够抛异常 实现Callab…...
扫雷(C 语言)
目录 一、游戏设计分析二、各个步骤的代码实现1. 游戏菜单界面的实现2. 游戏初始化3. 开始扫雷 三、完整代码四、总结 一、游戏设计分析 本次设计的扫雷游戏是展示一个 9 * 9 的棋盘,然后输入坐标进行判断,若是雷,则游戏结束,否则…...
有源滤波器(一)
滤波器设计工具 | 滤波器设计向导 | Analog Devices 一种带通滤波器: 有源滤波器完美规避了这个带不带负载滤波参数变化的问题,但是有源滤波器只能处理小电流和小电压: 鼠标所指的电路图是一阶同相滤波器,右上角的是他的幅频特性…...
Flume面试整理-常见的Channel类型
Apache Flume提供了多种Channel(通道)类型,作为Source(源)和Sink(汇)之间的缓冲区,确保数据的可靠传输。不同类型的Channel提供了不同的性能和可靠性,适用于不同的应用场景。以下是Flume中常见的Channel类型及其特点: 1. Memory Channel ● 描述:Memory Channel将数…...
【前端】如何制作一个自己的网页(6)
接上文 网络中的图片 我们也可以在百度等网站搜索自己喜欢的图片。 此时对图片点击右键,选择【复制图片地址】,即可获得该图片的网络地址。 其实在HTML中,除了图片以外,我们还可以利用地址找到另一个网页。 如右图所示&#…...
Linux系统性能调优技巧
Linux系统性能调优是一个复杂而持续的过程,需要综合考虑硬件、软件、内核参数、进程管理等多个方面。以下是一些具体的调优技巧: 一、硬件优化 增加物理内存:内存不足时,系统会频繁进行交换(swapping)活动…...
数学建模算法与应用 第5章 插值与拟合方法
目录 5.1 插值方法 Matlab代码示例:线性插值 Matlab代码示例:样条插值 5.2 曲线拟合的线性最小二乘法 Matlab代码示例:线性拟合 5.3 最小二乘优化与多项式拟合 Matlab代码示例:多项式拟合 5.4 曲线拟合与函数逼近 Matlab代…...
3D Slicer 教程二 ---- 数据集
上一章下载3d slicer的软件,这章从加载数据集来弄清楚3dslicer怎么使用. 一. 加载数据集 如果没有数据集,也可用用样本数据. (1) "File" --> "add Data" 可以添加图片文件夹,(试了MP4不行,内镜的视频估计不支持),添加单个图片的话,会出现一些选项, …...
【建议收藏】30个Java异常的知识点,你能撑到第几个?
文章目录 问题1:Error 和 Exception 区别是什么?问题2:运行时异常和一般异常(受检异常)区别是什么?问题3:JVM 是如何处理异常的?问题4:throw 和 throws 的区别是什么?问题5ÿ…...
【Linux系统编程】环境基础开发工具使用
目录 1、Linux软件包管理器yum 1.1 什么是软件包 1.2 安装软件 1.3 查看软件包 1.4 卸载软件 2、Linux编辑器-vim 2.1 vim的概念 2.2 vim的基本操作 2.3 vim的配置 3、Linux编译器-gcc/g 3.1 gcc编译的过程编辑编辑编辑 3.2 详解链接 动态链接 静态链接 4…...
滚雪球学Redis[6.2讲]:Redis脚本与Lua:深入掌握Redis中的高效编程技巧
全文目录: 📝前言🚦正文🌟6.2.1 Lua脚本的优势🖋️6.2.2 EVAL命令与Lua脚本编写🐵编写Lua脚本的基本步骤🐶示例:简单的GET和SET操作🐱示例:Lua实现自增和过期…...
上市不到一月,极氪7X交付破万台!论纯电,极氪真“遥遥领先”
承认吧,在纯电这条赛道上,极氪真就“遥遥领先”~ 推出的第一款原生纯电猎装极氪001,就常年霸榜25万级豪华纯电销冠 主打豪华大车的极氪009,成为40万以上高端“保姆车”的不二之选 第一次面向主流纯电市场推出的豪华大五座——极…...
【Linux】理解文件系统与软硬链接,观察inode号理解<“软链接是包含路径的新文件“,“硬链接是关于文件名的机制“>,最终明白<什么是真正删除一个文件>
前言 大家好吖,欢迎来到 YY 滴Linux系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《Lin…...
Java高并发控制之按业务对象加同步锁
一、需求 最常见的一个场景,账户余额更新! 业务场景稍复杂点,一个客户有多个虚拟余额账户,产生交易时,需要同时更新客户的多个余额账户,现在需要为余额更新做并发控制。 二、解决方案 1、依赖数据的乐观锁&…...
Python魔法函数__iter__的用法
下面是找到的一个比较好的科学解释: Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问。 1.__iter__方法的作用是让对象可以用for…...
Redis-缓存一致性
缓存双写一致性 更新策略探讨 面试题 缓存设计要求 缓存分类: 只读缓存:(脚本批量写入,canal 等)读写缓存 同步直写:vip数据等即时数据异步缓写:允许延时(仓库,物流&a…...
SAP学习笔记 - 豆知识13 - Msg 番号 NR751 - Object RF_BELEG R100、番号範囲間隔 49 不存在 FBN1
其实这种就是自动採番的番号没弄。 比如跨年了,那该新年度的番号范围没弄啊,就会出这种错误。 把番号范围给加一下就可以了。 1,现象 比如点 VL02N 出荷传票变更 画面,点 出库确认 就会出如下错误: Object RF_BEL…...
美摄科技云服务解决方案,方案成熟,接入简单
美摄科技作为视频处理领域的先锋,凭借其强大的技术实力和深厚的行业经验,推出了成熟的云服务解决方案,为轻量化视频制作开辟了全新的道路。 一、成熟方案,接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…...
【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type
【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type 环境 python 3.10.15pillow 10.4.0 paddleocr 2.8.1错误详情 错误文本 Traceback (most recent call last):....draw_left.polygon(box, fillcolor)ValueError: inco…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
springboot 日志类切面,接口成功记录日志,失败不记录
springboot 日志类切面,接口成功记录日志,失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...
