首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 开源软件 >

redis 学习札记2-List

2012-09-29 
redis 学习笔记2--ListLIST 整体结构图?图画的太大了,只能放地址:http://dl.iteye.com/upload/picture/pic

redis 学习笔记2--List

LIST 整体结构图

?

图画的太大了,只能放地址:

http://dl.iteye.com/upload/picture/pic/115935/8e96f42d-3a7b-3cea-85ae-997496aa9521.jpg

?

LIST列表的操作,可想而知,对于列表我们需要的具备的功能列表

加入列表:

? 从头部加入 ? LPUSH?

? 从底部加入 ? RPUSH

弹出列表

? 从头部弹出 ? LPOP

? 从底部弹出 ? RPOP

截取子列表 ? ? LRANGE

计算列表的长度 LLEN

?

?

实践:

redis 127.0.0.1:6379> rpush l2 1 ? ? // 从底部添加一个元素

(integer) 1

redis 127.0.0.1:6379> rpush l2 2?

(integer) 2

redis 127.0.0.1:6379> lrange l2 0 -1 // 展示所有的元素 ?-1 代表所有

1) "1"

2) "2"

redis 127.0.0.1:6379> lpush l2 3?

(integer) 3

redis 127.0.0.1:6379> lrange l2 0 -1?

1) "3"

2) "1"

3) "2"

redis 127.0.0.1:6379> lpop l2 ? ? ? // 从头部弹出一个元素

"3"

redis 127.0.0.1:6379> rpop l2 ? ? ? // 从尾部弹出一个元素

"2"

redis 127.0.0.1:6379> llen l2 ? ? ? // 计算队列的长度

(integer) 1

?

扩展

1.1 LPUSHX ?当且队列存在的情况下 在头部插入数据?

?

LPUSHX key value

?

实践:

redis 127.0.0.1:6379> LLEN empty1 ? ? ? ? ? ?

(integer) 0

redis 127.0.0.1:6379> lpushx empty1 hh ? ?// 将数据推入一个空的队列,结果失败

(integer) 0

redis 127.0.0.1:6379> lpush l3 hh?

(integer) 1

redis 127.0.0.1:6379> lpushx l3 hh2 ? ? ?// 将数据推入一个存在的队列头部,成功

(integer) 2

redis 127.0.0.1:6379> lrange l3 0 -1?

1) "hh2"

2) "hh"

?

1.2 RPUSHX 当且队列存在的情况下 在尾部插入数据 ?基本同LPUSHX

redis 127.0.0.1:6379> rpushx empty1 hh3 ? ?// 尝试将数据推入不存在队列的尾部,失败。

(integer) 0

redis 127.0.0.1:6379> rpushx l3 hh3 ? ? ? ?// 将数据推入存在队列的尾巴,成功。

(integer) 3

redis 127.0.0.1:6379> lrange l3 0 -1

1) "hh2"

2) "hh"

3) "hh3"

?

1.3 BLPOP 对于LPOP的扩展 ,阻塞式的获取数据

BLPOP key [key ...] timeout

?

它是 LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。

当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素。

?

假设现在有三个队列 job 为空 , command ?request 不为空 。那么就开始轮训所有的key ,若是空,则跳过 。执行顺序为 job ==> command ==> request

?

实践:

redis 127.0.0.1:6379> del job?

(integer) 0

redis 127.0.0.1:6379> lpush command hh?

(integer) 1

redis 127.0.0.1:6379> lpush request kk?

(integer) 1

redis 127.0.0.1:6379> blpop job command kk?

(error) ERR timeout is not an integer or out of range

redis 127.0.0.1:6379> blpop job command kk ?100?

1) "command"

2) "hh"

redis 127.0.0.1:6379>

?

查看其是如何阻塞的

在第一个图片中,上面那个终端一直阻塞着。

redis 学习札记2-List

?

在第二个终端中输入数据后,上面终端取得数据并返回。

redis 学习札记2-List

?

1.4 BRPOP 对于rpop的扩展,原理基本同BLPOP

?

2.LREM

语法:LREM key count value

释义:根据参数 count 的值,移除列表中与参数 value 相等的元素。

count 的值可以是以下几种:

? count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。

? count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。

? count = 0 : 移除表中所有与 value 相等的值。

?

实践:

redis 127.0.0.1:6379> lpush l1 hello?

(integer) 1

redis 127.0.0.1:6379> lpush l1 world?

(integer) 2

redis 127.0.0.1:6379> lpush l1 hello?

(integer) 3

redis 127.0.0.1:6379> lpush l1 world?

(integer) 4

redis 127.0.0.1:6379> lpush l1 hello?

(integer) 5

redis 127.0.0.1:6379> lrange l1 0 -1?

1) "hello"

2) "world"

3) "hello"

4) "world"

5) "hello"

redis 127.0.0.1:6379> ? ? ? ? ? ? ? ? ? ? ? // 数据准备完成

?

redis 127.0.0.1:6379> lrem l1 2 hello ? ? ?// 从头部开始扫描,移除了两个hello?

(integer) 2

redis 127.0.0.1:6379> lrem l1 -1 hello ? ? // 从尾部开始扫描,移除了一个hello

(integer) 1

redis 127.0.0.1:6379> lrange l1 0 -1 ? ? ? // 现在只剩下 world了

1) "world"

2) "world"

redis 127.0.0.1:6379> lrem l1 0 world ? ? // 移除队中所有的world?

(integer) 2

redis 127.0.0.1:6379> lrange l1 0 -1 ? ? ?// 已经被清空了。

(empty list or set)

redis 127.0.0.1:6379>?

?

3.LSET

语法:LSET key index value

释义:将列表 key 下标为 index 的元素的值设置为 value 。

实践:

redis 127.0.0.1:6379> lpush l1 hello?

(integer) 1

redis 127.0.0.1:6379> lpush l1 world?

(integer) 2

redis 127.0.0.1:6379> lset l1 1 ?--- ? ? ?// 下标为1的数据被替换成 --- 了

OK

redis 127.0.0.1:6379> lrange l1 0 -1

1) "world"

2) "---"

redis 127.0.0.1:6379> lset l1 3 hh ? ? ? // 超出下标进行设置的话,报错

(error) ERR index out of range

redis 127.0.0.1:6379> exist l2?

(error) ERR unknown command 'exist'

redis 127.0.0.1:6379> exists l2 ? ? ? ? ?// 对不存在的队列进行设置的话,报错

(integer) 0

redis 127.0.0.1:6379> lset l2 0 hh?

(error) ERR no such key

redis 127.0.0.1:6379>?

?

?

4 LTRIM

语法:LTRIM key start stop

释义:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

?超出范围的下标值不会引起错误。

?如果 start 下标比列表的最大下标 end ( LLEN list 减去 1 )还要大,或者 start > stop , LTRIM 返回一个空列表(因为 LTRIM 已经将整个列表清空)。

?如果 stop 下标比 end 下标还要大,Redis将 stop 的值设置为 end?

?

实践:

redis 127.0.0.1:6379> lrange l1 0 -1 ? ?// 新建一个队列?

1) "h"

2) "e"

3) "l"

4) "l"

5) "o"

redis 127.0.0.1:6379> ltrim l1 0 3 ? ? // 只截取前四个?

OK

redis 127.0.0.1:6379> lrange l1 0 -1

1) "h"

2) "e"

3) "l"

4) "l"

redis 127.0.0.1:6379> ltrim l1 0 10 ? ?// stop下标大于队列长度 则 stop=队列长度

OK

redis 127.0.0.1:6379> lrange l1 0 -1

1) "h"

2) "e"

3) "l"

4) "l"

redis 127.0.0.1:6379> lset l1 10 20 ?// start stop 都大于 队列长度 且 start < stop 清空队列

(empty list or set)

redis 127.0.0.1:6379> ltrim l1 3 1 ? ? // start ?< stop 清空队列

OK

redis 127.0.0.1:6379> lrange l1 10 20?

(empty list or set)

?

5.LINDEX

语法:LINDEX key index

释义:返回列表 key 中,下标为 index 的元素。

?下标(index)参数 start 和 stop 都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。

?你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

?

实践:

redis 127.0.0.1:6379> lpush l1 1?

(integer) 1

redis 127.0.0.1:6379> lpush l1 2

(integer) 2

redis 127.0.0.1:6379> lpush l1 3

(integer) 3

redis 127.0.0.1:6379> lindex l1 0 ? ? ? ? ? ?// 取下标为0的数据

"3"

redis 127.0.0.1:6379> lrange l1 0 -1?

1) "3"

2) "2"

3) "1"

redis 127.0.0.1:6379> lindex l1 -1 ? ? ? ? ?// 取最后一个数据

"1"

redis 127.0.0.1:6379>?

?

6. LINSERT ?类似于LSET,一个是根据下标来插入,一个是根据pivot来插入数据。

语法:LINSERT key BEFORE|AFTER pivot value

释义:将值 value 插入到列表 key 当中,位于值 pivot 之前或之后。

? 当 pivot 不存在于列表 key 时,不执行任何操作。

? 当 key 不存在时, key 被视为空列表,不执行任何操作。

? 如果 key 不是列表类型,返回一个错误。

?

实践:

redis 127.0.0.1:6379> lrange l1 0 -1?

1) "redis"

2) "hello"

3) "world"

4) "hello"

redis 127.0.0.1:6379> linsert l1 after hello after-insert ? ? ? ? ?// 在第一个找到的hello后面插入了一个数据?

(integer) 5

redis 127.0.0.1:6379> lrange l1 0 -1?

1) "redis"

2) "hello"

3) "after-insert"

4) "world"

5) "hello"

redis 127.0.0.1:6379> linsert l1 before hello before-insert ? ? ? // 在第一个找到的hello前面插入了一个数据?

(integer) 6

redis 127.0.0.1:6379> lrange l1 0 -1?

1) "redis"

2) "before-insert"

3) "hello"

4) "after-insert"

5) "world"

6) "hello"

redis 127.0.0.1:6379> linsert l1 before hoho before-insert ? ? ? // 对于 pivot 不存在的列表,插入失败

(integer) -1

redis 127.0.0.1:6379> lrange l1 0 -1?

1) "redis"

2) "before-insert"

3) "hello"

4) "after-insert"

5) "world"

6) "hello"

redis 127.0.0.1:6379> linsert l2 before hoho before-insert ? ? ? // 插入一个空列表,直接报错

(integer) 0

?

7. RPOPLPUSH?

语法:RPOPLPUSH source destination

释义:

命令 RPOPLPUSH 在一个原子时间内,执行以下两个动作:

?将列表 source 中的最后一个元素(尾元素)弹出,并返回给客户端。

?将 source 弹出的元素插入到列表 destination ,作为 destination 列表的的头元素。

举个例子,你有两个列表 source 和 destination , source 列表有元素 a, b, c , destination 列表有元素 x, y, z ,执行 RPOPLPUSH source destination 之后, source 列表包含元素 a, b , destination 列表包含元素 c, x, y, z ,并且元素 c 会被返回给客户端。

?如果 source 不存在,值 nil 被返回,并且不执行其他动作。

?如果 source 和 destination 相同,则列表中的表尾元素被移动到表头,并返回该元素,可以把这种特殊情况视作列表的旋转(rotation)操作。

?

实践:

redis 127.0.0.1:6379> lrange l1 0 -1?

1) "c"

2) "b"

3) "a"

redis 127.0.0.1:6379> lrange l2 0 -1

1) "3"

2) "2"

3) "1"

redis 127.0.0.1:6379> rpoplpush l1 l2 ? ? //将l1尾部的数据弹出进入l2的头部,并将这个弹出的数据返回

"a"

redis 127.0.0.1:6379> lrange l1 0 -1?

1) "c"

2) "b"

redis 127.0.0.1:6379> lrange l2 0 -1?

1) "a"

2) "3"

3) "2"

4) "1"

redis 127.0.0.1:6379>

?

8. BRPOPLPUSH?

语法:BRPOPLPUSH source destination timeout

释义:BRPOPLPUSH 是 RPOPLPUSH 的阻塞版本,当给定列表 source 不为空时, BRPOPLPUSH 的表现和 RPOPLPUSH 一样。

? ?当列表 source 为空时, BRPOPLPUSH 命令将阻塞连接,直到等待超时,或有另一个客户端对 source 执行 LPUSH 或 RPUSH 命令为止。

? ?超时参数 timeout 接受一个以秒为单位的数字作为值。超时参数设为 0 表示阻塞时间可以无限期延长(block indefinitely) 。

?

实践:

我们设置等超时时间为1000?

redis 学习札记2-List

?

在另一个客户端添加数据后,就转移了数据

redis 学习札记2-List

?

?

?

热点排行