​作者:码农飞哥,

感谢您阅读本文,欢迎一键三连哦


文章目录

简介

Redis中的列表是简单的字符串列表,你可以添加一个元素到列表的头部(左边)或者尾部(右边),可以用它来做微博时间轴列表,还可以充当队列

常用命令

  1. 从左边/右边插入一个或多个值
#从左边插入
lpush <key1> <value1> <value2> ......
#从右边插入
rpush <key1> <value1> <value2> ......
  1. 从左边/右边吐出一个值,取出一个值就删除这个值,值在键在,值亡键亡。
#从左边吐出
lpop <key1>
#从右边吐出
rpop <key1>

Redis(六)-Redis的常用数据类型之list列表_redis
Redis(六)-Redis的常用数据类型之list列表_redis_02
Redis(六)-Redis的常用数据类型之list列表_redis_03
从上述示例中可以看出,从左边插入左边吐出的话,那就是先进后出的形式,从左边插入右边吐出的话那就是先进先出的形式。

  1. 从​​<key1>​​​列表右边吐出一个值,插到​​<key2>​​ 列表左边
rpoplpush <key1> <key2>
  1. 按照索引下标获得元素(从左到右), 其中​​<start> ​​​ 为0时指左边第一个,​​<stop>​​ 为-1时指右边第一个,(0~-1 表示获取所有)
lrange <key> <start> <stop>

Redis(六)-Redis的常用数据类型之list列表_数据结构_04

  1. 按照索引下标获得元素(从左到右)
lindex <key> <index>
  1. 获得列表长度
llen <key>

Redis(六)-Redis的常用数据类型之list列表_redis_05

  1. 在​​<value>​​​ 的前面|后面插入​​<newvalue>​​ 插入值
#在`<value>` 的前面插入`<newvalue>` 插入值
linsert <key> before <value> <newvalue>
#`<value>` 的后面插入`<newvalue>` 插入值
linsert <key> after <value> <newvalue>

Redis(六)-Redis的常用数据类型之list列表_数据结构_06

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

Redis(六)-Redis的常用数据类型之list列表_数据结构_07

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

Redis(六)-Redis的常用数据类型之list列表_链表_08

数据结构

List的数据结构为快速链表 quickList。
在列表元素较少的情况下使用一块连续的内存存储,这个结构是ziplist,也就是压缩列表。
它将所有的元素紧挨着一起存储,分配的是一块连续的内存。
当数据量较多的时候才会改成 quickList。
因为普通的链表需要的附加指针空间太大, 会比较浪费空间,比如这个列表中存的只是int类型数据,结构上海需要两个额外的指针prev和next。
Redis(六)-Redis的常用数据类型之list列表_链表_09

Redis 将链表和ziplist结合起来组成了quicklist。也就是将多个ziplist 使用双向指针串起来使用。这样既满足了快速的插入删除性能,又不会出现太大的空间冗余。
详情可以了解这篇文章​Redis(七)-Redis的list列表的数据结构-快速链表

参考

《Redis的设计与实现》
​Redis基本类型及其数据结构