redis常用数据结构及命令

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.mzph.cn/diannao/18927.shtml

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

相关文章

电流继电器DL-13 柜内安装带板前接线附件 JOSEF约瑟

DL-10系列电流继电器板前接线为电磁式瞬动过电流继电器&#xff0c;它广泛用于电力系统二次回路继电保护装置线路中&#xff0c;作为过电流启动元件。 系列型号 DL-11电流继电器; DL-12电流继电器; DL-13电流继电器&#xff1b; 一、应用范围 DL-13/2电流继电器 板前接线为…

怎么藏族翻译中文在线翻译?更好地了解藏族文化

怎么藏族翻译中文在线翻译&#xff1f;着全球化的发展&#xff0c;语言交流的重要性日益凸显。藏族&#xff0c;作为中国的一个古老而神秘的民族&#xff0c;其语言对于很多人来说充满了神秘感。然而&#xff0c;在今天的数字化时代&#xff0c;我们有了更多的工具来打破语言壁…

mp4文件损坏怎么修复?三种修复办法分享!

对于我们平时使用到的MP4视频文件&#xff0c;有时候在播放时会遇到文件损坏&#xff0c;无法正常打开&#xff0c;针对这个问题&#xff0c;如何修复损坏的MP4视频文件&#xff1f; 首先&#xff0c;我们需要了解MP4文件损坏的可能原因。常见的原因包括&#xff1a;逻辑损坏、…

sprongboot+vue 游泳馆管理系统

游泳馆管理系统 spring bootvue 主要有游泳课程预约、网上购票、教练预约、游泳器材管理、会员管理等功能&#xff1b; 1、管理员 登录、修改密码 购票管理&#xff1a;查看订单、删除订单、修改订单 教练管理&#xff1a;教练信息查询、修改 课程信息&#xff1a;增删改查课程…

地图下钻,双击返回上一级

介绍&#xff1a; 看了好多地图下钻的案例&#xff0c;要么json文件不全胡&#xff0c;要么返回功能不全胡&#xff0c;有的返回是直接写死&#xff0c;返回到首页&#xff0c;我这个小案例是使用地理小工具的数据&#xff0c;本案例可以逐步一级一级的返回&#xff0c;地图的其…

【旧文更新】【优秀课设】基于FPGA的Verilog HDL自动售货机

【旧文更新】基于FPGA的Verilog HDL自动售货机 文章目录 关于旧文新发FPGACortex-M架构SysTick系统定时器阻塞和非阻塞延时 附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转换什么是大端和小端数据传输中的大小端总结大小端转换函…

Three.js 中的场景与相机基础

Three.js 中的场景与相机基础 一、场景&#xff08;Scene&#xff09; 在 Three.js 中&#xff0c;场景是所有 3D 对象存在和交互的容器。艾斯视觉作为行业ui设计与前端开发服务商很高兴能在这里与你共同探讨&#xff1a;它就像是一个虚拟的 3D 空间&#xff0c;我们可以在其中…

端午节趣味互动小游戏的作用是什么

端午节吃粽子&#xff0c;多数行业商家都可借势进行品牌营销&#xff0c;而一场营销效果的优劣&#xff0c;除了好方案外&#xff0c;还需要好的工具/渠道及运营等&#xff0c;围绕粽子元素的互动小游戏是营销互动的主要形式之一。 运用【雨科】平台拥有多款端午节粽子主题互动…

leetcode 1270 向公司CEO汇报工作的所有人(postgresql)

需求 员工表&#xff1a;Employees ---------------------- | Column Name | Type | ---------------------- | employee_id | int | | employee_name | varchar | | manager_id | int | ---------------------- employee_id 是这个表的主键。 这个表中每一行中&#xff0c;e…

用于脑肿瘤分割的跨模态深度特征学习| 文献速递-深度学习肿瘤自动分割

Title 题目 Cross-modality deep feature learning for brain tumor segmentation 用于脑肿瘤分割的跨模态深度特征学习 01 文献速递介绍 作为最致命的流行病&#xff0c;脑肿瘤的研究越来越受到关注。本文研究了一种基于深度学习的自动分割胶质瘤的方法&#xff0c;称为脑…

raid 磁盘阵列

raid 磁盘阵列&#xff1a; **条带化存储&#xff1a;**数据分散在多个物理磁盘上的存储方式。利用多个磁盘并行读取和写入。 条带化的存储性能和读写性能是最好的。 磁盘的组成方式不同&#xff0c;也就是不同的raid级别&#xff1a; **raid 0&#xff08;条带化存储&#x…

高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战案例全网唯一

高级软件工程师带你解决MySQL死锁问题Deadlock found when trying to get lock实战 前言 笔者我实际工作中&#xff0c;经常遇到mysql数据库死锁问题&#xff01;CSDN上面也有很多大神刨析解决方法&#xff01; 我在实际工作中的MySQL数据库架构很复杂&#xff0c;又涉及到主…

MT3045 松鼠接松果

思路&#xff1a; 求x的一个区间&#xff0c;使区间中的松果的最大y坐标和最小y坐标的差至少为D。若有多个区间&#xff0c;则取最小的那个。 即使用单调队列不断维护最大值和最小值。 首先L固定不动&#xff0c;R不断右移&#xff1a; 即若函数f(R)max[L,R]-min[L,R] >…

自建视频托管平台:MediaCMS

目录 1 MediaCMS简介1.1 介绍1.2 特性1.3 应用场景 2 安装配置2.1 安装1、安装2、汉化 2.2 一些常见配置 3 简单使用3.1 上传3.2 下载3.3 添加标题或者字幕3.4 通过Tag/Category实现视频/文件分类添加 Tag给任一资源分类 1 MediaCMS简介 1.1 介绍 MediaCMS是一个现代的&#…

Spring +SpringMVC+Mybatis项目详细构造

一&#xff0c;文档详解 1&#xff0c;web.xml配置 配置spring监听器&#xff1a; 指定spring配置文件的位置和名称&#xff0c;扫描会先扫描此文件&#xff0c;此文件中的扫描文档作为父类扫描&#xff0c;父类扫描不可访问子类扫描&#xff0c;子类扫描可访问父类扫描 &l…

LeetCode --- 399周赛

题目列表 3162. 优质数对的总数 I 3163. 压缩字符串 III 3164. 优质数对的总数 II 3165. 不包含相邻元素的子序列的最大和 一、优质数对的总数I 这里由于数据范围比较小&#xff0c;我们可以直接暴力枚举&#xff0c;代码如下 class Solution { public:int numberOfPairs…

5292A 物联网信号分析仪

5292A 物联网信号分析仪 —— 10MHz&#xff5e;6GHz —— 简述 5292A物联网信号分析仪是一款通用的矢量信号分析仪&#xff0c;频率范围覆盖 10MHz&#xff5e;6GHz&#xff0c;具有良好的频率、功率测量精度和稳定度&#xff1b;支持模拟与数字调制信号、全制式的通信标准…

【错误记录】HarmonyOS 运行报错 ( Failure[MSG_ERR_INSTALL_FAILED_VERIFY_APP_PKCS7_FAIL] )

文章目录 一、报错信息二、问题分析二、解决方案 一、报错信息 在 DevEco Studio 中 , 运行程序 , 编译时正常编译 , 但是在真机运行时 , 报如下错误 , 核心报错信息是 " Failure[MSG_ERR_INSTALL_FAILED_VERIFY_APP_PKCS7_FAIL] " ; 完整报错信息 : 05/29 10:58:55…

【机器学习300问】104、残差网络是怎么起作用的?

残差网络&#xff08;Residual Network&#xff0c;简称ResNet&#xff09;诞生是为了解决深度神经网络的训练困难性问题。深度神经网络在图像分类等任务上取得了重大突破&#xff0c;但随着网络层数的增加&#xff0c;训练变得更加困难。 一、神经网络深度过深会出现…

用docker搭建的Vulfocus镜像管理界面没有镜像可以拉取解决办法

ps&#xff1a;截止到今天2023.4.2&#xff0c;kali和vps的docker拉取的vulfocus镜像会有版本的区别&#xff0c;虽然都是拉取的最新版&#xff0c;vps上镜像为3个月以前&#xff0c;kali上为16个月以前&#xff0c;所以在修改 views.py 文件时&#xff0c;可能会发现文件内容不…