当前位置: 首页 > news >正文

Redis 其他类型 渐进式遍历

我们之前已经学过了Redis最常用的五个类型了,然而Redis还有一些在特定场景下比较好用的类型

Redis最关键的五个数据类型: 

上面的类型是非常常用,很重要的类型。 

除此之外的其他类型不常用,只是在特定的场景能够发挥用处,所以这里只是做简单描述与介绍。

stream 

它的插入就是往尾部插入log(字符串)。 

这其实就是一个队列(阻塞队列),它是Redis作为消息队列的重要支撑。

属于是 list blpop brpop的升级版。

geospatial 

这是用来存储经纬度的类型。

在存储一些点以后,就可以让用户给定一些坐标,去从刚才存储的点里进行查找(按照半径)

这个功能在 地图 应用非常重要。

比如在高德地图中,我们对一个位置搜索周边时

就会有这样的圆形区域。 

 

官方文档这里给的命令也就俩。

 但是使用起来还是有点复杂的,选项比较多。

HyperLogLog

这个类型的应用场景只有一个,就是估算集合中元素的个数。 

 

之前学过用Set类型可以统计服务器的UV(用户访问次数),这里的统计是精确统计,因为它是老老实实将数据存储起来的,但是HyperLogLog这里应用了位运算的思想,并没有真的将数据存储起来,而是记录这个元素的特征,从而在新增元素的时候来判断这个元素是否已经存在了,这样做会存在一些误差,

 官方文档这里给出的误差是 0.81%。

 接口也比较少

bitmap 

用位图来表示整数,这是专门用来存储整数的。

这个位图的本质其实就是一个集合,属于是Set类型针对整数的特化版本。

这里要区分bitmap与HyperLogLog的区别:

HyperLogLog:

优点:更节省空间,而且既可以存储整数,也可以存储字符串。

短板:不能存储元素内容(信息量丢失了),只能起到一个计数的效果(存在误差)。 

bitmap:

优点:能存储元素的内容。

短板:只能存储整数。 

bitfields 

 

这个叫做位域(位段)。跟C语言的位段非常相似。

 

看下官网的使用示例:

 先是对key bike:1:stats又执行了一个类似子命令的效果 set了一个 32位int 的key #0,初始值1000

然后又用incrby将其的值减少了50,并对 #1的值进行了+1操作,虽然#1之前不存在,但是在执行这个命令前就会创建出来,并初始化为0。后面就不再赘述了。

 渐进式遍历

  之前学过keys 命令,它是一次性把Redis中所有的key都获取到。这个命令是不推荐使用的,因为当Redis中的key的数量足够多时,就有可能导致Redis服务器阻塞。

通过渐进式遍历,每一次执行获取部分key,这样就能保证当前一次操作不会太卡,想要获取全部的key,执行多次就可以了。 

渐进式遍历其实是一组命令,这一组命令的使用方法是一样的。 其中代表性的命令就是scan。

 用法:

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]

关于参数选项: 

cursor:光标。不是下标,从0开始,每次遍历后,服务器会返回下一次要从哪个光标开始遍历,这个光标是不会按照下标的方式走的,它是由服务器决定的,当光标回到0时说明遍历结束了。 

[MATCH pattern] 这个选项就是参数匹配,用法跟keys那里是一样的。

[COUNT count]:count是向Redis服务器建议这一次需要遍历多少个元素。注意这里跟MySQL中的limit不同,limit是精确的,除非元素不够,不然limit 多少个元素就显示多少个元素,而Redis这里的count只是向Redis建议遍历count个元素,因此写入的count与实际返回的key的个数不一定完全相同,但是不会差很多。 一般不写默认是10 。

[TYPE type]:可以选择key的类型,比如list set之类的,那么遍历就会过滤掉其他类型。

使用示例:

 

 

可以看到,光标的变动对于客户端来说几乎是随机的,只有重新变回0时则说明遍历结束了。 光标在服务器那端可以理解为是一段字符串。

在这里的渐进式遍历过程中,不会在服务器这边存储任何的状态信息

也就是说,此处的遍历是可以随时终止的,不会对服务器产生任何副作用。

打个比方:

我们去超时买东西,结账到一半时,剩下的一些商品不想要了,我们可以随时跟收银员说,然后会有工作人员将这些商品放回原位,不会产生什么影响,就跟这里的渐进式遍历一样; 

再比如,我们去吃烧烤,有些菜上得特别慢,导致我们都吃完了菜还没上,此时我们就想直接结账,把未上的菜给退掉,但是恰巧这些菜又已经在后厨烧了,那么此时我们想强行退掉就会产生一些副作用(比如跟老板吵架,或者老板扣员工工资等等)。

 

所以Redis属于前者,这点还是比较好的。

最后,需要注意:虽然渐进式遍历scan解决了阻塞的问题,但是键如果在遍历期间发生了变化(增加,修改,删除),可能会导致遍历时键出现重复遍历或者遗漏,这点需要我们开发者在实际开发中进行考虑的。

这点其实就跟C++的迭代器失效问题差不多。如果C++遇到这个问题一般就程序崩溃了,但是Redis不会使程序崩溃,而是会出现重复遍历或者遗漏,这样反而不方便发现问题的所在。

在C++语言中,前置++要比后置++的性能更高,因为会少一次临时对象的拷贝。

 

关于Redis数据库管理 

  在MySQL中有一个很重要的概念,就是database,也就是数据库。一个mysql服务器可以有很多个database。然而在对Redis的学习过程中,感觉好像一上来就是 key value。

  其实Redis也是有database的概念的,只是不像MySQL那样随意,在Redis中的数据库都是现成的,用户不能创建新的database,也不能删除已有的database。Redis默认提供了16个数据库,编号 0 ~ 15。我们一开始用的就是0号数据库,并且实际使用Redis会很少关注到数据库,一般都是使用默认的0号数据库。

Redis 提供了⼏个⾯向 Redis 数据库的操作,分别是 dbsize、select、flushdb、flushall 命令。

切换数据库:

select dbIndex

 比如我们在0号数据库下有一些key,切换到1号数据库就看不见属于0号数据库的key了

 

Redis 中虽然⽀持多数据库,但随着版本的升级,其实不是特别建议使⽤多数据库特性。如
果真的需要完全隔离的两套键值对,更好的做法是维护多个 Redis 实例,⽽不是在⼀个
Redis 实例中维护多数据库。这是因为本⾝ Redis 并没有为多数据库提供太多的特性,其次
⽆论是否有多个数据库,Redis 都是使⽤单线程模型,所以彼此之间还是需要排队等待命令
的执⾏。同时多数据库还会让开发、调试和运维⼯作变得复杂。所以实践中,始终使⽤数据
库 0 其实是⼀个很好的选择。

 

 

DBSIZE

返回当前数据库有多少个key

 

 

关于删库的操作

FLUSHDB 

 

这是删除当前数据库的。

 

FLUSHALL 

 

这是删除所有数据库中的所有元素。

注意:永远不要在线上环境执⾏清除数据的操作,除⾮你想体验⼀把 “从删库到跑路” 的操作。

 

相关文章:

Redis 其他类型 渐进式遍历

我们之前已经学过了Redis最常用的五个类型了,然而Redis还有一些在特定场景下比较好用的类型 Redis最关键的五个数据类型: 上面的类型是非常常用,很重要的类型。 除此之外的其他类型不常用,只是在特定的场景能够发挥用处&#…...

科研绘图系列:R语言绘制SCI文章图2

文章目录 介绍加载R包导入数据图a图b图d系统信息介绍 文章提供了绘制图a,图b和图d的数据和代码 加载R包 library(ggplot2) library(dplyr) library(readxl) library(ggpmisc)导入数据 数据可从以下链接下载(画图所需要的所有数据): 百度网盘下载链接: https://pan.baid…...

ARM知识点三和串口代码的编写流程

ARM的一些常见问题 ARM 体系结构的主要特点是什么? 精简指令集 (RISC):ARM 采用 RISC 结构,指令集较小且简单,执行效率高。相比于复杂指令集 (CISC),RISC 更强调每条指令的执行速度。低功耗设计:ARM 处理…...

【unity踩坑】打开vs2022没有文字联想/杂项文件

unity打开vs2022没有文字联想 修改外置编辑器安装unity开发插件vs编辑器显示杂项文件 修改外置编辑器安装unity开发插件 参考 在unity项目里选择Edit-> Preferences->External Tools然后更换编辑器 在vs工具界面添加unity游戏开发选项。 重新打开还是有问题&#xff…...

WebGoat JAVA反序列化漏洞源码分析

目录 InsecureDeserializationTask.java 代码分析 反序列化漏洞知识补充 VulnerableTaskHolder类分析 poc 编写 WebGoat 靶场地址:GitHub - WebGoat/WebGoat: WebGoat is a deliberately insecure application 这里就不介绍怎么搭建了,可以参考其他…...

大数据-161 Apache Kylin 构建Cube 按照日期、区域、产品、渠道 与 Cube 优化

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…...

uni-app使用v-show编译成微信小程序的问题

问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来,说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…...

充电宝租赁管理系统网站毕业设计SpringBootSSM框架开发

目录 1. 概述 2. 技术选择与介绍 3. 系统设计 4. 功能实现 5. 需求分析 1. 概述 充电宝租赁管理系统网站是一个既实用又具有挑战性的项目。 随着移动设备的普及和人们日常生活对电力的持续依赖,充电宝租赁服务已成为现代都市生活中的一项重要便利设施。它不仅为…...

喜讯!迈威通信TSN产品通过“时间敏感网络(TSN)产业链名录计划”评测,各项指标名列前茅

TSN技术,作为推动企业网络化与智能化转型的关键力量,已成为工业网络迈向下一代演进的共识方向,正加速重构工业网络的技术架构与产业生态。为响应这一趋势,工业互联网产业联盟携手中国信息通信研究院及50余家产学研用单位&#xff…...

国产工具链GCKontrol-GCAir助力控制律开发快速验证

前言 随着航空领域技术的不断发展,飞机的飞行品质评估和优化成为了航空领域的一个重要任务,为了确保飞行器在各种复杂条件下的稳定性,控制律设计过程中的模型和数据验证需要大量仿真和测试。 本文将探讨基于世冠科技的国产软件工具链GCKont…...

嵌入式开发:STM32 硬件 CRC 使用

测试平台:STM32G474系列 STM32硬件的CRC不占用MCU的资源,计算速度快。由于硬件CRC需要配置一些选项,配置不对就会导致计算结果错误,导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…...

基于STM32的智能家居语音控制系统:集成LD3320、ESP8266设计流程

一、项目概述 项目目标和用途 近年来,智能家居产品逐渐成为家庭生活中不可或缺的一部分。为了提升家庭生活的便捷性和舒适度,本项目旨在设计一款基于STM32F407VGT6(Cortex-M4内核)微控制器的多功能智能家居语音控制系统。该系统…...

【docker】要将容器中的 livox_to_pointcloud2 文件夹复制到宿主机上

复制文件夹 使用 docker cp 命令从容器复制文件夹到宿主机&#xff1a; docker cp <container_id_or_name>:/ws_livox/src/livox_to_pointcloud2 /path/to/host/folder sudo docker cp dandong_orin_docker:/ws_livox/src/livox_to_pointcloud2 /home...

网络编程(17)——asio多线程模型IOThreadPool

十七、day17 之前我们介绍了IOServicePool的方式&#xff0c;一个IOServicePool开启n个线程和n个iocontext&#xff0c;每个线程内独立运行iocontext, 各个iocontext监听各自绑定的socket是否就绪&#xff0c;如果就绪就在各自线程里触发回调函数。为避免线程安全问题&#xf…...

【rust/egui/android】在android中使用egui库

文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统&#xff1a;windows11java版本&#xff1a;23android sdk版本&#xff1a;35android ndk版本&#xff1a;22rust版本&#xff1a; AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk&#xff0c;…...

Git---Git打标签

打标签 像其他版本控制系统&#xff08;VCS&#xff09;一样&#xff0c;Git 可以给仓库历史中的某一个提交打上标签&#xff0c;以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点&#xff08; v1.0 、 v2.0 等等&#xff09;。 在本节中&#xff0c;你将会学习如…...

深入理解Transformer的笔记记录(精简版本)---- Transformer

自注意力机制开启大规模预训练时代 1 从机器翻译模型举例 1.1把编码器和解码器联合起来看待的话,则整个流程就是(如下图从左至右所示): 1.首先,从编码器输入的句子会先经过一个自注意力层(即self-attention),它会帮助编码器在对每个单词编码时关注输入句子中的的其他单…...

Ubuntu 更换内核版本

更换内核脚本 这里以更换 5.15.0-88-generic 版本内核为例 cat kernel.sh#!/bin/bashapt install linux-image-5.15.0-88-generic # Ubuntu内核切换脚本# 检查是否具有root权限 if [[ $(id -u) -ne 0 ]]; thenecho "请以root身份运行此脚本。"exit 1 fi# 检查系统是…...

博士找高校教职避坑指南:史上最全的避坑秘籍

在学术的海洋中遨游多年&#xff0c;博士们终于要踏上寻找高校教职的征程。这不仅是职业生涯的新起点&#xff0c;更是一场充满未知与挑战的冒险。今天&#xff0c;就让我们来聊聊那些在寻找高校教职时需要避开的坑&#xff0c;希望能为你的求职之路保驾护航。 1. 薪资结构&am…...

Study-Oracle-11-ORALCE19C-ADG集群搭建

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。 一、ORACLE--ADG VS ORACLE--DG的区别 1、DG是Oracle数据库的一种灾难恢复和数据保护解决方案,它通过在主数据库和一个或多个备用数据库之间实时复制数据,提供了数据的冗余备份和故障切换功能。…...

OSXCross完整指南:如何在Linux上构建macOS应用程序

OSXCross完整指南&#xff1a;如何在Linux上构建macOS应用程序 【免费下载链接】osxcross Mac OS X cross toolchain for Linux, FreeBSD, OpenBSD and Android (Termux) 项目地址: https://gitcode.com/gh_mirrors/os/osxcross OSXCross是一个强大的macOS交叉编译工具链…...

华为,华三交换机开启snmp的命令

华为&#xff0c;华三交换机开启snmp的命令 配置community指定版本为v2c, v3&#xff08;支持这2个版本&#xff09;指定源接口 snmp-agent snmp-agent community read public snmp-agent sys-info version v2c v3 snmp-agent protocol source-interface MEth0/0/0配置完成后&a…...

飞书机器人接入OpenClaw:Qwen3.5-4B-Claude模型对话触发方案

飞书机器人接入OpenClaw&#xff1a;Qwen3.5-4B-Claude模型对话触发方案 1. 为什么选择飞书OpenClaw的技术问答方案 去年团队内部开始频繁出现一个现象&#xff1a;每当新人遇到技术问题&#xff0c;总会在飞书群里反复老员工。简单的环境配置问题往往需要截图、录屏、文字描…...

硬核实战:从APDU指令到安全认证,手把手解析CPU卡读写全流程

1. CPU卡技术基础与APDU指令入门 第一次接触CPU卡开发时&#xff0c;我被那些十六进制指令搞得头晕眼花。记得当时为了读取一张门禁卡的基本信息&#xff0c;整整折腾了两天都没成功。后来才发现&#xff0c;原来连最基本的外部认证都没通过。CPU卡作为智能卡的高级形态&#x…...

别再手动调顺序了!用Vue3+Element Plus+Sortable.js给你的表格加个拖拽编辑弹窗(附完整代码)

Vue3Element PlusSortable.js打造高交互表格编辑弹窗实战 后台管理系统开发中&#xff0c;表格数据的顺序调整和字段管理一直是高频痛点。传统方案往往需要反复点击"上移/下移"按钮或填写表单参数&#xff0c;操作繁琐且体验割裂。本文将带你实现一个弹窗内一站式拖…...

【AI大模型】----大模型后端工程实战:从架构落地到业务赋能---【第三章 】 Prompt工程与输出控制

第三章 Prompt工程与输出控制 3.1 Prompt工程核心原理与设计原则 Prompt工程是让大模型精准理解需求、输出符合预期内容的核心技术&#xff0c;其本质是通过设计合理的输入文本&#xff0c;引导模型生成符合业务要求的结果。 3.1.1 核心设计原则 明确性&#xff1a;需求描述清晰…...

工业通信系统安装:从网络架构到现场落地的完整技术指南

一、什么是工业通信系统安装&#xff1f;为什么它比普通弱电施工要求更高&#xff1f;工业通信系统安装&#xff0c;指的是围绕工业生产场景&#xff0c;对控制层、监控层、管理层之间的数据传输链路进行规划、布线、接线、组网、调试、联动和验收的全过程。它不是单纯的网络工…...

OpenClaw+GLM-4.7-Flash自动化写作:3小时生成30篇技术笔记实战

OpenClawGLM-4.7-Flash自动化写作&#xff1a;3小时生成30篇技术笔记实战 1. 为什么需要自动化知识管理 作为一个技术博主&#xff0c;我每天需要消化大量技术文档和论文。过去两年里&#xff0c;我尝试过各种笔记工具——从Notion到Obsidian&#xff0c;从语雀到飞书文档。但…...

1元一包的“干脆面”,为什么一年卖了近5亿包?——从康师傅财报看休闲食品的“新风口”!

近日&#xff0c;市场上出现了一个让人意想不到的现象&#xff1a;1元左右就能买到的一包干脆面&#xff0c;竟然在2025年卖出了接近5亿包&#xff01;这一现象背后&#xff0c;折射出了方便面行业从“主食”向“休闲零食”角色的成功转变&#xff0c;以及消费观念的深刻变迁。…...

Android App集成AI对话功能:从基础实现到性能优化与安全实践

Android App集成AI对话功能&#xff1a;从基础实现到性能优化与安全实践 在移动应用开发领域&#xff0c;AI对话功能的集成已经从"锦上添花"变成了"必备能力"。对于中高级Android开发者而言&#xff0c;仅仅实现基础功能已经不够——用户期待的是流畅、安…...