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 

 

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

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/881757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无极低码课程【java(jdk)windows下安装及环境变量配置】

在Windows环境中安装JDK 7教程 Java Development Kit (JDK) 是开发Java应用程序所必需的工具包。本教程将指导您在Windows操作系统上安装JDK 7。 准备工作 下载JDK 7安装包 访问 Oracle官方网站 下载JDK 8的安装包。选择适合您操作系统的安装包(例如 jdk-7u80-windows-x64.ex…

vmware虚拟机 报错:客户机操作系统已禁用 CPU,请关闭或重置虚拟机 的解决方法

打开cpu虚拟化全部进行勾选 ctrl e 进行关机 勾选上打开就好了 如果没有那个选项 关机>打开虚拟机>管理>更改硬件兼容性> 往小处改改> >更改此虚拟机

[LeetCode] 515. 在每个树行中找最大值

题目描述: 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。 示例1: 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2: 输入: root [1,2,3] 输出: [1,3]提示: 二叉树的节点个数的范围是 [0,10…

基于SpringBoot的个性化健康建议平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理基于智能推荐的卫生健康系统的相关信息成为…

OpenTrans

比较的方法Cat-Seg不好复现

Spring 实现 3 种异步流式接口,干掉接口超时烦恼

大家好,我是小富~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某…

幸运7游戏模拟 python

题目: 幸运"7"游戏,用计算机模拟掷骰子的过程,测算两个骰子点数之和为7的概率。 游戏规则是你丢两个骰子,如果其点数之和为7你就赢4元,不是7你就输1元。 假设你刚开始有10元,当全部输掉为0元的时候游戏结…

【网络安全】1,600$:Auth0 错误配置

未经许可,不得转载。 文章目录 前言正文漏洞案例修复建议前言 Auth0 是一个广泛用于网站和应用程序的身份验证平台,负责管理用户身份并确保其服务的安全访问。该平台提供了多种工作流程,以无缝集成登录和注册流程。 在 Auth0 中创建新应用时,注册选项默认启用。当系统禁用…

Android 无Bug版 多语言设计方案!

出海业务为什么要做多语言? 1.市场扩大与本地化需求: 通过支持多种语言,出海项目可以触及更广泛的国际用户群体,进而扩大其市场份额。 本地化是吸引国际用户的重要策略之一,而语言本地化是其中的核心。使用用户的母语…

c语言字符函数

1,字符分类函数: 例如:写一个代码将字符串中的小写字母转化成大写字母 就可以用到上述islower函数判断字符是否是小写 2.字符转换函数 c语言提供了两个字符转换函数 1.int tolower (int c); //将输入进去的大写字母转化成小写 2,int …

IRP默认最小流程

IRP是Windows内核中的一种非常重要的数据结构。上层应用程序与底层驱动程序通信时,应用程序会发出I/O请求,操作系统将相应的I/O请求转换成相应的IRP,不同的IRP会根据类型被分派到不同的派遣例程中进行处理。 irp相当于R3下的消息&#xff0c…

rtsp协议:rtsp协议参数介绍

目的: 实时流协议(RTSP)用于建立和控制单个或多个时间同步的连续媒体流,例如音频和视频。RTSP 通常不负责实际传输这些连续的媒体流,但可以将连续媒体流与控制流进行交错传输(参见第 10.12 节)。…

学习Redisson实现分布式锁

官网&#xff1a;https://redisson.org/ 官方文档&#xff1a;https://redisson.org/docs/getting-started/ 官方中文文档&#xff1a;https://github.com/redisson/redisson/wiki/%E7%9B%AE%E5%BD%95 1、引入依赖 <!--redisson--> <dependency><groupId>or…

金融大数据平台总体技术

目录 金融大数据平台应用场景风险管理 场景描述解决方案​​​​​​​市场营销 ​​​​​​​场景描述解决方案​​​​​​​金融大数据信息价值链​​​​​​​金融大数据平台总体目标金融大数据平台功能技术要求​​​​​​​ ​​​​​​​概述数据接入功能要求 ​​…

吐槽kotlin之垃圾设计

本文重点在于吐槽垃圾设计&#xff0c;基本直只说缺点。 一.没有static关键字 static其实不是很面向对象&#xff0c;但是是很有必要和方便的。 kotlin为了实现java的static功能&#xff0c;必须使用伴生类&#xff0c;一般情况下没啥问题&#xff0c;但是反编译之后的class多…

Github学生包的JetBrains认证过期/idea认证过期如何解决?

官网通过Github更新状态即可JetBrains Account 注意要到邮箱走流程

SQL Server LocalDB 表数据中文乱码问题

--查看数据库设置 SELECT name, collation_name FROM sys.databases;--出现了The database could not be exclusively locked to perform the operation这个错误&#xff0c; --无法修改字符集为Chinese_PRC_CI_AS&#xff1b;所以需要先设置为单用户模式 ALTER DATABASE MySma…

初试PostgreSQL数据库

文章目录 一、PostgreSQL数据库概述1.1 PostgreSQL的历史1.2 PostgreSQL安装1.3 安装PostgreSQL二、PostgreSQL起步2.1 连接数据库2.1.1 SQL Shell2.1.2 执行SQL语句2.2 pgAdmin 42.2.1 打开pgAdmin 42.2.2 查找数据库2.2.3 打开查询工具2.2.4 执行SQL语句三、实战小结文章目录…

大一计算机课程之线性代数

《大一计算机课程之线性代数》 在大一的计算机课程中&#xff0c;线性代数是一门极为重要的基础学科&#xff0c;它就像一把神奇的钥匙&#xff0c;为计算机科学领域的诸多方面开启了智慧之门。 线性代数主要研究线性方程组、向量空间、线性变换等内容。对于计算机专业的学生…

HCIP-HarmonyOS Application Developer 习题(九)

(多选) 1、HarmonyOS多窗口交互能力提供了以下哪几种交互方式&#xff1f; A. 全局消息通知 B.平行视界 C.悬浮窗 D.分屏 答案&#xff1a;BCD 分析&#xff1a;系统提供了悬浮窗、分屏、平行视界三种多窗口交互&#xff0c;为用户在大屏幕设备上的多任务并行、便捷的临时任务…