[redis] list

1、基础

  • lpush/rpush key value1 value2…:在指定的key的list的头部/尾部插入所有的values,如果该key不存在,该命令在插入的之前创建该key和空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
  • lrange key start end:获取链表中从start到end的元素的值,start、end可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推…
  • lpushx/rpushx key value:仅当参数中指定的key存在时,在指定key的list的头部/尾部插入value。如果该key是不存在的,也就插入失败。
  • lpop.rpop key:返回并删除指定key的链表中头元素/尾元素。
  • rpoplpush resource destination:将resource链表中的尾部元素取出并删除,然后添加到destination链表的头部。
  • llen key:返回指定的key链表中的元素的数量
  • lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。
  • lrem key count value:删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。
  • linsert key after/before pivot value:在pivot元素之后/之前插入value这个元素。

2、底层

链表是一种常用的数据结构,C 语言内部是没有内置这种数据结构的实现,所以Redis自己构建了链表的实现。

链表定义:

typedef  struct listNode{
    //前置节点
    struct listNode *prev;
    //后置节点
    struct listNode *next;
    //节点的值
    void *value;  
}listNode

通过多个 listNode 结构就可以组成链表,这是一个双向链表,Redis还提供了操作链表的数据结构:

typedef struct list{
    //表头节点
    listNode *head;
    //表尾节点
    listNode *tail;
    //链表所包含的节点数量
    unsigned long len;
    //节点值复制函数
    void (*free) (void *ptr);
    //节点值释放函数
    void (*free) (void *ptr);
    //节点值对比函数
    int (*match) (void *ptr,void *key);
}list;

在这里插入图片描述

Redis链表特性:

  1. 双端:链表具有前置节点和后置节点的引用,获取这两个节点时间复杂度都为O(1)。
  2. 无环:表头节点的 prev 指针和表尾节点的 next 指针都指向 NULL,对链表的访问都是以 NULL 结束。
  3. 链表长度计数器:通过 len 属性获取链表长度的时间复杂度为 O(1)。
  4. 多态:链表节点使用 void* 指针来保存节点值,可以保存各种不同类型的值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值