zoukankan      html  css  js  c++  java
  • 【Redis笔记(四)】 Redis数据结构

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50573605

    经过前面的介绍,我们学习了Redis中string字符串、hash哈希这两种数据结构的常用命令。这篇文章将介绍Redis中的list – 列表的相关操作。

    如果你还不知道string和hash是什么(插播一条“小广告”),可以先看看我的前两篇文章:

    1. 【Redis笔记(二)】 Redis数据结构-string字符串
    2. 【Redis笔记(三)】 Redis数据结构 - hash哈希

    list类型介绍

    Redis中的list类型其实就是string类型的双向链表。学过数据结构的童鞋都知道,既然是双向链表,就很容易找到从头部或尾部插入、删除元素。这样,list就可以当做栈或队列来使用。在Redis中,list的最大长度为2^32-1。

    list相关命令

    1、lpush命令

    lpush命令将一个或多个元素插入到列表的头部,如果指定的key不存在,则先创建一个空列表,如果指定的key不是一个list类型,则返回一个错误。具体格式为:

    lpush key value...
    • 1

    示例1:

    127.0.0.1:6379> lpush mylist a b c
    (integer) 3
    127.0.0.1:6379> set mystr not_a_list
    OK
    127.0.0.1:6379> lpush mystr d
    (error) WRONGTYPE Operation against a key holding the wrong kind of value
    127.0.0.1:6379>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、lrange命令

    上面,我们使用lpush命令往列表中添加了元素,那么我们怎么知道指定的元素已经插入列表中呢?这是,我们可以使用lrange命令来查看列表中指定范围的元素。该命令的的具体格式如下:

    lrange key start stop
    • 1

    对于lrange命令,我们需要知道一下几点:

    • lrange返回列表中下标范围在[start, stop]中的元素。
    • 列表的下标偏移量是基于0的,也就是从0开始。这跟我们编程语言中的数组下标的计算方式一致。
    • 偏移量可以是负数,表示该偏移量是从列表的尾部开始计数。比如-1表示列表的最后一个元素。
    • 如果给定的下标超出列表下标的范围,Redis不会产生错误。如果start大于列表尾部下标,返回一个空列表,如果stop大于列表尾部下标,则Redis会把列表的尾部下标当做实际的stop值。

      示例2:

    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3、lpushx命令

    lpushx命令也用于在列表头部插入元素。与lpush不同的是,当指定key不存在时,该命令并不会创建一个空列表,二是不进行任何操作,直接返回。具体格式如下:

    lpushx key value
    • 1

    示例3:

    127.0.0.1:6379> lpushx mylist a
    (integer) 0
    127.0.0.1:6379> lrange mylist 0 -1
    (empty list or set)
    127.0.0.1:6379> lpush mylist a
    (integer) 1
    127.0.0.1:6379> lpushx mylist b
    (integer) 2
    127.0.0.1:6379> lrange mylist 0 -1
    1) "b"
    2) "a"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    4、rpush命令

    前面我们介绍了,list实际上是一个双向链表,我们可以使用rpush命令从列表的尾部插入一个或多个元素。该命令操作成功后返回列表的长度。具体格式如下:

    rpush key value
    • 1

    示例4:

    127.0.0.1:6379> lpush mylist a b c
    (integer) 3
    127.0.0.1:6379> rpush mylist d e f
    (integer) 6
    127.0.0.1:6379> lrange mylist 0 -1
    1) "c"
    2) "b"
    3) "a"
    4) "d"
    5) "e"
    6) "f"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    5、rpushx命令

    rpushx命令从列表尾部插入元素。与rpush不同的是,当指定列表不存在时,该命令并不会创建一个空列表,而是直接返回。具体格式如下:

    rpushx key value
    • 1

    示例5:

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> rpushx mylist a
    (integer) 0
    127.0.0.1:6379> lrange mylist 0 -1
    (empty list or set)
    127.0.0.1:6379> lpush mylist a
    (integer) 1
    127.0.0.1:6379> rpushx mylist b
    (integer) 2
    127.0.0.1:6379> lrange mylist 0 -1
    1) "a"
    2) "b"
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    6、lpop命令

    lpop命令移除并返回list的表头元素。如果列表为空,则返回nil。具体格式如下:

    lpop key
    • 1

    示例6:

    127.0.0.1:6379> lpush mylist a
    (integer) 1
    127.0.0.1:6379> lpop mylist 
    "a"
    127.0.0.1:6379> lpop mylist
    (nil)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    7、rpop命令

    rpop命令移除并返回列表的尾部元素,如果列表为空,则返回nil。具体格式如下:

    rpop key
    • 1

    示例7:

    127.0.0.1:6379> lpush mylist a b
    (integer) 2
    127.0.0.1:6379> rpop mylist
    "a"
    127.0.0.1:6379> rpop mylist
    "b"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    8、lrem命令

    lrem命令从列表中移除前count次出现的值为value的元素,返回被移除的元素个数。具体格式如下:

    lrem key count value
    • 1

    其中count的含义如下:

    • count = 0:移除所有值为value的元素
    • count > 0:从头部往尾部移除count个值为value的元素
    • count < 0:从尾部往头部移除|count|(绝对值)个值为count的元素

      示例8:

    127.0.0.1:6379> lpush mylist a b a b c a e f
    (integer) 8
    127.0.0.1:6379> lrem mylist 0 a
    (integer) 3
    127.0.0.1:6379> lrange mylist 0 -1
    1) "f"
    2) "e"
    3) "c"
    4) "b"
    5) "b"
    127.0.0.1:6379> 
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    9、ltrim命令

    ltrim命令用于剪切指定列表,并保留下标范围为[start, stop]的元素。其中,start、stop均是从0开始计数的,也支持用负数来表示与列表尾部的偏移量。具体格式如下:

    ltrim key start stop
    • 1

    示例9:

    127.0.0.1:6379> lpush mylist a b c d e f // 插入后列表为f e d c b a 
    (integer) 6
    127.0.0.1:6379> ltrim mylist 0 2
    OK
    127.0.0.1:6379> lrange mylist 0 -1
    1) "f"
    2) "e"
    3) "d"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    10、lindex命令

    lindex命令返回列表中指定下标的元素,下标从0开始计数,也可以使用负数表示从列表尾部开始的偏移值。如果指定的下标超出了列表的下标范围则返回nil。具体格式如下:

    lindex key index
    • 1

    示例10:

    127.0.0.1:6379> lpush mylist a b c d e f
    (integer) 6
    127.0.0.1:6379> lindex mylist 2
    "d"
    • 1
    • 2
    • 3
    • 4

    11、llen命令

    llen命令返回列表的长度,如果指定列表不存在,Redis会将其当做空列表并返回长度0。具体格式如下:

    llen key
    • 1

    示例11:

    127.0.0.1:6379> lpush mylist 1 2 3
    (integer) 3
    127.0.0.1:6379> llen mylist
    (integer) 3
    • 1
    • 2
    • 3
    • 4

    12、linsert命令

    linsert是插入命令,它会在列表中查找指定元素,并在该元素之前或之后插入一个元素。如果指定的列表不存在,则不进行任何操作。该命令的返回值为执行插入操作后列表的长度,如果没有找到指定的值,则返回-1。具体格式如下:

    linsert key after|before search value
    • 1

    示例12:

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> rpush mylist a b c d
    (integer) 4
    127.0.0.1:6379> linsert mylist before b b1
    (integer) 5
    127.0.0.1:6379> lrange mylist 0 -1
    1) "a"
    2) "b1"
    3) "b"
    4) "c"
    5) "d"
    127.0.0.1:6379> linsert mylist before z no
    (integer) -1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    13、rpoplpush命令

    rpoplpush命令对两个列表进行原子操作:将列表source的尾部元素拿出来放到dest列表的头部。如果列表source不存在,则返回nil值,并不进行任何操作。具体格式如下:

    rpoplpush source dest:
    • 1

    示例13:

    127.0.0.1:6379> flushdb
    OK
    127.0.0.1:6379> rpush mylist1 a b
    (integer) 2
    127.0.0.1:6379> rpush mylist2 c d
    (integer) 2
    127.0.0.1:6379> rpoplpush mylist1 mylist2
    "b"
    127.0.0.1:6379> lrange mylist1 0 -1
    1) "a"
    127.0.0.1:6379> lrange mylist2 0 -1
    1) "b"
    2) "c"
    3) "d"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    14、lset命令

    lset命令用来设置指定下标元素的值。具体格式如下:

    lset key index value

    1

    示例14:

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

    除此之外,list的pop操作还有阻塞版本:

    blpop key timeout
    brpop key timeout  
    brpoplpush source destination timeout        

    timeout为等待超时时间,如果timeout为0则一直等待下去

  • 相关阅读:
    MYSQL router 自动均衡负载
    mysql router 自动failover测试
    Oracle数据库安装时 environment variable path 大于 1023
    windows删除多余启动引导项
    开机显示 invalid partition table
    有关软件的商业模式与软件代码的加密
    .Net 开源控件 NPlot使用小结
    41.关于Intellij IDEA菜单项中Compile、Make和Build的区别
    Maven:mirror和repository 区别
    28. Spring Boot配置方式
  • 原文地址:https://www.cnblogs.com/zxtceq/p/7721996.html
Copyright © 2011-2022 走看看