威尼斯人线上娱乐

Redis数据结构详解之List,Redis数据类型之List类型

11 4月 , 2019  

往列表里存放数据先进后出(左进)

Redis数据类型之List类型

List类型(列表类型)

Redis
列表是简约的字符串列表,依照插入顺序排序。你能够添加2个成分导列表的尾部(左侧)也许尾巴部分(右侧)。

它的平底实际是个链表

序言

思来想去感觉redis中的list没什么好写的,假如单写多少个指令的操作过于干燥,所以本篇最终小编会依照redis中list数据类型的新鲜质量,同时比较成熟的消息队列产品rabbitmq,使用redis完结叁个消息队列。 

为啦让本篇更有吸重力,小编再介绍下redis中list的中央属性,以及为何接纳redis中list列表类型,为啥采用音信队列,为啥不用rabbitmq而选用redis达成消息队列?呢,到那里甘休,假如您是大牌,大腕,大神,大叔!不要听自身吹捧逼啦,Close Page and forget me
! —_— 

  在Redis中,List类型是奉公守法插入顺序排序的字符串链表。和数据结构中的普通链表1样,大家得以在其头顶(left)和尾部(right)添加新的要素。在插入时,假诺该键并不设有,Redis将为该键创制3个新的链表。与此相反,假使链表中持有的要素均被移除,那么该键也将会被从数据库中去除。List中能够分包的最大因素数量是42949672玖五。
威尼斯人线上娱乐,     
从要素插入和删除的功能视角来看,假使大家是在链表的双方插入或删除成分,那将会是可怜便捷的操作,即便链表中一度储存了百万条记下,该操作也得以在常量时间内成功。然则必要表达的是,假如成分插入或删除操作是功效于链表中间,那将会是相当的低效的。相信对于有绝妙数据结构基础的开发者而言,那或多或少并简单通晓。

lpush  names  A  B C D E

List(列表类型)常用命令

率先应对序言中的肆大疑问 

1、redis中的list的宗旨天性?

List数据结构是链表结构,这代表那无论是数据量多大,头尾操作数据照旧相当的慢的,list的容量是二的二十陆次方减一个要素,即42949672玖五个要素数量。

二、为何使用redis中的list数据类型?

借助redis内部存款和储蓄器中操作数据的优势,又提供一些列实用分外的Api操控数据,用着简便,速度又快,又能兑现特有的多少特征排序读写,做时间轴数据,评论列表,音信传递等等,又提供方便人民群众的分页,读写操作。你用不用。

3、为啥使用新闻队列?

Redis数据结构详解之List,Redis数据类型之List类型。举个大约的事例,功效是那样子的,你要呈现页面给用户看,在你彰显页面从前有3个很复杂耗费时间的演算要操作,可是那么些操作不影响页面呈现的数额,也不作为页面展现的多少。 

方案一:运算完,展现页面。

方案二:把要总括的多少,抛到持久化的音讯队列中,不做耗时的演算,直接表现页面。然后用其余1个程序来对音信队列中的数据单独做运算。 

不问可知,方案二是最棒答案,你用不用消息队列。

4、为啥不应用成熟的rabbitmq而利用redis实现的新闻队列? 

Rabbitmq只关怀数据的先进先出,未有数据优先级的定义,要是你想给那1个数据来个先处理的特权,那么不佳意思,笔者不协助,可是rabbitmq也足以生成着来处理,正是身无寸铁多少个队列用程序路由来促成这些特权效用。那么redis达成的音信队列,是足以灵活掌握控制的,前面做示范。

1、LPUSH key value1 [value2]

 

创办列表

lpush左边添加/rpush左侧添加

lpush从左侧添加

127.0.0.1:6379> lpush list01 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange list01 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"

rpush从左侧添加

127.0.0.1:6379> rpush list02 1 2 3 4 5
(integer) 5
127.0.0.1:6379> lrange list02 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

Redis中有关List列表的通令详解 

一、redis中list列表的多寡插入命令:lpush,rpush,linsert

127.0.0.1:6379>rpush
mylist 1   —结果为:(integer) 1

127.0.0.1:6379>rpush
mylist 2   —结果为:(integer) 2

1二7.0.0.1:6379>rpush
mylist 3  
—rpush命令:向mylist列表中,从左边插入3条数据,重临值为当下列表的容积。结果为:(integer)

12七.0.0.一:637玖>lrange
mylist 0 -壹  
—lrange命令:查看mylist列表中的数据,0开始地点,-一得了地点,甘休地方为-一时,表示列表的末段2个职位,即查看全部。结果为:一>
“1”  二> “二”  叁> “三”

1二七.0.0.一:637九>lpush
mylist 0  
—lpush命令:向mylist列表中,从左侧插入一条数据为0的多寡

127.0.0.1:6379>lrange
mylist 0 -1   —结果为:1>”0″  2>”1″  3>”2″  4>”3″

1贰7.0.0.一:637九>linsert
mylist after 三 4   —linsert命令,表明式为linsert key before|after
pivot value
;这句发号施令的意味是在key为mylist的列表中查找值为3的多少,在其后插入一条值为四的多寡。

127.0.0.1:6379>lrange
mylist 0 -1   —结果为:1>”0″  2>”1″  3>”2″  4>”3″
 5>”4″

1二七.0.0.一:637玖>linsert
mylist before 0 -一  
—意思是:在key为mylist的列表中查找值为0的多少,在其前插入一条值为-壹的多寡。

127.0.0.1:6379>lrange
mylist 0 -1    —结果为:1>”-1″  2>”0″  3>”1″  4>”2″
 5>”3″  6>”4″

1贰7.0.0.一:637九>lisert
mylist after 5 八  
 —结果为:-一,由于mylist列表不存在值为5的数额,所以不实施别的操作,重返状态值-一。假使key不存在时,重返错误提醒。

127.0.0.1:6379>lrange
mylist 0 -1   —结果为:1>”-1″  2>”0″  3>”1″  4>”2″
 5>”3″  6>”4″

二、redis中list列表的数目删除命令:lpop,rpop

1贰7.0.0.1:637九>lpop
mylist  
 —lpop命令:从列表中的左侧移除一条数据,同时输出被删除的数量,那里出口的结果为-一

127.0.0.1:6379>lrange
mylist 0 -1   —结果为:1>”0″  2>”1″  3>”2″  4>”3″
 5>”4″

1二7.0.0.1:6379>rpop
mylist  
—rpop命令:从列表的右手移除一条数据,同时输出被去除的多寡,那里出口的结果为四

127.0.0.1:6379>lrange
mylist 0 -1   —结果为:1>”0″  2>”1″  3>”2″  4>”3″ 

1贰7.0.0.一:637玖>ltrim
mylist 1 叁  
—-ltrim命令:保留设定的七个下标区间的值,删除不在其距离的富有值。一为发端保留的下标值,三为告竣保留的下标值。

127.0.0.1:6379>lrange
mylist 0 -1   —结果为:1>”1″  2>”2″  3>”3″ 

叁、redis中list列表的数码查看命令:lrange,llen,lindex

1二柒.0.0.壹:637九>llen
mylist  
—llen命令:重临列表的尺寸,那里mylist只剩余4条数据,故输出结果为4

1二柒.0.0.一:637九>lindex
mylist 三  
—lindex命令:获取给定地方的多寡,那里坐标为③的多寡是”二”,所以结果为二.

4、redis中list列表数据修改命令:lset

12柒.0.0.一:6379>lset
mylist 2 zlh  
—lset命令:把下标为贰的值设置为zlh,假如下标值超出范围或对2个空list列表实行lset,那么将重临叁个荒谬提醒

127.0.0.1:6379>lrange
mylist 0 -1   —结果为: 1>”1″  2>”2″  3>”zlh”

五、redis中list列表,三个列表A,B,将A列表的尾成分添加到B列表的头元素中,命令:rpoplpush

#此地自个儿有连个列表A数据为{1,贰,三}
,B列表数据为{4,五,陆}

127.0.0.1:6379>rpoplpush
A B

127.0.0.1:6379>lrange A  
—结果为:1>”1′ 2>”2″

127.0.0.1:6379>lrange B  
—结果为:1>”3′ 2>”4″ 3>”5″ 4>”6″

陆、redis中的多少个带阻塞的高级命令:blpop,brpop,brpoplpush

1二柒.0.0.一:637九>blpop A 30
 
—意思是:A列表有值的话,从右边移除2个多少,即便没有值的话,则等待A中插入数据甘休,等待时间为30秒,倘若时间设置为0表示阻塞时间最佳延伸

1二七.0.0.1:637九>blpop B30
 
—意思是:A列表有值的话,从左侧移除一个数量,假设未有值的话,则等待A中插入数据结束,等待时间为30秒,借使时间设置为0表示阻塞时间最棒延伸

1二7.0.0.一:637玖>brpoplpush
A B 30  
—意思是:将A列表的尾成分添加到B列表的头成分中,如若A列表中有值则插入,假使没值,则等待A中插入数据停止,等待时间为30秒,假诺时间设置为0表示阻塞时间最佳延长

在列表头(左)加上多个或多个值的列表

往列表里存放数据后进先出(右进)

查看List元素

  • lrange key start end start/end超出索引则忽略.
  • lrange key 0 -一 查看list全体成分.
  • lrange key 0 1 查看list 索引为0/1元素.
  • lrange key 0 length+壹 查看list 0 – (length-1) 的要素,超出的目录忽略.
  • lrange key 1 3 查看list索引为1-3的元素.

lrange key start end

127.0.0.1:6379> lrange list02 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lrange list02 0 3
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> lrange list02 0 4
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lrange list02 0 5
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lrange list02 0 6
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> lrange list02 6 9
(empty list or set)

Redis完成音讯队列,并自带优先级作用

壹、首先redis中的list是链表结构,具备音信队列中的先进先出特征。

贰、从地点的多少个高级命令中能够见见,list有多少个自带阻塞功能,时间设置为0,能够说是永不休息的监听进度。

实现:

1、说啊以上两点小编想你应有有想法啊。

2、对不起有点晚啦,前天还要上班,还要陪媳妇去吃个麻辣烫,回来睡觉啦,那里曾经简单驾驭与落实啊,如需沟通调换学习,进左上角群,对不住呀,88,晚安。

127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "c"
2) "b"
3) "a"

rpush names  G P H K

弹出/取出list元素

lpop key(右边弹出list成分)

127.0.0.1:6379> lpop list01
"5"
127.0.0.1:6379>  lrange list01 0 -1
1) "4"
2) "3"
3) "2"
4) "1"

rpop key(右边弹出list元素)

127.0.0.1:6379> rpop list02
"5"
127.0.0.1:6379> lrange list02  0 -1
1) "1"
2) "2"
3) "3"
4) "4"

LPUSH 正是在左边插入,插入 a b c 就是先 a -> b a -> c b a 。

 

奉公守法索引获取成分(从上到下)

lindex key index依照索引下标获得成分(从上到下)

127.0.0.1:6379> lindex list01 2
"2"
127.0.0.1:6379> lrange list02 0 -1
1) "1"
2) "2"
3) "3"
4) "4"

2、RPUSH key value1 [value2]

查看列表里面包车型客车数据:

收获List元素个数

llen key获取list成分个数

127.0.0.1:6379> lrange list02 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> llen list02
(integer) 4

在列表尾(右)加上四个或四个值的列表

lrange names 0(从0开始)  -1

删除N个value值

  • lrem key n value 假若未有n个value,有些许个删除多少个.
  • lrem key n value 从上到下依照顺序删除.

lrem key n

127.0.0.1:6379> lpush list03 1 1 1 2 2 2 3 3 3 4 4 4 4 5 3 4 4 5
(integer) 18
127.0.0.1:6379> llen list03
(integer) 18
127.0.0.1:6379> lrange list03 0 -1
 1) "5"
 2) "4"
 3) "4"
 4) "3"
 5) "5"
 6) "4"
 7) "4"
 8) "4"
 9) "4"
10) "3"
11) "3"
12) "3"
13) "2"
14) "2"
15) "2"
16) "1"
17) "1"
18) "1"
127.0.0.1:6379> lrem list03 4  3
(integer) 4
127.0.0.1:6379> lrange list03 0 -1
 1) "5"
 2) "4"
 3) "4"
 4) "5"
 5) "4"
 6) "4"
 7) "4"
 8) "4"
 9) "2"
10) "2"
11) "2"
12) "1"
13) "1"
14) "1"
127.0.0.1:6379> lrem list03 3 5
(integer) 2
127.0.0.1:6379> lrange list03 0 -1
 1) "4"
 2) "4"
 3) "4"
 4) "4"
 5) "4"
 6) "4"
 7) "2"
 8) "2"
 9) "2"
10) "1"
11) "1"
12) "1"
127.0.0.1:6379> rpush mylist a b c 
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"

切片:

截取list元素并且赋值给list

  • ltrim key start end 把 start end中的成分赋值给key
  • ltrim key start end 是包含 start end 元素
  • ltrim key start end 假如索引超出范围,则自动忽略.

ltrim key start end

127.0.0.1:6379> lpush list04 1 2 3 4 5 6 7 8 9 0
(integer) 10
127.0.0.1:6379> lrange list04 0 -1
 1) "0"
 2) "9"
 3) "8"
 4) "7"
 5) "6"
 6) "5"
 7) "4"
 8) "3"
 9) "2"
10) "1"
127.0.0.1:6379> ltrim list04 3 5
OK
127.0.0.1:6379> lrange list04 0 -1
1) "7"
2) "6"
3) "5"
127.0.0.1:6379> ltrim list04 0 7
OK
127.0.0.1:6379> lrange list04 0 -1
1) "7"
2) "6"
3) "5"

CR-VPUSH 正是在左侧插入,插入 a b c 便是先 a -> a b -> a b c

lrange names  start  end(start end 代表开首和竣事地点)

在list成分前后添加新因素

  • linsert key before/after value new_value
    在value值前后添加new_value
  • 从上到下找到第三个门道万分
  • 找不到则value 那重临-一 不作操作.

linsert key value new_value

127.0.0.1:6379> lpush list05 x i a o m i
(integer) 6
127.0.0.1:6379> lrange list05 0 -1
1) "i"
2) "m"
3) "o"
4) "a"
5) "i"
6) "x"
127.0.0.1:6379> linsert list05 before i 1
(integer) 7
127.0.0.1:6379> linsert list05 after i 2
(integer) 8
127.0.0.1:6379> lrange list05 0 -1
1) "1"
2) "i"
3) "2"
4) "m"
5) "o"
6) "a"
7) "i"
8) "x"
127.0.0.1:6379> linsert list05 after v  100
(integer) -1

3、LPOP key

 

属性特点

  1. 它是3个字符串链表,left、right都能够插入添加;
  2. 比方键不存在,创造新的链表;
  3. 假若键已存在,新增内容;
  4. 若果值全移除,对应的键也就流失了。
  5. 链表的操作无论是头和尾效能都极高,但假设是对中等成分进行操作,功用就很辛苦了。

取得并取出列表中的第三个要素(左侧第壹个)

插入:

127.0.0.1:6379> rpush mylist a b c 
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> lpop mylist
"a"
127.0.0.1:6379> lpop mylist
"b"
127.0.0.1:6379> lpop mylist
"c"

linsert names  BEFORE/AFTEEnclave  D(标杆就是插到何地)  TEST

4、RPOP key

修改:

取出并拿走列表中的最终3个因素(左侧第二个)

lset names 3 xiaopang

127.0.0.1:6379> rpush mylist a b c 
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpop mylist
"c"
127.0.0.1:6379> rpop mylist
"b"
127.0.0.1:6379> rpop mylist
"a"

删除:

5、LLEN key

lrem name 3 xiaopang

得到列表的长度

 

127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> llen mylist
(integer) 3
127.0.0.1:6379> rpush mylist d
(integer) 4
127.0.0.1:6379> llen mylist
(integer) 4

从列表右边移除:

6、LRANGE key start stop 

lpop names

从二个列表获取成分,个中start/stop都以下标,并且都足以是负数,比如-1意味着尾数第壹个,-二代表倒数第3个。

 

127.0.0.1:6379> rpush mylist a b c 
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"

除下标一-2其余数据都移除:

7、LTRIM key start stop

LT奥德赛IM names 一 二(下标地方)

修理列表到钦命的限量内

 

127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> ltrim mylist 1 -1
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "b"
2) "c"
3) "d"

names最终3个数目,插入到names2的率先个地方:

那边的 start/stop 也是下标,也得以是负数。

RPOPLPUSH  names  names2

8、LREM key count value

 

基于参数 COUNT 的值,移除列表中与参数 VALUE 相等的要素。

去除列表数据:

COUNT 的值能够是以下二种:

BLPOP  names
肆(未有数据就等四秒,有数量就会议及展览示,等待的时候能够持续往里放多少)

  • count > 0 : 从表头初阶向表尾搜索,移除与 VALUE 相等的成分,数量为
    COUNT 。
  • count < 0 : 从表尾早先向表头搜索,移除与 VALUE 相等的因素,数量为
    COUNT 的相对值。
  • count = 0 : 移除表中有着与 VALUE 相等的值。

    127.0.0.1:6379> lrange mylist 0 -1
    1) “a”
    2) “b”
    3) “c”
    4) “a”
    5) “a”
    6) “d”
    7) “e”
    127.0.0.1:6379> lrem mylist 2 a
    (integer) 2
    127.0.0.1:6379> lrange mylist 0 -1
    1) “b”
    2) “c”
    3) “a”
    4) “d”
    5) “e”

 

上边的吩咐提醒:在 mylist 列表,从左到右扫描,移除八个与 ‘a’ 相等的值。

 把names里的终极一个多少,放到names二的率先个任务:

6、LINSERT key BEFORE|AFTER pivot value

BRPOPLPUSH names names2 40

在列表中的别的因素之后或事先插入3个成分

127.0.0.1:6379> rpush list1 foo
(integer) 1
127.0.0.1:6379> rpush list1 bar
(integer) 2
127.0.0.1:6379> linsert list1 before bar yes
(integer) 3
127.0.0.1:6379> lrange list1 0 -1
1) "foo"
2) "yes"
3) "bar"

8、LINDEX key index

从一个列表其索引获取相应的要素

127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> lindex mylist 0
"a"
127.0.0.1:6379> lindex mylist 3
"d"

9、LSET key index value

在列表中的索引设置八个因素的值

127.0.0.1:6379> lrange mylist 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> lset mylist 0 aa
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "aa"
2) "b"
3) "c"
4) "d"

 

 

 

====================== 小编是罪恶的分割线 ======================

RPOPLPUSH source destination

剔除最终1个要素的列表,将其附加到另贰个列表并回到它

BRPOPLPUSH source destination timeout

从列表中弹出一个值,它推到另2个列表并回到它;或堵塞,直到有可用

 

BLPOP key1 [key2] timeout

取出并赢得列表中的第2个因素,或堵塞,直到有可用

BRPOP key1 [key2] timeout

取出并拿走列表中的最后3个因素,或堵塞,直到有可用

 

LPUSHX key value

在前方加上多少个值列表,仅当列表中存在

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图