redis常用数据结构及命令

news2024/11/15 19:57:52

Redis数据结构简介

Redis可以存储键与5种不同数据结构类型之间的映射,这五种数据结构分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)、和Zset(有序集合)。

结构类型结构存储的值结构的读写能力
String字符串、整数或者浮点数对整个字符串或者字符串的一部分执行操作;对整数和浮点数执行自增或者自减操作
List一个链表,链表上的每个节点都包含一个字符串从链表的两端推入或者弹出元素;根据偏移量对链表进行修剪(trim);读取单个或者多个元素;根据值查找或者移除元素
Set包含字符串的无序收集器 ,并且被包含的每个字符串都是独一无二、各不相同的添加、获取、移除单个元素;检查一个元素是否存在于集合中;计算交集、并集、差集;从集合里面随机获取元素
Hash包含键值对的无序散列表添加、获取、移除单个键值对;获取所有键值对
ZSet字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小决定添加、获取、移除单个元素;根据分值范围或者成员来获取元素

Redis中的字符串

字符串示例
字符串可以存储以下3种类型的值

  • 字符串
  • 整数
  • 浮点数

基本操作:

命令用例描述
GETget key-name获取字符串的值
Setset key-name设置字符串的值
Deldel key-name删除字符串的值

整数和浮点数类型操作:

命令用例描述
INCRincr key-name将键存储的值加1
DECRdecr key-name将键存储的值减去1
INCRBYincrby key-name amount将键存储的值加上整数amount
DECRBYdecrby key-name amount将键存储的值减去整数amount
INCRBYFLOATincrbyfloat key-name amount将键存储的值减去浮点数amount

当用户将一个值存储到Redis字符串里面的时候,如果这个值可以被解释为十进制整数或者浮点数,那么Redis就允许用户对这个字符串执行各种incr *和decr *操作。如果用户对一个不存在的键或者一个保存了空串的键执行自增或者自减操作,那么redis在执行操作时会将这个键的值当作0来处理。
如果用户尝试对一个值无法被解释为整数或者浮点数的字符串键执行自增或者自减操作,那么Redis会向用户返回一个错误。

字符串操作:

命令用例描述
APPENDappend key-name value将值value追加到给定键当前存储的值的末尾
GETRANGEgetrange key-name start end获取一个由偏移量start至偏移量end范围内所有字符组成的子串,包括start 和end
SETRANGEsetrange key-name offset value从指定的偏移量offset开始,用给定的值覆盖原有值
GETBITgetbit key-name offset将字节传看作是二进制位串(bit string),返回位串中偏移量为offset的二进制位的值
SETBITsetbit key-name offset value将字节传看作是二进制位串,并将位串中偏移量为offset的二进制位的值设置为value
BITCOUNTbitcount key-name < start end>统计二进制位串里值为1的二进制位的数量,如果给定了可选的start和end。那么只对偏移量指定范围内的二进制位进行统计
BITTOPbittop operation dest-key key-name [key-name…]对一个或者多个二进制位串执行包括 并、或、异或、非在内的任意一种按位运算操作,并将结果值保存到dest-key中

补充:什么是二进制位串?

假设我们有一个键 mykey,其二进制表示为 01001000 01100101 01101100 01101100 01101111(对应字符串 “Hello”)。 那么 字符H的二进制位串表示为0【第0位】1【第1位】0【第2位】0【第3位】1【第4位】0【第5位】0【第6位】0【第7位】,获取偏移量为6的位值为0.即getbit mykey 6 返回结果0。

Redis中的列表

redis对链表结构的支持使得他在键值存储的世界中独树一帜。一个列表结构可以有序的存储多个字符串。列表的主要优点在于他可以包含多个字符串值,使得用户可以将数据集中在同一个地方。Redis集合也提供了与列表相似的特性,但集合只能保存不相同的元素。
在这里插入图片描述
列表的常用操作:

命令用例描述
RPUSHrpush key-name value[value…]将一个或者多个值推入列表的右端
LPUSHLPUSH key-name value[value…]将一个或者多个值推入列表的左端
RPOPRPOP key-name移除并返回列表最右端的元素
LPOPLPOP key-name移除并返回列表最左端的元素
LINDEXLINDEX key-name offset返回列表中偏移量为offset的元素
LRANGELRANGE key-name start end返回列表从start偏移量到end偏移量范围内的所有元素,其中start和end位置的元素也包含在内
LTRIMLTRIM key-name start end对列表进行修剪,只保留从start偏移量到end偏移量范围内的元素,start和end位置元素也保留

结合LRANGE和LTRIM 可以构建出一个在功能上类似于LPOP和RPOP,但是一次能够返回并弹出多个元素的操作。

阻塞式的列表弹出命令以及在列表之间移动元素的命令:

命令用例描述
BLPOPBLPOP key [key …] timeout从列表的左侧弹出元素。如果列表为空,它会阻塞连接,直到有新的元素被推入或达到超时时间
BRPOPBRPOP key [key …] timeout从列表的右侧弹出元素。如果列表为空,它会阻塞连接,直到有新的元素被推入或达到超时时间
RPOPLPUSHRPOPLPUSH source-key dest-key从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素
BRPOPLPUSHBRPOPLPUSH source-key dest-key timeout从source-key列表中弹出位于最右端的元素,然后将这个元素推入dest-key列表的最左端,并向用户返回这个元素;如果source-key 为空,那么timeout秒之内阻塞并弹出元素

对于阻塞弹出命令和弹出并推入命令,最常见的用例就是消息传度和任务队列。

Redis中的集合

redis的集合和列表都可以存储多个字符串,他们之间的不同在于,列表可以存储多个相同的字符串,而集合则通过使用散列表来保证自己存储的每个字符串各不相同。

redis的集合使用无序方式存储多个各不相同的元素,用户可以快速的对集合执行添加元素、删除元素以及检查一个元素是否在集合里等操作。

集合的常用操作:

命令用例描述
SADDSADD key-name item[item…]将一个或者多个值添加到集合里面
SREMSREM key-name value[value…]从集合里面移除一个或者多个元素
SISMEMBERSISMEMBER key-name item检查元素item是否存在于集合key-name中
SCARDSCARD key-name返回集合包含的元素数量
SMEMBERSSMEMBERS key-name返回集合包含的元素
SRANDMEMBERSRANDMEMBER key-name [count]从集合里面随机的返回一个或者多个元素
SPOPSPOP key-name随机的移除集合中的一个元素,并返回被移除的元素
SMOVESMOVE source-key dest-key item如果集合source-key包含元素item,那么从集合source-key里面移除元素item,并将元素item添加到集合dest-key中

组合和处理多个集合的命令:

命令用例描述
SDIFFSDIFF key-name [key-name …]返回那些存在于第一个集合、但不存在于其他集合中的元素(差集运算)
SDIFFSTORESDIFFSTORE dest-key key-name [key-name …]将那些存在于第一个集合但不存在于其他集合的元素存储到dest-key中
SINTERSINTER key-name [key-name …]返回那些同时存在于所有集合中的元素(交集运算)
SINTERSTORESINTERSTORE dest-key key-name [key-name …]将那些同时存在于所有集合的元素存储到dest-key中
SUNIONSUNION key-name [key-name …]返回至少存在于一个集合中的元素(并集运算)
SUNIONSTORESUNIONSTORE dest-key key-name [key-name …]将那些至少存在于一个集合中的元素存储到dest-key中

Redis中的散列

redis的散列可以存储多个键值对之间的映射。和字符串一样,散列存储的值既可以是字符串又可以是数字值,并且用户可以对散列存储的数字值进行自增和自减操作。
在这里插入图片描述
散列的常用操作:

命令用例描述
HSETHSET hash-key sub-key value在散列里面关联起给定的键值对
HGETHGET hash-key sub-key获取指定散列键的值
HGETALLHGETALL hash-key获取散列包含的所有键值对
HDELHDEL hash-key sub-key如果给定键存在于散列里面,移除这个键

散列的其他常用操作:

命令用例描述
HMGETHMGET key-name key[key…]从散列里面获取一个或者多个键的值
HMSETHMSET key-name key value [key value…]为散列里面的一个或者多个键设置值
HLENHLEN key-name返回散列包含的键值对数量

使用示例

HMSET user:1000 name "John Doe" age "30" email "john.doe@example.com"
HMGET user:1000 name email
返回:
1) "John Doe"
2) "john.doe@example.com"

散列的更高级特性:

命令用例描述
HEXISTSHEXISTS key-name key检查给定键是否存在于散列中
HKEYSHKEYS key-name获取散列包含的所有键
HVALSHVALS key-name获取散列包含的所有值
HGETALLHGETALL key-name获取散列包含的所有键值对
HINCRBYHINCRBY key-name key increment将键key存储的值加上整数increment
HINCRBYFLOATHINCRBYFLOAT key-name key increment将键key存储的值加上浮点数increment

尽管有HGETALL存在,但是HKEYS和HVALUES也是非常有用的,如果散列包含的值非常大,那么用户可以先使用HKEYS取出散列包含的所有键,然后使用HGET一个一个的获取键的值,从而避免因为一次获取大体积的值导致服务器阻塞。

Redis中的有序集合

有序集合和散列一样,都用于存储键值对,有序集合的键被称为成员,每个成员都是各不相同的。而有序集合的值被称为分值(score),分值必须为浮点数。有序集合是Redis里面唯一一个既可以根据成员访问元素(这一点和散列一样),又可以根据分值以及分值的排列顺序来访问元素的结构。
在这里插入图片描述
有序集合常用操作:

命令用例描述
ZADDzadd zset-key score sub-key将一个带有给定分值的成员添加到有序集合里面
ZRANGEZRANGE key start stop [WITHSCORES]用于获取有序集合中指定区间内的成员。成员是按分数(score)从低到高排序的。WITHSCORES可选参数,如果提供此参数则同时返回分数
ZREMZREM zset-key sub-key如果给定成员存在于有序集合,则移除这个成员
ZCARDZCARD key-name返回有序集合包含的成员数量
ZINCRBYZINCRBY key-name increment member将member成员的分值加上increment
ZCOUNTZCOUNT key-name min max返回分值介于min和max之间的成员数量
ZRANKZRANK key-name member返回成员member在有序集合中的排名
ZSCOREZSCORE key-name member返回成员member的分值
ZRANGEZRANGE key-name start stop [withscores]返回有序集合中排名介于start 和stop之间的成员,如果给定了withscores选项,那么命令会将成员分值一并返回

有序集合范围型数据获取命令和范围型数据删除命令以及并集交集命令:

命令用例描述
zrevrankzrevrank key-name member返回有序集合里成员member的排名,成员按照分值从小到大排列
zrevrangezrevrange key-name start stop[withscores]返回有序集合里给定排名范围内的成员,成员分值从小到大排列
ZRANGEBYSCOREZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]用于获取有序集合中指定分数范围内的成员。成员按分数从低到高排序。limit offset count等可选参数用于限制返回的偏移量以及数量
ZREVRANGEBYSCOREZREVRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]获取有序集合中分值介于min和max之间的成员,并按照分值从大到小顺序排列。
zremrangebyrankzremrangebyrank key-name start stop移除有序集合中排名介于start和stop之间的所有成员
zremrangebyscorezremrangebyscore key-name min max移除有序集合中分值介于min和max之间的所有成员
zinterstoreZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]计算给定的一个或多个有序集合的交集,并将结果存储在新的有序集合中。结果集中每个成员的分数是所有输入有序集合中该成员分数的和(默认情况),或者根据用户提供的聚合方式进行计算。
zunionstorezunionstore dest-key key-count key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]同上,对给定的有序集合执行类似于集合的并集运算

zinterstore示例
ZINTERSTORE destination numkeys key [key …] [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX]

ZADD zset1 1 "one" 2 "two" 3 "three"
ZADD zset2 2 "one" 3 "two" 4 "four"
计算zset1和zset2的交集,并将结果存储到out中
ZINTERSTORE out 2 zset1 zset2
查看out中的结果
ZRANGE out 0 -1 WITHSCORES
输出
1) "one"
2) "3"
3) "two"
4) "5"
如果使用权重计算交集,例如,将 zset1 的权重设为 2,将 zset2 的权重设为 3:
ZINTERSTORE out 2 zset1 zset2 WEIGHTS 2 3
返回结果
1) "one"
2) "8"   // 1*2 + 2*3 = 2 + 6 = 8
3) "two"
4) "13"  // 2*2 + 3*3 = 4 + 9 = 13
如果使用 MIN 作为聚合方式:
ZINTERSTORE out 2 zset1 zset2 AGGREGATE MIN
返回结果
1) "one"
2) "1"   // MIN(1, 2) = 1
3) "two"
4) "2"   // MIN(2, 3) = 2

发布与订阅

redis提供的发布与订阅命令:

命令用例描述
subscribesubscribe channel [channel…]订阅给定的一个或者多个频道
unsubscribeunsubscribe channel [channel…]退订给定的一个或者多个频道,如果执行时没有给定任何频道,那么退订所有频道
publishpublish channel message向给定频道发送消息
psubscribepsubscribe pattern [pattern…]订阅与给定模式相匹配的所有频道
punsubscribepunsubscribe pattern [pattern…]退订给定的模式,如果执行时没有给定任何模式,那么退订所有模式

Redis发布与订阅模式的问题

  1. Redis系统稳定性:对于旧版的Redis来说,如果一个客户端订阅了某个频道,但他读取消息的速度不够快的话,那么不断积压的消息会使得Redis输出缓冲区的体积变得越来越大。这可能会导致Redis速度变慢,甚至直接崩溃。也可能会导致Redis被操作系统强制杀死,甚至导致操作系统本身不可用。
  2. 数据传输的可靠性:任何网络系统在执行操作时都可能会遇上断线情况,而断线产生的连接错误通常会使得网络连接两端中的其中一端进行重新连接。但是,如果客户端在执行订阅操作过程中断线,那么客户端将丢失在断线期间发送的所有消息。

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

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

相关文章

让EXCEL VBA支持鼠标滚轮,vb6 IDE鼠标滚轮插件原理

vb6 IDE鼠标滚轮插件怎么运行的(适用于VBA) 使用 Spy&#xff0c;我发现代码窗口正在获取 WM_MOUSEWHEEL 事件&#xff0c;但没有触发 WM_VSCROLL 消息。因此&#xff0c;我编写了一个简单的消息钩子&#xff0c;当它捕获鼠标滚轮事件时触发滚动事件。 我从 Spy 得知代码窗口的…

日常使用工具(截图,笔记,一键启动)

目录 一,截图 Snipaste 二.笔记 Joplin 三.翻译 四.自动启动软件 这篇记录一下工作中用的很顺手的工具. 一,截图 Snipaste 官网:Snipaste - 截图 贴图 下面是官方手册. 使用 我都是直接F1 就会出现选择框,随意拖动大小,选择下方工具栏,相应位置, 二.笔记 Joplin 官网:…

IDEA 2023.3.6 下载、安装、激活与使用

一、IDEA2023.3.6下载 国际官网&#xff1a;https://www.jetbrains.com/ 国内官网&#xff1a;https://www.jetbrains.com.cn/ 如果国际官网无法访问&#xff0c;就使用国内官网&#xff0c;我们以国内官网为例下载IDEA2023.3.6 首先进入首页如下图&#xf…

芯片原厂驱动开发工程师:初学到精通,如何快速成长?

01 前言 大家好&#xff0c;我是XX&#xff0c;来自湖南XX学院&#xff0c;电子信息18级&#xff0c;也曾在创新基地控制组学习过两三年&#xff0c;毕业后就职于一家芯片原厂的解决方案部&#xff0c;担任驱动工程师的职位&#xff0c;算上实习期&#xff0c;我的工作时长已有…

【机器学习】深入探索机器学习:线性回归算法的原理与应用

❀线性回归算法 &#x1f4d2;1. 引言&#x1f4d2;2. 线性回归的基本原理&#x1f389;回归方程&#x1f389;最小化误差&#x1f389;线性回归的假设条件 &#x1f4d2;3. 线性回归算法的实现&#x1f4d2;4. 线性回归算法的特征工程&#x1f4d2;5. 线性回归模型评估与优化&…

【模拟退火算法】超详解全局优化算法

模拟退火算法是一种基于概率的全局优化算法&#xff0c;广泛应用于解决复杂的优化问题。 一、模拟退火算法的基本原理 初始化温度&#xff1a;设定一个初始温度( T_0 )&#xff0c;并随机选择一个初始解 ( x_0 )作为当前解。迭代过程&#xff1a;在每个温度下进行固定次数的…

ubuntu移动硬盘重命名

因为在ubuntu上移动硬盘的名字是中文的&#xff0c;所以想要改成英文的。 我的方法&#xff1a; 将移动硬盘插到windows上&#xff0c;直接右键重命名。再插到ubuntu上名字就改变了。 别人的方法&#xff1a; ubuntu下如何修改U盘名字-腾讯云开发者社区-腾讯云 在自带的软件…

opencascade 快速显示AIS_ConnectedInteractive源码学习

AIS_ConcentricRelation typedef PrsDim_ConcentricRelation AIS_ConcentricRelation AIS_ConnectedInteractive 简介 创建一个任意位置的另一个交互对象实例作为参考。这允许您使用连接的交互对象&#xff0c;而无需重新计算其表示、选择或图形结构。这些属性是从您的参考对…

CUDA_VISIBLE_DEVICES‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

问题&#xff1a; 命令行出现CUDA_VISIBLE_DEVICES0 python trainer.py这种命令 这是Linux可以的&#xff0c;但是Windows不行。 解决方案&#xff1a; 这条命令的含义是指定某个GPU来运行程序&#xff0c;我们可以在程序开头添加指定GPU的代码&#xff0c;效果是一样的&…

SQL高级知识:开窗函数

点击关注公众号&#xff0c;SQL干货及时获取 后台回复&#xff1a;1024&#xff0c;获取海量学习资源 SQL刷题专栏 SQL145题系列 开窗函数的定义 开窗函数用于为行定义一个窗口&#xff0c;它对一组值进行操作&#xff0c;不需要使用GROUP BY子句对数据进行分组&#xff0c;能够…

重学java 49 List接口

但逢良辰&#xff0c;顺颂时宜 —— 24.5.28 一、List接口 1.概述: 是collection接口的子接口 2.常见的实现类: ArrayList LinkedList Vector 二、List集合下的实现类 1.ArrayList集合的使用及源码分析 1.概述 ArrayList是List接口的实现类 2.特点 a.元素有序 —> 按照什么顺…

【Flutter】显式动画

&#x1f525; 本文由 程序喵正在路上 原创&#xff0c;CSDN首发&#xff01; &#x1f496; 系列专栏&#xff1a;Flutter学习 &#x1f320; 首发时间&#xff1a;2024年5月29日 &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; 目…

ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务

ORA-12514&#xff1a;TNS&#xff1a;监听程序当前无法识别连接描述符中请求的服务 问题描述&#xff1a; 解决方案&#xff1a; 1、检查oracle的监听服务是否运行正常 1)点击键盘的winr&#xff0c;输入services.msc&#xff0c;点击确认/回车键&#xff1b; 2&#xff09;查…

2023年信息素养大赛小学组C++智能算法复赛真题

今天给大家分享2023年全国青少年信息素养大赛小学组C智能算法挑战赛复赛里面的一套真题&#xff0c;希望有助于大家了解复赛的难度及备考。 其他真题下载&#xff1a;网盘-真题-信息素养大赛

PyTorch安装与配置

前言 参考文档&#xff1a;https://github.com/TingsongYu/PyTorch-Tutorial-2nd 环境配置之Anaconda 解释器——python.exe&#xff0c;是人类与CPU之间的桥梁&#xff0c;需要配置系统环境变量 Anaconda&#xff1a;集成环境&#xff0c;包管理器 Conda 安装 Anaconda&am…

12.2 通道-阻塞与流程控制、通道型函数、退出通道

阻塞与流程控制 通常在并发程序中要尽力避免阻塞式操作&#xff0c;但有时又需要让代码暂时处于阻塞状态&#xff0c;以等待某种条件、信号或数据&#xff0c;然后再继续运行。 对于无缓冲通道&#xff0c;试图从无人写入的通道中读取&#xff0c;或者向无人读取的通道中写入…

学习笔记——数据通信基础——数据通信网络(拓扑结构)

网络拓扑 网络拓扑(Network Topology)是指用传输介质(例如双绞线、光纤等)互连各种设备(例如计算机终端、路由器、交换机等)所呈现的结构化布局。 1、网络拓扑形态 星型网络∶所有节点通过一个中心节点连接在一起。 优点∶容易在网络中增加新的节点。通信数据必须经过中心节点…

学习Uni-app开发小程序Day21

学习了评分组件、自定义导航栏 评分组件uni-rate 这是需要达到的效果图&#xff0c;这里先分析下效果图&#xff0c; 1、图片是从布局中间弹出的&#xff0c;那这里就要用到uni-popup &#xff0c;设置type从中间弹出 2、这个弹出的顶部和上一张的顶部布局是一样的&#xff0c…

C# 反射GetProperties和GetFields的坑

有时候使用反射&#xff0c;获取类的所有字段和所有属性&#xff0c;一般情况下是按照我们写的先后顺序返回的。 但是我今天碰到了一次不是按照顺序返回的&#xff01;&#xff01;&#xff01; 翻看文档&#xff1a; GetProperties&#xff1a; https://learn.microsoft.com/…

【C++】从零开始构建红黑树 —— 节点设计,插入函数的处理 ,旋转的设计

送给大家一句话&#xff1a; 日子没劲&#xff0c;就过得特别慢&#xff0c;但凡有那么一点劲&#xff0c;就哗哗的跟瀑布似的拦不住。 – 巫哲 《撒野》 &#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b;&#x1f30b; ⛰️⛰️…