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
  • 相关阅读:
    NuGet Package Explorer使用教程下载
    .NET 大数据量并发解决方案
    ASP.NET Core 中间件 中间件(Middleware)和过滤器(Filter)的区别
    C#的dapper使用
    Quartz.NET实现作业调度
    .Net Core + DDD基础分层 + 项目基本框架 + 个人总结
    asp.net mvc框架之EF的使用
    Asp.Net MVC+EF+三层架构的完整搭建过程
    WebAPI异常捕捉处理,结合log4net日志(webapi2框架)
    SQL SERVER 2012数据库:开启防火墙导致外部无法连接数据库解决办法
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10206927.html
Copyright © 2011-2022 走看看