redis学习笔记(13)---列表命令及实现

本文详细介绍了Redis中的List数据结构,包括LPUSH、RPUSH、LPOP、RPOP等命令的使用和实现原理。Redis List采用双向链表,支持多种编码方式,如ziplist和linkedlist。文章通过解析命令的执行流程,展示了如何处理push、pop、lindex等操作,以及在不同编码方式下插入元素的方法。此外,还提到了列表长度计算、元素插入位置判断和编码转换的条件。
摘要由CSDN通过智能技术生成

列表命令

Redis中的List对象的类型为REDIS_LIST,是一种双向链表结构,主要支持以下几种命令:

  1. LPUSH 向列表左端添加元素,用法:LPUSH key value
  2. RPUSH 向列表右端添加元素,用法:RPUSH key value
  3. LPOP 从列表左端弹出元素,用法:LPOP key
  4. RPOP 从列表右端弹出元素,用法:RPOP key
  5. LLEN 获取列表中元素个数,用法:LLEN key
  6. LRANGE 获取列表中某一片段的元素,用法:LRANGE key start stop,index从0开始,-1表示最后一个元素
  7. LREM 删除列表中指定的值,用法:LREM key count value,删除列表中前count个值为value的元素,当count>0时从左边开始数,count<0时从右边开始数,count=0时会删除所有值为value的元素
  8. LINDEX 获取指定索引的元素值,用法:LINDEX key index
  9. LSET 设置指定索引的元素值,用法:LSET key index value
  10. LTRIM 只保留列表指定片段,用法:LTRIM key start stop,包含start和stop
  11. LINSERT 像列表中插入元素,用法:LINSERT key BEFORE|AFTER privot value,从左边开始寻找值为privot的第一个元素,然后根据第二个参数是BEFORE还是AFTER决定在该元素的前面还是后面插入value
  12. RPOPLPUSH 将元素从一个列表转义到另一个列表,用法:RPOPLPUSH source destination

   除此之外,还有一些阻塞式命令:
  
   BLPOP
   BRPOP
   BRPOPLPUSH
 

编码方式

List的相关操作主要定义在t_list.c中。

列表对象支持两种编码方式:

#define REDIS_ENCODING_LINKEDLIST 4 
#define REDIS_ENCODING_ZIPLIST 5 
即底层列表可以通过ziplist或LinkedList来实现,两种链表的实现分别在ziplist.c和adlist.c中

命令的具体实现

在上一章中,我们已经知道当有一个客户端请求到来时

  1. server端会调用readQueryFromClient()来进行处理
  2. 其中首先会调用processInputBuffer()来解析输入请求,并为每一个参数创建一个字符串对象
  3. 调用processCommand并最终调用call来执行命令
由于在call命令之前的处理与字符串命令基本相同,因此本文只介绍调用call命令之后的处理。

1、push命令 (lpush、rpush、lpushx、rpushx)

1.1、lpush & rpush

eg:LPUSH key value [value …]
lpush将一个或多个值 value 插入到列表 key 的表头,rpush则是插入到表的尾部
当 key 存在但不是列表类型时,返回一个错误
如果 key 不存在,一个空列表会被创建并执行 LPUSH 操作

   在调用 lpush key val1 val2 val3时, redis是从前到后依次将每一个value插入到list的头部的。
   即先将val1插入到头部,再将val2插入到头部,最后将val3插入到头部,因此最后val3会在list的头部。
   即最终在list中的先后顺序是:
  表头—>val3—>val2—>val1—>表尾

1.2、lpushx & rpushx

eg:LPUSHX key value
lpushx将v
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值