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

Redis自学笔记:3.4入门-列表类型的更多相关文章

  1. Redis自学笔记:3.5入门-集合类型

    3.5集合类型 3.5.1介绍 在集合中的每个元素都是不同的,且没有顺序 表3-4集合类型和列表类型的对比 - 集合类型 列表类型 存储内容 至多232-1个字符串 至多232-1个字符串 有序性 否 ...

  2. Redis自学笔记:3.2入门-字符串类型

    3.2字符串类型 实际上redis不只是数据库,更多的公司和团队将redis用作缓存和 队列系统 3.2.1介绍 字符串类型是redis最基本的数据类型,它能存储任何形式的字符串, 包括二进制数据.你 ...

  3. Redis自学笔记:3.6入门-有序集合类型

    3.6有序集合类型 3.6.1介绍 在集合类型基础上,为集合中每个元素都关联了一个分数,故可以获得 分数最高(最低)的前N个元素,可以获得指定范围内的元素等 有序集合中每个元素不同,但它们的分数却可以 ...

  4. Redis自学笔记:3.3入门-散列类型

    3.3散列类型 3.3.1介绍 散列类型不能嵌套其他数据类型,一个散列类型可以包含至多232-1个字段 散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的数据, 而字段值则存储属性值 ...

  5. Redis自学笔记:3.1入门-热身

    第3章:入门 3.1热身 获取符合规则的键名列表:keys 匹配key 表3-1 glob风格通配符规则 符号 含义 ? 匹配一个字符 * 匹配任意个(包括0个)字符 [ ] 匹配括号间的任一字符,可 ...

  6. JavaScript高级程序设计之自学笔记(一)————Array类型

    以下为自学笔记. 一.Array类型 创建数组的基本方式有两种: 1.1第一种是使用Array构造函数(可省略new操作符). 1.2第二种是使用数组字面量表示法. 二.数组的访问 2.1访问方法 在 ...

  7. jQuery:自学笔记(1)——基础入门

    jQuery:自学笔记(1)——基础入门 认识JQuery 1.jQuery概述 jQuery是一个快速.小巧 .功能丰富的JavaScript函数库.它可以实现“写的少,做的多”的目标. jQuer ...

  8. Redis自学笔记:1.简介

    博主教材:李子骅.人民邮电出版社.<redis入门指南> 博主操作系统系统:虚拟机Ubuntu16.04 博主redis版本:3.0.6 第1章:简介 redis是一个开源的.高性能的.基 ...

  9. Redis自学笔记:4.4进阶-消息通知

    4.4消息通知 4.4.1任务队列 传递任务的队列.与任务队列进行交互的实体有两类,一类是生产者,一类是消费者. 生产者将需要处理的任务放入任务队列中,二消费者不断从任务队列中读入任务 信息并执行. ...

随机推荐

  1. LeetCode(101):对称二叉树

    Easy! 题目描述: 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2, ...

  2. 单击列表行前边的checkbox被选中,再单击,取消选中

    需求描述:单击datatabl的一行数据,前边的checkbox被勾选上,再次点击,选中取消,第一次碰到这种需求,不过呢也很实用,简单记录一下 代码: //html代码<tr class=&qu ...

  3. Python中的xxx+=xxx和xxx=xxx+xxx一些区别及执行过程

    预知小知识: Python中的变量与其他语言稍有差异,如a = 10并不是直接在内存中创建一个变量a其值为10,而是在内存中创建一个a这个a指向这个10,在Python中所有牵扯到等号的均不是值赋值, ...

  4. OrCAD Capture CIS 为库里的元器件添加新属性

    1.进入元器件编辑界面 2.菜单:Options > Part Properties... 3.在窗口User Properties中,点击按钮New... 4.在弹出的子窗口NewProper ...

  5. Python深度学习案例1--电影评论分类(二分类问题)

    我觉得把课本上的案例先自己抄一遍,然后将书看一遍.最后再写一篇博客记录自己所学过程的感悟.虽然与课本有很多相似之处.但自己写一遍感悟会更深 电影评论分类(二分类问题) 本节使用的是IMDB数据集,使用 ...

  6. 在Ubuntu下创建一个新的用户

    Step1:添加新用户useradd -r -m -s /bin/bash 用户名 Step2:配置新用户密码passwd 用户名 Step3:给新添加的用户增加ROOT权限vim /etc/sudo ...

  7. 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)

    在微服务架构中,需要几个基础的服务治理组件,包括服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个基础组件相互协作,共同组建了一个简单的微服务系统.一个简答的微服务系统如下图: ...

  8. requests之json系列(一)

    以post方式获取接口指定的相关信息 #! /usr/bin/env python # coding=utf-8 import json import urllib import requests i ...

  9. ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC)函数的使用

    ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN DESC)函数的作用是指定COLUMN(列)进行分区,在分区内指定COLUMN(列)进行排序 ...

  10. 在IDEA中编写Spark的WordCount程序

    1:spark shell仅在测试和验证我们的程序时使用的较多,在生产环境中,通常会在IDE中编制程序,然后打成jar包,然后提交到集群,最常用的是创建一个Maven项目,利用Maven来管理jar包 ...