zoukankan      html  css  js  c++  java
  • redis push/pop(List)的17条命令

    一、Blpop 命令移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    redis 127.0.0.1:6379> BLPOP LIST1 LIST2 .. LISTN TIMEOUT
    返回值
    如果列表为空,返回一个 nil 。 否则,返回一个含有两个元素的列表,第一个元素是被弹出元素所属的 key ,第二个元素是被弹出元素的值。
    redis 127.0.0.1:6379> BLPOP list1 100
    在以上实例中,操作会被阻塞,如果指定的列表 key list1 存在数据则会返回第一个元素,否则在等待100秒后会返回 nil 。
    (nil)
    (100.06s)

    取数据lpop有个增强版本,blpop(block left pop)阻塞版本,使用方法:blpop key1 key2 ... keyn 10

    同时预获取多个key的值,并设置超时时间为10s,如果所有key,有些key有value就立即返回,如果所有key都没有value就阻塞10秒返回

    技术分享图片

    技术分享图片

    关于blpop多个key返回数据的顺序,比如blpop mylist mylist2 5这个命令,先检查mylist有数据就返回,如果没有数据,就检查mylist2依次。。。。直到所有key检查完如果都没有数据就阻塞。

    这种从多个队列里面取数据的方式可以用来做优先级的队列,比如mylist队列的优先级高于mylist2,push的时候,高优先级就push到mylist里面,普通优先级就push到mylist2里面,

    这样就会先取mylist里面的高优先级的数据来处理。

    但是,如果遇到队列的优先级等级过多,比如有(0-9999)个优先级,上面就不行了。解决思路是插入的时候先把数据取出来自己实现二分查找找出该插入的位置,用lset命令插入。

    如果数据过多,比如队列有几十万,可以把队列分成几十个或几百个小队列,比如0号队列存优先级为(0-1000),1号队列存优先级为(1001-2000)的数据,依次。。。。。

    二、Brpop 命令移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。


    三、Brpoplpush 命令从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
    redis 127.0.0.1:6379> BRPOPLPUSH LIST1 ANOTHER_LIST TIMEOUT 
    假如在指定时间内没有任何元素被弹出,则返回一个 nil 和等待时长。 反之,返回一个含有两个元素的列表,第一个元素是被弹出元素的值,第二个元素是等待时长。

    # 非空列表
    redis> BRPOPLPUSH msg reciver 500
    "hello moto" # 弹出元素的值
    (3.38s) # 等待时长

    redis> LLEN reciver
    (integer) 1

    redis> LRANGE reciver 0 0
    1) "hello moto"

    # 空列表
    redis> BRPOPLPUSH msg reciver 1
    (nil)
    (1.34s)


    四、Lindex 命令用于通过索引获取列表中的元素。你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
    redis 127.0.0.1:6379> LINDEX KEY_NAME INDEX_POSITION 
    列表中下标为指定索引值的元素。 如果指定索引值不在列表的区间范围内,返回 nil 。

    实例
    redis 127.0.0.1:6379> LPUSH mylist "World"
    (integer) 1

    redis 127.0.0.1:6379> LPUSH mylist "Hello"
    (integer) 2

    redis 127.0.0.1:6379> LINDEX mylist 0
    "Hello"

    redis 127.0.0.1:6379> LINDEX mylist -1
    "World"

    redis 127.0.0.1:6379> LINDEX mylist 3 # index不在 mylist 的区间范围内
    (nil)


    五、Linsert 命令用于在列表的元素前或者后插入元素。 当指定元素不存在于列表中时,不执行任何操作。 当列表不存在时,被视为空列表,不执行任何操作。 如果 key 不是列表类型,返回一个错误。
    redis 127.0.0.1:6379> LINSERT KEY_NAME BEFORE EXISTING_VALUE NEW_VALUE 
    如果命令执行成功,返回插入操作完成之后,列表的长度。 如果没有找到指定元素 ,返回 -1 。 如果 key 不存在或为空列表,返回 0 。

    实例
    redis 127.0.0.1:6379> RPUSH list1 "foo"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH list1 "bar"
    (integer) 2
    redis 127.0.0.1:6379> LINSERT list1 BEFORE "bar" "Yes"
    (integer) 3
    redis 127.0.0.1:6379> LRANGE mylist 0 -1
    1) "foo"
    2) "Yes"
    3) "bar"

    六、Llen 命令用于返回列表的长度。 如果列表 key 不存在,则 key 被解释为一个空列表,返回 0 。 如果 key 不是列表类型,返回一个错误。
    redis 127.0.0.1:6379> LLEN KEY_NAME 
    实例
    redis 127.0.0.1:6379> RPUSH list1 "foo"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH list1 "bar"
    (integer) 2
    redis 127.0.0.1:6379> LLEN list1
    (integer) 2

    七、Lpop 命令用于移除并返回列表的第一个元素。
    redis 127.0.0.1:6379> LLEN KEY_NAME 
    列表的第一个元素。 当列表 key 不存在时,返回 nil 。

    实例
    redis 127.0.0.1:6379> RPUSH list1 "foo"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH list1 "bar"
    (integer) 2
    redis 127.0.0.1:6379> LPOP list1
    "foo"

    八、Lpush 命令将一个或多个值插入到列表头部。 如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作。 当 key 存在但不是列表类型时,返回一个错误。
    redis 127.0.0.1:6379> LPUSH KEY_NAME VALUE1.. VALUEN

    返回值
    执行 LPUSH 命令后,列表的长度。

    实例
    127.0.0.1:6379> LPUSH list1 "foo"
    (integer) 1
    127.0.0.1:6379> LPUSH list1 "bar"
    (integer) 2
    127.0.0.1:6379> LRANGE list1 0 -1
    1) "bar"
    2) "foo"


    九、Lpushx 将一个或多个值插入到已存在的列表头部,列表不存在时操作无效。
    redis 127.0.0.1:6379> LPUSHX KEY_NAME VALUE1.. VALUEN

    返回值
    LPUSHX 命令执行之后,列表的长度。

    实例
    127.0.0.1:6379> LPUSH list1 "foo"
    (integer) 1
    127.0.0.1:6379> LPUSHX list1 "bar"
    (integer) 2
    127.0.0.1:6379> LPUSHX list2 "bar"
    (integer) 0
    127.0.0.1:6379> LRANGE list1 0 -1
    1) "bar"
    2) "foo"

    十、Lrange 返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。
    redis 127.0.0.1:6379> LRANGE KEY_NAME START END

    返回值
    一个列表,包含指定区间内的元素。

    实例
    redis 127.0.0.1:6379> LPUSH list1 "foo"
    (integer) 1
    redis 127.0.0.1:6379> LPUSH list1 "bar"
    (integer) 2
    redis 127.0.0.1:6379> LPUSHX list1 "bar"
    (integer) 0
    redis 127.0.0.1:6379> LRANGE list1 0 -1
    1) "bar"
    2) "bar"
    3) "foo"


    十一、Lrem 根据参数 COUNT 的值,移除列表中与参数 VALUE 相等的元素。
    COUNT 的值可以是以下几种:
    count > 0 : 从表头开始向表尾搜索,移除与 VALUE 相等的元素,数量为 COUNT 。
    count < 0 : 从表尾开始向表头搜索,移除与 VALUE 相等的元素,数量为 COUNT 的绝对值。
    count = 0 : 移除表中所有与 VALUE 相等的值。
    redis 127.0.0.1:6379> LREM KEY_NAME COUNT VALUE

    返回值
    被移除元素的数量。 列表不存在时返回 0 。

    实例
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 2
    redis 127.0.0.1:6379> RPUSH mylist "foo"
    (integer) 3
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 4
    redis 127.0.0.1:6379> LREM mylist -2 "hello"
    (integer) 2

    十二、Lset 通过索引来设置元素的值。当索引参数超出范围,或对一个空列表进行 LSET 时,返回一个错误。关于列表下标的更多信息,请参考 LINDEX 命令。

    redis 127.0.0.1:6379> LSET KEY_NAME INDEX VALUE

    返回值
    操作成功返回 ok ,否则返回错误信息。

    实例
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 2
    redis 127.0.0.1:6379> RPUSH mylist "foo"
    (integer) 3
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 4
    redis 127.0.0.1:6379> LSET mylist 0 "bar"
    OK
    redis 127.0.0.1:6379> LRANGE mylist 0 -1
    1: "bar"
    2) "hello"
    3) "foo"
    4) "hello"

    十三、Ltrim 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。
    下标 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

    redis 127.0.0.1:6379> LTRIM KEY_NAME START STOP

    返回值
    命令执行成功时,返回 ok 。

    实例
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 2
    redis 127.0.0.1:6379> RPUSH mylist "foo"
    (integer) 3
    redis 127.0.0.1:6379> RPUSH mylist "bar"
    (integer) 4
    redis 127.0.0.1:6379> LTRIM mylist 1 -1
    OK
    redis 127.0.0.1:6379> LRANGE mylist 0 -1
    1) "hello"
    2) "foo"
    3) "bar"

    十四、Rpop 命令用于移除并返回列表的最后一个元素。

    redis 127.0.0.1:6379> RPOP KEY_NAME

    返回值
    列表的最后一个元素。 当列表不存在时,返回 nil 。

    实例
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 2
    redis 127.0.0.1:6379> RPUSH mylist "foo"
    (integer) 3
    redis 127.0.0.1:6379> RPUSH mylist "bar"
    (integer) 4
    redis 127.0.0.1:6379> RPOP mylist
    OK
    redis 127.0.0.1:6379> LRANGE mylist 0 -1
    1) "hello"
    2) "hello"
    3) "foo"

    十五、Rpoplpush 命令用于移除列表的最后一个元素,并将该元素添加到另一个列表并返回。

    redis 127.0.0.1:6379> RPOPLPUSH SOURCE_KEY_NAME DESTINATION_KEY_NAME

    返回值
    被弹出的元素。

    实例
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH mylist "foo"
    (integer) 2
    redis 127.0.0.1:6379> RPUSH mylist "bar"
    (integer) 3
    redis 127.0.0.1:6379> RPOPLPUSH mylist myotherlist
    "bar"
    redis 127.0.0.1:6379> LRANGE mylist 0 -1
    1) "hello"
    2) "foo"

    十六、Rpush 命令用于将一个或多个值插入到列表的尾部(最右边)。如果列表不存在,一个空列表会被创建并执行 RPUSH 操作。 当列表存在但不是列表类型时,返回一个错误。注意:在 Redis 2.4 版本以前的 RPUSH 命令,都只接受单个 value 值。

    redis 127.0.0.1:6379> RPUSH KEY_NAME VALUE1..VALUEN

    返回值
    执行 RPUSH 操作后,列表的长度。

    实例
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH mylist "foo"
    (integer) 2
    redis 127.0.0.1:6379> RPUSH mylist "bar"
    (integer) 3
    redis 127.0.0.1:6379> LRANGE mylist 0 -1
    1) "hello"
    2) "foo"
    3) "bar"

    十七、Rpushx命令用于将一个或多个值插入到已存在的列表尾部(最右边)。如果列表不存在,操作无效。

    redis 127.0.0.1:6379> RPUSHX KEY_NAME VALUE1..VALUEN

    返回值
    执行 Rpushx 操作后,列表的长度。

    实例
    redis 127.0.0.1:6379> RPUSH mylist "hello"
    (integer) 1
    redis 127.0.0.1:6379> RPUSH mylist "foo"
    (integer) 2
    redis 127.0.0.1:6379> RPUSHX mylist2 "bar"
    (integer) 0
    redis 127.0.0.1:6379> LRANGE mylist 0 -1
    1) "hello"
    2) "foo"

    原文:https://www.cnblogs.com/timxgb/p/9114253.html

  • 相关阅读:
    MySQL与Oracle数据库差异对比
    阿里ECS服务器远程桌面访问报错
    单分派和多分派
    博客主题
    论文阅读:LIC-Fusion: LiDAR-Inertial-Camera Odometry
    如何科研(自动化所 张世峰)
    读论文
    SLAM十四讲第二版项目代码总结
    LeetCode 982. Triples with Bitwise AND Equal To Zero
    论文阅读:Visual-Inertial Localization With Prior LiDAR Map Constraints
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/11431147.html
Copyright © 2011-2022 走看看