Redis 其他类型 渐进式遍历

news2024/12/23 3:02:59

我们之前已经学过了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.coloradmin.cn/o/2204102.html

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

相关文章

澳鹏干货 | 大语言模型的上下文窗口 (Context Windows)

大语言模型(LLMs)极大地提升了人工智能在理解和生成文本方面的能力。其中一个影响其效用的重要方面是“上下文窗口”(Context Windows)—— 这个概念直接影响着模型接收和生成语言的有效性。 本期澳鹏干货将深入探讨上下文窗口对…

微软确认Word离奇Bug 命名不当会导致文件被删

微软近日确认Word应用中存在一个Bug,该漏洞可能导致用户在特定情况下错误地删除文件。该问题主要出现在文件命名过程中,如果用户在保存Word文件时采用特定的命名方式,文件可能会被移动到回收站。 根据微软支持中心的消息,如果用户…

MVS海康工业相机达不到标称最大帧率

文章目录 一、相机参数设置1、取消相机帧率限制2、修改相机图像格式3、调整相机曝光时间4、检查相机数据包大小(网口相机特有参数)5、 恢复相机默认参数6、 相机 ADC 输出位深调整 二、系统环境设置1、 网口相机设置2、 USB 相机设置 一、相机参数设置 …

java对接GPT 快速入门

统一对接GPT服务的Java说明 当前,OpenAI等GPT服务厂商主要提供HTTP接口,这使得大部分Java开发者在接入GPT时缺乏标准化的方法。 为解决这一问题,Spring团队推出了Spring AI ,它提供了统一且标准化的接口来对接不同的AI服务提供商…

毕设分享 大数据用户画像分析系统(源码分享)

文章目录 0 前言2 用户画像分析概述2.1 用户画像构建的相关技术2.2 标签体系2.3 标签优先级 3 实站 - 百货商场用户画像描述与价值分析3.1 数据格式3.2 数据预处理3.3 会员年龄构成3.4 订单占比 消费画像3.5 季度偏好画像3.6 会员用户画像与特征3.6.1 构建会员用户业务特征标签…

Linux查看下nginx及使用的配置文件

1、查到nginx进程 ps -aef | grep nginx2、通过进行pid查到nginx路径 pwdx <pid>3、根据路径得到配置文件 path***/nginx -t如下&#xff1a;

Unity网络开发基础 —— 实践小项目

概述 接Unity网络开发基础 导入基础知识中的代码 需求分析 手动写Handler类 手动书写消息池 using GamePlayer; using System; using System.Collections; using System.Collections.Generic; using UnityEngine;/// <summary> /// 消息池中 主要是用于 注册 ID和消息类…

(五)Proteus仿真STM32单片机串口数据流收发

&#xff08;五&#xff09;Protues仿真STM32单片机串口数据流收发 – ARMFUN 1&#xff0c;打开STM32CubeMX&#xff0c;找到USART1,配置模式Asynchronous&#xff0c;此时PA9、PA10自动变成串口模式 串口默认参数:115200bps 8bit None 1stop 2&#xff0c;NVIC Settings使能…

Linux-Docker阿里云镜像仓库失效

写在前面&#xff0c;这个是我很早之前在VmWare安装的Linux7,通过yum 安装的docker&#xff0c;但是今天怎么都无法pull镜像&#xff0c;报错如下。 Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waitin…

在IDEA里用XDebug调试PHP,断点....

做程序开发,调试必不可少,这里最近用到了PHP,顺便写个关于PHP的调试安装使用: 1、首先是PHP先安装xdebug扩展(还有zend的),这个我的工具是IDEA,所以安装方法也相对简单,如果你是用VSCode等应该也是一样,如下图,找到这个PHP->DEBUG 2、直接点上面的Install XDebug 就可以帮你…

Unity网络开发 - C#开源网络通信库PESocket的使用

概述 在现代多人在线游戏中&#xff0c;稳定且高效的网络通信是确保游戏体验的关键。本文将探讨如何利用C#开源网络通信库PESocket来构建一个简单的Unity客户端与.NET控制台服务器之间的实时消息传递系统。通过本例&#xff0c;读者不仅能够了解PESocket的基本用法&#xff0c…

Windows11系统下Sentinel环境搭建教程

目录 前言Sentinel简介Sentinel下载安装Sentinel配置与启动总结 前言 本文为博主在项目环境搭建时记录的Sentinel安装流程&#xff0c;希望对大家能够有所帮助&#xff0c;不足之处欢迎批评指正&#x1f91d;&#x1f91d;&#x1f91d; Sentinel简介 github主页地址 &#x…

004、合并两个有序数组

0、题目描述 合并两个有序数组 1、法1 数组nums1有m个元素&#xff0c; 直接在下标为m的位置处追加nums2的元素。然后再qsort整体排序。 —— —— qsort函数&#xff0c;&#xff08;数组首元素地址&#xff0c;排序的个数&#xff0c;排序元素大小&#xff0c; 比较函数&…

Vue】Vue扫盲(四)组件化思想与简单应用

【Vue】Vue扫盲&#xff08;一&#xff09;事件标签、事件修饰符&#xff1a;click.prevent click.stop click.stop.prevent、按键修饰符、及常用指令 【Vue】Vue扫盲&#xff08;二&#xff09;指令&#xff1a;v-for 、v-if、v-else-if、v-else、v-show 【Vue】Vue扫盲&…

Ruby脚本:自动化网页图像下载的实践案例

随着互联网的快速发展&#xff0c;网页上的内容变得越来越丰富&#xff0c;尤其是图像资源。对于需要大量图像资源的设计师、内容创作者或数据分析师来说&#xff0c;手动下载这些图片不仅耗时耗力&#xff0c;而且效率低下。因此&#xff0c;自动化网页图像下载成为了一个迫切…

3_路由器分组交换知多少?20241009

上次介绍到了路由器的分组交换戛然而止&#xff0c;这次扫盲式介绍下。 1、分组交换的主要特点 分组交换则采用存储转发技术1-11 表示把一个报文划分为几个分组后再进行传送。通常我们把要发送的整块数据称为一个报文(message)。在发送报文之前&#xff0c;先把较长的报文划分成…

java-02 数据结构-队列

在Java中&#xff0c;队列是一种常见的数据结构&#xff0c;用于在保持顺序的同时存储和检索数据。Java提供了java.util.Queue接口&#xff0c;它的常见实现包括ArrayDeque、LinkedList和PriorityQueue等。 如果你觉得我分享的内容或者我的努力对你有帮助&#xff0c;或者你只…

元数据 - iXML

在专业的音频和视频制作中&#xff0c;元数据的准确传递对于后期制作和编辑至关重要。iXML&#xff08;iXML Metadata&#xff09;是一种开放的、可扩展的元数据规范&#xff0c;旨在在录音设备和数字音频工作站&#xff08;DAW&#xff09;之间传递详细的录音信息。 一、什么是…

安卓使用.9图实现阴影效果box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);

1.安卓实现阴影效果有很多种&#xff0c;一般UX设计会给以H5参数box-shadow: 0 2px 6px 1px rgba(0,0,0,0.08);这种方式提供背景阴影效果&#xff0c;这里记录一下实现过程 2.界面xml源码 <?xml version"1.0" encoding"utf-8"?> <layout xmlns…

小北的技术博客:探索华为昇腾CANN训练营与AI技术创新——Ascend C算子开发能力认证考试(中级)

前言 哈喽哈喽,这里是zyll~,北浊.(大家可以亲切的呼唤我叫小北)智慧龙阁的创始人,一个在大数据和全站领域不断深耕的技术创作者。今天,我想和大家分享一些关于华为昇腾CANN训练营以及AI技术创新的最新资讯和实践经验~(初级证书还没拿到的小伙伴,可以先参考小北的这篇技术…