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. 数据传输的可靠性:任何网络系统在执行操作时都可能会遇上断线情况,而断线产生的连接错误通常会使得网络连接两端中的其中一端进行重新连接。但是,如果客户端在执行订阅操作过程中断线,那么客户端将丢失在断线期间发送的所有消息。
  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值