zoukankan      html  css  js  c++  java
  • Redis自学笔记:3.4入门-列表类型

    3.4列表类型

    3.4.1介绍

    列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者
    获得列表的某一片段.

    优点:内部使用的是双向链表,所以向列表两端添加元素的时间复杂度为O(1),获取
    越接近两端的元素速度越快.

    • 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别
      指向直接后继和直接前驱
    • 时间复杂度是同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法
      乃至程序的效率。O(1)为常数阶.

    缺点:通过索引访问元素比较慢
    所以列表适合的应用于:
    1. 社交网站的新鲜事
    2. 记录日志

    • 和散列类型键相同,最多能容纳232-1个元素

    3.4.2命令

    1. 向列表两端增加元素
      lpush key value [value...]
      向列表左边增加元素
      rpush key value [value...]
      向列表右边增加元素
    2. 从列表两端弹出元素
      lpop key
      将列表左边的元素从列表中移除,并返回移除的元素值
      rpop key
      将列表左边的元素从列表中移除,并返回移除的元素值
    3. 获取列表中的元素个数
      llen key
      • 当键不存在时会返回0
    4. 获取列表片段
      lrange key start stop
      • redis获取列表片段方法:
        1. 所以从0开始,也支持负索引,表示从右边开始计算序数
        2. start的索引位置比stop的索引位置靠后,返回空列表
        3. 如果stop大于实际索引范围,则会返回到列表最右边的元素
        4. 片段包含stop元素(该处和python不同)
    5. 删除列表中指定的值
      lrem key count value
      删除列表中前count个值为value的元素,返回值是实际删除的元素个数.
      • count>0,lrem命令从左边开始删除
        count<0,lrem命令从右边开始删除
        count=0,lrem删除所有值为value的元素
    127.0.0.1:6379> lpush num 0 1 2 3
    4
    127.0.0.1:6379> rpush num -4 -5 -6
    7
    127.0.0.1:6379> lpop num
    3
    127.0.0.1:6379> rpop num
    -6
    127.0.0.1:6379> llen num
    5
    127.0.0.1:6379> lrange num 0 -1
    2
    1
    0
    -4
    -5
    
    127.0.0.1:6379> lpush num -4 2 0
    8
    127.0.0.1:6379> lrange num 0 -1
    0
    2
    -4
    2
    1
    0
    -4
    -5
    127.0.0.1:6379> lrem num 1 2
    1
    127.0.0.1:6379> lrem num -1 5
    0
    127.0.0.1:6379> lrem num 0 -4
    2
    127.0.0.1:6379> lrange num 0 -1
    0
    2
    1
    0
    -5
    

    3.4.3实践

    1. 存储文章ID列表
      我们使用列表型键posts:list记录文章ID列表.当发布新文章使用lpush命令
      把新文章的ID加入到这个列表中,删除文章时也要把列表中文章ID删除
      有了文章ID,可以使用lrange实现文章的分页,伪代码:
      $postsPerPage = 10
      $start = ($currentPage-1) * $postsPerPage
      $end = $currentPage * $postsPerPage -1
      $postsID = lrange posts:list,$start,$end
      # 获得了此页需要显示的文章ID,我们通过循环的方式读取文章
      for each $id in $postsID:
          $post = hgetall post:$id
          print 文章标题: $post.title
      
      该方法缺陷:
      1. 文章的发布时间不易修改
      2. 当文章数量较多时访问中间的页面性能较差
    2. 存储评论列表
      使用列表型键post:文章ID:comments来存储某个文章的所有评论,伪代码:
      # 将评论序列化字符串
      $serializedComment = serialize($author,$email,$time,$content)
      lpush post:42:comments,$serializedComment
      

    3.4.4命令拾遗

    1. 获得/设置指定索引的元素值
      lindex key index
      lset key index value
      127.0.0.1:6379> rpush 诗人 李白 杜甫 白居易 
      3
      127.0.0.1:6379> lindex 诗人 2
      白居易
      127.0.0.1:6379> lset 诗人 2 王维
      OK
      127.0.0.1:6379> lrange 诗人 0 -1
      李白
      杜甫
      王维
      
    2. 只保留列表指定片段
      ltrim key start end
      127.0.0.1:6379> ltrim 诗人 0 1
      OK
      127.0.0.1:6379> lrange 诗人 0 -1
      李白
      杜甫
      
      • 可应用于日志,只保留最近100条
    3. 向列表中插入元素
      linsert key befor pivot value
      向pivot前追加元素,返回值为列表长度
      linsert key after pivot value
      向pivot后追加元素,返回值为列表长度
      127.0.0.1:6379> linsert 诗人 before 李白 曹操
      3
      127.0.0.1:6379> linsert 诗人 after 杜甫 杜牧 
      4
      127.0.0.1:6379> lrange 诗人 0 -1
      曹操
      李白
      杜甫
      杜牧
      
    4. 将元素从一个表转到另一个表
      rpoplpush source destination
      • 先执行rpop再执行lpush
  • 相关阅读:
    Linux之文件处理命令
    Linux基础命令
    rip实验
    Linux基础之磁盘分区
    mysql安装
    centos Apache、php、mysql默认安装路径
    You probably tried to upload too large file. Please refer to documentation for ways to workaround this limit.
    Wrong permissions on configuration file, should not be world writable!
    机器会学习么 学习总结
    实验 5 Spark SQL 编程初级实践
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10206927.html
Copyright © 2011-2022 走看看