Day13 Redis应用实战-List操作

Redis 资料型态List

    • List是有顺序(透过index 进行存取),可重复的资料结构(value可以重覆),可以透过索引快速取得资料,但放入(push)与取出(pop)时操作速度较慢,也可以从left或right开始操作.
  • 可用指令

    • LPUSH
    • LPUSHX
    • RPUSH
    • RPUSHX
    • LPOP
    • RPOP
    • RPOPLPUSH
    • LREM
    • LLEN
    • LINDEX
    • LINSERT
    • LSET
    • LRANGE
    • LTRIM
    • BLPOP
    • BRPOP
    • BRPOPLPUSH
    • LMOVE
    • BLMOVE
  • 资料结构

    • 底层都是使用quicklist取代ziplist与linkedlist.

LPUSH

从左边插入value.

# 从左边插入value
127.0.0.1:6379> lpush mylist abc
(integer) 1

# 确认底层型态为quicklist
127.0.0.1:6379> object encoding mylist
"quicklist"

127.0.0.1:6379> lpush mylist abc abc abc
(integer) 3

# value可以重覆
127.0.0.1:6379> lrange mylist 0 3
1) "abc"
2) "abc"
3) "abc"

LPUSHX

当list存在时,从左边插入value.

127.0.0.1:6379> lrange mylist 0 3
(empty array)

127.0.0.1:6379> lpush mylist abc
(integer) 1

# 从左边插入值到已存在的list
127.0.0.1:6379> lpushx mylist def
(integer) 2

127.0.0.1:6379> lrange mylist 0 3
1) "def"
2) "abc"

# 无法插入值到不存在的list
127.0.0.1:6379> lpushx mylist2 def
(integer) 0

127.0.0.1:6379> lrange mylist2 0 3
(empty array)

LPOP

从左边取出value,可以指定一次取出多少个value.

# 取出value
127.0.0.1:6379> lpop mylist
"abc"

# 没有可以再取出的value
127.0.0.1:6379> lpop mylist
(nil)

# 插入3个value
127.0.0.1:6379> lpush mylist abc def ghi
(integer) 3

127.0.0.1:6379> lrange mylist 0 2
1) "ghi"
2) "def"
3) "abc"

# 一次取出两个value
127.0.0.1:6379> lpop mylist 2
1) "ghi"
2) "def"

RPUSH

从右边插入value.

# 从右边插入value
127.0.0.1:6379> rpush mylist abc
(integer) 1

# 确认底层型态为quicklist
127.0.0.1:6379> object encoding mylist
"quicklist"

RPUSHX

当list存在时,从右边插入value.

127.0.0.1:6379> lrange mylist 0 3
(empty array)

127.0.0.1:6379> rpush mylist abc
(integer) 1

# 从右边插入值到已存在的list
127.0.0.1:6379> rpushx mylist def
(integer) 2

127.0.0.1:6379> lrange mylist 0 3
1) "abc"
2) "def"

# 无法插入值到不存在的list
127.0.0.1:6379> rpushx mylist2 def
(integer) 0

RPOP

从右边取出value,可以指定一次取出多少个value.

# 取出value
127.0.0.1:6379> rpop mylist
"abc"

# 没有可以再取出的value
127.0.0.1:6379> rpop mylist
(nil)

# 插入3个value
127.0.0.1:6379> rpush mylist abc def ghi
(integer) 3

127.0.0.1:6379> lrange mylist 0 2
1) "abc"
2) "def"
3) "ghi"

# 一次取出两个value
127.0.0.1:6379> rpop mylist 2
1) "ghi"
2) "def"

LLEN

显示List中valu的个数.

# 插入3个value
127.0.0.1:6379> lpush mylist abc def ghi
(integer) 3

# 取得List中value的个数
127.0.0.1:6379> llen mylist
(integer) 3

#                      <----
#           -3  -2  -1  Right index
#           abc def ghi
#Left index  0   1   2
#      ---->

LRANGE

取得指定Range的value值.

127.0.0.1:6379> lpush mylist abc def ghi
(integer) 3

# 取出从位置0到位置-1的value
127.0.0.1:6379> lrange mylist 0 -1
1) "ghi"
2) "def"
3) "abc"

# 取出从位置1到位置1的value
127.0.0.1:6379> lrange mylist 1 1
1) "def"

# 取出从位置1到位置2的value
127.0.0.1:6379> lrange mylist 1 2
1) "def"
2) "abc"

# 取出从位置-2到位置1的value
127.0.0.1:6379> lrange mylist -2 1
1) "def"

# 取出从位置-2到位置2的value
127.0.0.1:6379> lrange mylist -2 2
1) "def"
2) "abc"

# 取出从位置-2到位置0的value
127.0.0.1:6379> lrange mylist -2 0
(empty array)

LINDEX

取得指定index的value值.

127.0.0.1:6379> lpush mylist abc def ghi
(integer) 3

# 查询index 1的value值
127.0.0.1:6379> lindex mylist 1
"def"

# 查询index 2的value值
127.0.0.1:6379> lindex mylist 2
"abc"

LSET

修改指定index的value值.

127.0.0.1:6379> lindex mylist 0
"ghi"

# 修改
127.0.0.1:6379> lset mylist 0 aaa
OK

127.0.0.1:6379> lindex mylist 0
"aaa"

LTRIM

根据index范围保留value,除范围以内的其余value将被删除.

127.0.0.1:6379> lrange mylist 0 2
1) "aaa"
2) "def"
3) "abc"

# 删除指定范围以外的value
127.0.0.1:6379> ltrim mylist 1 2
OK

127.0.0.1:6379> lrange mylist 0 2
1) "def"
2) "abc"

BRPOP

block 右边取出,类似long polling机制.

127.0.0.1:6379> lrange mylist 0 3
(empty array)

# 如果list中没有value,则会等待10秒
127.0.0.1:6379> brpop mylist 10
(nil)
(10.03s)

# 如果10秒内有value插入,则从右边取出1个value
127.0.0.1:6379> brpop mylist 10
1) "mylist"
2) "aaa"
(1.64s)

BLPOP

block 左边取出,类似long polling机制.

127.0.0.1:6379> lrange mylist 0 3
(empty array)

# 如果list中没有value,则会等待10秒
127.0.0.1:6379> blpop mylist 10
(nil)
(10.03s)

# 如果10秒内有value插入,则从左边取出1个value
127.0.0.1:6379> blpop mylist 10
1) "mylist"
2) "aaa"
(1.32s)

LREM

从左边开始删除几个指定value.

127.0.0.1:6379> lpush mylist abc abc abc
(integer) 3

127.0.0.1:6379> lrange mylist 0 3
1) "abc"
2) "abc"
3) "abc"

# 从左边开始删除1个abc的value
127.0.0.1:6379> lrem mylist 1 abc
(integer) 1

127.0.0.1:6379> lrange mylist 0 3
1) "abc"
2) "abc"

# 从左边开始删除2个abc的value
127.0.0.1:6379> lrem mylist 2 abc
(integer) 2

127.0.0.1:6379> lrange mylist 0 3
(empty array)

LINSERT

将value插入到指定value之前或之後.

127.0.0.1:6379> lpush mylist abc def
(integer) 2

127.0.0.1:6379> lrange mylist 0 3
1) "def"
2) "abc"

# 在abc此value前插入111的value
127.0.0.1:6379> linsert mylist before abc 111
(integer) 3

127.0.0.1:6379> lrange mylist 0 3
1) "def"
2) "111"
3) "abc"

# 在111此value後插入222的value
127.0.0.1:6379> linsert mylist after 111 222
(integer) 4

127.0.0.1:6379> lrange mylist 0 3
1) "def"
2) "111"
3) "222"
4) "abc"

RPOPLPUSH

指定从某个list取出value并插入到另外一个list.

127.0.0.1:6379> lrange mylist 0 3
(empty array)

127.0.0.1:6379> lpush mylist abc def
(integer) 2

127.0.0.1:6379> lrange mylist2 0 3
(empty array)

#从mylist中取出value abc插入mylist2
127.0.0.1:6379> rpoplpush mylist mylist2
"abc"

127.0.0.1:6379> lrange mylist 0 3
1) "def"

127.0.0.1:6379> lrange mylist2 0 3
1) "abc"

LMOVE

指定从某个list的某方向取出value并插入到另外一个list的指定方向.

127.0.0.1:6379> lrange mylist 0 3
(empty array)

127.0.0.1:6379> lrange mylist2 0 3
(empty array)

127.0.0.1:6379> lpush mylist abc def ghi
(integer) 3

# 从mylist的右边取出value并插入到mylist2的右边
127.0.0.1:6379> lmove mylist mylist2 right right
"abc"

127.0.0.1:6379> lrange mylist 0 3
1) "ghi"
2) "def"

127.0.0.1:6379> lrange mylist2 0 3
1) "abc"

# 从mylist的左边取出value并插入到mylist2的右边
127.0.0.1:6379> lmove mylist mylist2 left right
"ghi"

127.0.0.1:6379> lrange mylist 0 3
1) "def"

127.0.0.1:6379> lrange mylist2 0 3
1) "abc"
2) "ghi"

BRPOPLPUSH

在6.2版本改用BLMOVE取代.

BLMOVE

跟LMOVE使用方式一样,但会指定秒数.
指定从某个list的某方向取出value并插入到另外一个list的指定方向.


<<:  [Day 15] Sass - Loop

>>:  那些被忽略但很好用的 Web API / SessionStorage

DAY 18 『 画面间跳页传值 - Protocol And Delegate 』

昨天介绍完如何跳页,今天将会分享如何跳页传值。 成品: 刚执行模拟器的样子 按下 Button 後会...

D14 - 用 Swift 和公开资讯,打造投资理财的 Apps { 加权指数K线图实作.2 }

制作 K 线的 Data Model,从前面文章 [加权指数K线图实作.2] 的 response ...

Day11 vue.js实现简单的登入功能

延续昨日 今天来把登入的功能搞定吧! 记得我们day7学到的东西吗? :class="pr...

[D26] 物件侦测(7)

YOLO 是一个不断改进和优化的物件侦测系列,除了前三个版本,在 2020 年时,YOLOv4 也问...

【第三天 - Stack 题目分析】

先简单回顾一下,今天预计分析的题目: Valid Parentheses 昨天问到,如果 ([)] ...