List类型

List的特点:单键多值
Redis的List是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两段的操作性能很高,通过索引下标的操作中间的节点性能会较差。

底层数据结构

Redis中的List类型底层使用数据结构为快速链表(quicklist)

  1. 数据量较少时
    在列表元素较少的情况下会使用一块连续的内存储存,这个结构是ziplist,也即是压缩链表。
    它将所有的元素紧挨着一起储存,分配的是一块连续的内存。

  2. 数据量较多时
    当数据量比较多的时候才会改成quicklist
    因为普通链表需要的附加指针空间太大,会比较浪费空间,如普通双向链表结构上每个节点都需要一个next和prev指针。
    而Redis将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist使用双向指针串起来使用。这样既满足了快速的插入、删除性能,又不会出现太大的空间冗余。如下图:

常用命令

  1. 从左边插入一个或多个值
lpush <key> <value1> <value2> <value3> ...

如下图:

  1. 从右边插入一个或多个值
rpush <key> <value1> <value2> <value3> ...

如下图:

上面的lrange命令是按照索引下标获得元素(从左到右)。
那么lpush和rpush插入的数据,在执行lrange时的结果为什么会发生不同呢?
从左边插入:

从右边插入:

由上图我们可以发现,lpush和rpush插入操作像一个压栈操作,先插入的值被压向里面。因为插入的方向不同,所以使用lrange命令输出的值的顺序不一样。

  1. 从左边吐出一个值
lpop <key>

如下图:

  1. 从右边吐出一个值
rpop <key>

如下图:

注意:lpop和rpop操作都需要注意,值在键在,值光键亡。当所有的值都被吐出之后,这个键(key)就不存在了。
如下图:

由上图我们可以看到,当我们把值全吐出来之后,就不存在key1这个键了。

  1. 从key1列表右边吐出一个值,插入到key2列表左边
rpoplpush <key1> <key2>

如下图:

由上图我们可以看到,rpoplpush命令将列表key1中右边的value1出栈,然后将value1再入栈到key2的左边。

  1. 按照索引下标获取元素(从左到右)
lrange <key> <start> <stop>

如下图:

注意:lrange key 0 -1中0表示左边第一个,-1表示右边第一个,所以0 -1表示获取所有值。

  1. 按照索引下标获取元素(从左到右)
lindex <key> <index>

如下图:

  1. 获取列表长度
llen <key>

如下图:

  1. 在value前面插入newvalue插入值
linsert <key> before <value> <newvalue>

如下图:

由上图我们可以看到,如果存在多个相同的值的话,该命令会选择最近的(从左往右)value前面插入新的值。

  1. 从左边删除n个value(从左到右)
lrem <key> <n> <value>

如下图:

删除n个值为value1的值

  1. 将列表key下标为index的值替换成value
lset <key> <index> <value>

如下图:

Redis初学:6(List类型)相关推荐

  1. Redis初学:7(Set类型)

    Set集合类型 简介 Redis里面的Set类型跟Java里面的Set一样,都是带有自动除重的,它里面不会出现重复的数据. 特点:自动除重 底层数据结构 Redis中的Set是一个String类型的无 ...

  2. Redis初学:5(String类型的基本操作)

    String类型 String类型是Redis中最基本的类型,String类型有以下的一些特点: String类型是二进制安全的,这意味着String类型可以包含任何的数据,如:图片.序列化的对象等: ...

  3. Redis中对ZSet类型的操作命令

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- ------------ ...

  4. Redis工作笔记-Hash类型

    目录 概述 操作 概述 Redis中的Hash类型看成具有String Key和String Value的map容器.所以该类型非常适合于存储键值对象的信息.如Username.Password和Ag ...

  5. java使用redis incr,JFinal Redis plugin 有关数值类型incr操作的bug

    先上测试代码:public class TestCache { private static final Cache testCache = Redis.use(CacheCons.TEST) ; p ...

  6. 系统学习redis之五——redis数据类型之list类型及操作

    list数据类型介绍 list是一个链表结构,主要功能是push.pop.获取一个范围的所有值等等,操作中key可以理解为链表的名字.redis的list类型其实就是一个每个子元素都是string类型 ...

  7. zset获取指定score_7、Redis中对ZSet类型的操作命令

    写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------- ------------ ...

  8. Redis数据类型(hash 类型)

    Redis数据类型(hash 类型) hash 类型及操作 ① 概述 ② 相关命令列表 ③ 命令示例 hash 类型及操作 ① 概述 Redis中的Hash类型可以理解是具有String Key和St ...

  9. Redis初学:9(Zset类型)

    Zset(有序集合)类型 简介 Redis里面的有序集合Zset和集合Set非常相似,都是一个没有重复元素的字符串集合. 不同之处是有序集合Zset里面的每个成员都关联了一个评分(score),这个s ...

最新文章

  1. 自制启动盘分享(30天倒计时)
  2. 软件测试的测什么,软件测试人员应具备哪些能力?
  3. 如何理解深度学习分布式训练中的large batch size与learning rate的关系?
  4. 操作系统课设——吃水果问题
  5. 走进移动支付:开启物联网时代的商务之门
  6. Firefox UI已迁移至Web Components
  7. Golang 特性简介
  8. linux支持ppp网卡,linux和安卓上(ppp widget)使用3g网卡的方法
  9. GEEK学习笔记— —程序员面试宝典笔记(四)
  10. 条码打印软件标签纸页面设置的方法
  11. 【SDK】Android海康网络SDK实现人脸和车牌等报警图片抓拍功能
  12. 2022-2028年全球一次性视频内窥镜行业收入年复合增长率CAGR为 42.6%
  13. [ZT]千兆光纤 GBIC和SFP接口规格介绍
  14. 骑行318、 2016.7.15
  15. EntityComponentSystemSamples学习笔记
  16. 数据库多对多关系建表
  17. 卫星导航之如何画出常见的图形世界地图、多路径、天空图等
  18. 基于SIR的社交网络谣言传播问题简单建模
  19. BGP进阶:BGP 综合实验一
  20. 4大重要营销概念的正本清源

热门文章

  1. 在Ubuntu 16.04.5 LTS上利用python中的PIL模块压缩一百多兆的单张图片实操
  2. 在CentOS 6.6 64bit上升级GCC到4.8.2版本
  3. CentOS 6.3+Python 2.7.10安装pycurl遇到的问题汇总
  4. libcurl选项CURLOPT_WRITEDATA中的“坑”
  5. LSM 优化系列(六)-- 【ATC‘20】MatrixKV : NVM 的PMEM 在 LSM-tree的write stall和写放大上的优化
  6. 联想电脑 Realtek RTL8821CE 无线网卡 驱动安装 16.04/18.04
  7. Linux命令之top
  8. 米勒罗宾素性测试(Miller–Rabin primality test)
  9. Spring Boot项目错误:Error parsing lifecycle processing instructions
  10. 排序算法7---快速排序算法