Redis的几种核心数据结构解析

Redis几种对外的数据结构:String(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)。


1、字符串

字符串是Redis最基本的数据结构,字符串类型的值实际可以是字符串、数字,甚至是二进制(图片、音频、视频),但是最大值不能超过512MB。

常用命令:

(1)设置值

set  key  value[ex second]  [px millisenconds]  [nx|xx] 

set命令有几个选项:

ex seconds:为键设置秒级过期时间

px milliseconds:为键设置毫秒过期时间

nx:键必须不存在,才可以设置成功,用于添加

xx:与nx相反,键值必须存在才可以设置成功,用于更新

 (2)获取值

get  key

如果键值不存在则返回nill(空)

(3)批量获取值

mget  key  [key ....]

(4)批量设置值

mset  key  value  [key .....]

(5)计数

Redis提供了incr(自增)、decr(自减)、incrby(自增指定数字)、decrby(自减指定数字)、incrbyfloat(自增浮点数):

incr key

decr key

incrby key  increment

decrby  key  decrement

incrbyfloat key increment

不常用命令:

(1)追加值

append  key  value

(2)字符串长度

strlen  key

(3)设置并返回原值

getset  key  value

(4)设置指定位置的字符

setrange  key  offset  value

(5)获取部分字符串

getrange  key  start  end

内部编码

int:8个字节的长整形

embstr:小于等于39个字节的字符串

raw:大于39个字节的字符串

Redis会根据当前值的类型和长度决定使用哪种内部编码实现。

2、哈希

在Reids中,哈希类型是指键值本身又是一个键值对结构,形如value = {{field1,value1},....{fieldN,valueN}}..

命令

(1)设置值

hset  key  field  value

hset  user:1  name  tom

(2)获取值

hget  key  field

(3)删除field

hdel  key  field  [field .....]

(4)计算field个数

hlen  key

(5)批量设置或获取field - value

hmget  key  field  [field ....]

hmset  key  field  value  [field  value]

(6)判断field是否存在

hexists  key  field

(7)获取所有的field

hkeys  key

(8)获取所有value

hvals  key

(9)获取所有的key - value

hgetall  key

在使用hgetall时,如果哈希元素比较多,会有阻塞Redis的可能,如果要获取全部field-value,可以使用hscan命令,该命令会渐进式遍历哈希类型。

(10)计算value的字符串长度

hstrlen  key  field

内部编码

1、ziplist(压缩列表):当hash-max-ziplist-entries配置(默认为512个)、同属所有值都小于hash-max-ziplist-value配置(默认为64字节)时,Redis会使用ziplist作为哈希内部实现。

2、hashtable(哈希表):当不满足ziplist条件时,会采用hashtable作为哈希内部实现。

3、列表

列表(list)类型是用来存储多个有序的字符串,列表中每个字符串称为元素(element),一个列表可以存储2的32次方减1个元素,在Redis中可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等。

列表类型两个特点:一、列表中元素有序。二:列表中的元素可重复。

命令

1、添加操作

(1)从右边 | 左边插入元素

rpush | lpush  key  value  [value ....]

(2)向某个元素前或后插入元素

linsert  key  before | after  pivot  value

2、查找操作

(1)获取指定范围内的元素列表

lrange  key  start  end

索引下标从左到右分别是0到N-1,但是从右。到左分别是-1到-N。

lrange中的end选项包含了自身。

(2)获取列表指定索引下标的元素

lindex  key  index

(3)获取列表长度

llen key

3、删除

(1)从列表左侧 | 右侧弹出元素

lpop | rpop  key

(2)删除指定元素

lrem  key  count  value

count > 0,从左到右,删除最多count个元素

count < 0,从右到左,删除最多count个元素

count = 0,删除所有

(3)按照索引范围修剪列表

ltrim  key  start  end

(4)修改指定索引下标元素

lset  key  index  newValue

(5)阻塞操作

blpop  key  [key ...]  timeout

brpop  key  [key ...]  timeout

lpop he rpop的阻塞版本

key  [key ....]:多个列表的键值

timeout:阻塞时间

内部编码

1、ziplist(压缩列表):当hash-max-ziplist-entries配置(默认为512个)、同属所有值都小于hash-max-ziplist-value配置(默认为64字节)时,Redis会使用ziplist作为哈希内部实现。

2、linkedlist(链表):当列表类型无法满足ziplist条件时,Redis会采用linkedlist作为列表的内部实现。

使用场景

1、消息队列:Redis的lpush和brpop命令组合即可实现阻塞队列。

2、文章列表:分页展示文章列表。

lpush  +  lpop  =  Stack(栈)

lpush  +  rpop  =  Queue(队列)

lpush  +  ltrim   =  Capped  Collection(有限集合)

lpush  +  brpop  =  Message  Queus(消息队列)

4、集合

集合(set)类型也是用来保存多个字符串元素,集合中不允许重复元素,且集合中的元素是无序的,不能通过索引下标获取元素。Redis除了支持集合内的增删查改,同时还支持多个集合取交集、并集、差集。

命令

1、集合内的操作

(1)添加元素

sadd  key  element  [element ...]

返回结果为添加成功的元素个数。

(2)删除元素

srem  key  element  [element ...]

返回结果为删除成功元素个数。

(3)计算元素个数

scard  key

(4)判断元素是否在集合中

sismember  key  element

在集合内则返回1,反正则返回0.

(5)随机从集合返回指定个数元素

srandmember  key  [count]

(6)从集合随机弹出元素

spop  key

(7)获取所有元素

smembers  key

2、集合间的操作

(1)求多个集合的交集

sinter  key  [key ...]

(2)求多个集合的并集

suinon  key  [key ...]

(3)求多个集合的差集

sdiff  key  [key ...]

(4)将交集、并集、差集的结果保存

sinterstore  destination  key  [key ...]

suionstore  destination  key  [key ...]

sdiffstore  destination  key  [key ...]

内部编码

1、intset(整数集合):当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)时,Redis会采用intset来作为集合的内部实现。

2、hashtable(哈希表):当集合类型无法满足intset条件时,Redis会采用hashtable来作为集合内部实现。

使用场景

集合类型适合比较典型的使用场景是标签。

5、有序集合

保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表中使用的索引下标作为排序依据不同的是,它给每一个元素设置一个分数(score)来作为排序依据。

命令

1、集合内

(1)添加成员

zadd  key  score  member [sore member ...]

返回结果代表成功添加成员个数。

Redis3.2为zadd命名添加了nx、xx、ch、incr四个选项:

nx:member必须不存在才可以设置成功,用于添加。

xx:member必须存在才可以设置成功,用于更新。

ch:返回此操作后,有序集合元素和分数发生变化的个数。

incr:对score做增加。

(2)计算成员个数

zcard  key

(3)计算某个成员的分数

zscore  key  member

(4)计算成员的排名

zrank  key  member

zrevrank  key  member

zrank是从分数从低到高返回排名。

zrevrank是从分数从高到低排名。

(5)删除成员

zrem  key  member [member ...]

(6)增加成员分数

zincrby  key  increment  member

(7)返回指定排名范围的成员

zrange  key  start  end [withscores]

zrevrange  key  start  end [withscores]

加上withscores会返回成员的分数。

(8)返回指定分数范围的成员

zrangebyscore  key  min  max  [withscores]  [limit  offset  count]

zrevrangebyscore  key  max  min   [withscores]  [limit  offset  count]

其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之,[limit  offset  count]限制输出的起始位置和个数。

(9)返回指定分数分为成员个数

zcount  key  min  max

(10)删除指定排名内的升序元素

zremrangebyrank  key  start  end

(11)删除指定分数范围的成员

zremrangebyscore  key  min  max

2、集合间的操作

(1)交集

zinterstore  destination  numkeys  key  [key ...]  [weights  weight  [weight ...] ]  [aggregate  sum | min | max ]

destination:交集计算结果保存到这个键。

numkeys:需要做交集的个数。

key  [key ...]:需要做交集计算的键。

weights  weight  [weight ...] :每个键值的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1.

aggregate  sum | min | max :计算成员交集后,分值可以按照sum(和)、min(最小值)、max(最大值)做汇总,默认是sum。

(2)并集

zunionstore  destination    numkeys  key  [key ...]  [weights  weight  [weight ...] ]  [aggregate  sum | min | max ]

内部编码

1、ziplist(压缩列表):当hash-max-ziplist-entries配置(默认为512个)、同属所有值都小于hash-max-ziplist-value配置(默认为64字节)时,Redis会使用ziplist作为哈希内部实现。

2、skiplist(跳跃表):当ziplist不满足条件时,有序集合就会使用skiplist作为内部实现。

使用场景

有序集合比较典型的使用场景就是排行榜系统。


参考:

Redis开发与运维

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空