zoukankan      html  css  js  c++  java
  • Redis的Lists数据类型

    Lists 就是链表,相信略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消息排行等功能。Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。

    本文的命令参考:http://www.redisdoc.com/en/latest/list/index.html 

    默认的后进先出队列操作

    127.0.0.1:6379> lpush studens "John Doe"
    (integer) 1
    127.0.0.1:6379> lpush studens "Captain Kirk"
    (integer) 2
    127.0.0.1:6379> lpush studens "Tom"
    (integer) 3
    127.0.0.1:6379> llen studens
    (integer) 3
    127.0.0.1:6379> lpop studens
    "Tom"
    127.0.0.1:6379> llen studens
    (integer) 2

    lrange 取链表中其中一段

    参考:http://www.redisdoc.com/en/latest/list/lrange.html

    127.0.0.1:6379> lpush studens "TTom"
    (integer) 3
    127.0.0.1:6379> llen studens
    (integer) 3
    127.0.0.1:6379>
    127.0.0.1:6379>
    127.0.0.1:6379> lrange studens 0 3
    1) "TTom"
    2) "Captain Kirk"
    3) "John Doe"
    127.0.0.1:6379> lrange studens 0 0
    1) "TTom"
    127.0.0.1:6379> llen studens
    (integer) 3

    从链表中移除元素

    127.0.0.1:6379> llen studens
    (integer) 5
    127.0.0.1:6379> lrange studens 0 4
    1) "ghj"
    2) "345"
    3) "TTom"
    4) "Captain Kirk"
    5) "John Doe"
    127.0.0.1:6379> lrem studens 0 "345"
    (integer) 1
    127.0.0.1:6379> lrange studens 0 4
    1) "ghj"
    2) "TTom"
    3) "Captain Kirk"
    4) "John Doe"

    注意:

    LREM key count value

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

    count 的值可以是以下几种:

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

    链表中指定位置插入

     

    127.0.0.1:6379> llen studens
    (integer) 4
    127.0.0.1:6379> lrange studens 0 3
    1) "ghj"
    2) "TTom"
    3) "Captain Kirk"
    4) "John Doe"
    127.0.0.1:6379> linsert studens before "TTom33" "TTom"
    (integer) -1
    127.0.0.1:6379> lrange studens 0 4
    1) "ghj"
    2) "TTom"
    3) "Captain Kirk"
    4) "John Doe"
    127.0.0.1:6379> linsert studens before "TTom" "TTom33"
    (integer) 5
    127.0.0.1:6379> lrange studens 0 4
    1) "ghj"
    2) "TTom33"
    3) "TTom"
    4) "Captain Kirk"
    5) "John Doe"
    127.0.0.1:6379>

    说明:

    LINSERT key BEFORE|AFTER pivot value

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

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

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

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

    对链表进行裁剪

    127.0.0.1:6379> llen studens
    (integer) 5
    127.0.0.1:6379> lrange studens 0 4
    1) "ghj"
    2) "TTom33"
    3) "TTom"
    4) "Captain Kirk"
    5) "John Doe"
    127.0.0.1:6379> ltrim studens 1 3
    OK
    127.0.0.1:6379> llen studens
    (integer) 3
    127.0.0.1:6379> lrange studens 0 4
    1) "TTom33"
    2) "TTom"
    3) "Captain Kirk"
    127.0.0.1:6379>

    说明:

    LTRIM key start stop

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

    举个例子,执行命令 LTRIM list 0 2 ,表示只保留列表 list 的前三个元素,其余元素全部删除。

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

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

    当 key 不是列表类型时,返回一个错误。

    LTRIM 命令通常和 LPUSH 命令或 RPUSH 命令配合使用,举个例子:

    LPUSH log newest_log
    LTRIM log 0 99
    这个例子模拟了一个日志程序,每次将最新日志 newest_log 放到 log 列表中,并且只保留最新的 100 项。注意当这样使用 LTRIM 命令时,时间复杂度是O(1),因为平均情况下,每次只有一个元素被移除。

    注意LTRIM命令和编程语言区间函数的区别

    假如你有一个包含一百个元素的列表 list ,对该列表执行 LTRIM list 0 10 ,结果是一个包含11个元素的列表,这表明 stop 下标也在 LTRIM 命令的取值范围之内(闭区间),这和某些语言的区间函数可能不一致,比如Ruby的 Range.new 、 Array#slice 和Python的 range() 函数。

    超出范围的下标

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

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

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

     

    参考资料:

    Redis 命令参考
    http://www.redisdoc.com/en/latest/index.html

    十五分钟介绍 Redis数据结构
    http://blog.nosqlfan.com/html/3202.html

    Redis系统性介绍
    http://blog.nosqlfan.com/html/3139.html

    Redis之七种武器
    http://blog.nosqlfan.com/html/2942.html

    试用redis
    http://try.redis.io/

    Redis 设计与实现
    http://www.redisbook.com/en/latest/

  • 相关阅读:
    5.1重磅活动:区块链免费送书
    Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
    Linux负载均衡利器(LVS)
    豌豆荚Redis集群方案:Codis
    Spring Boot Redis Cluster实战
    高性能代理缓存服务器—Squid
    Facebook分布式框架—Thrift介绍。
    Java 高级面试知识点汇总!
    (4)设计模式-建造者模式
    (3)设计模式-单例模式
  • 原文地址:https://www.cnblogs.com/ghj1976/p/3556233.html
Copyright © 2011-2022 走看看