【Redis】数据类型——list

本文详细介绍了Redis中List数据结构的基本操作及其底层实现原理,包括启动Redis服务器和客户端的方法,lpush、rpush、lrange等命令的具体用法,并探讨了Redis如何利用链表和压缩列表实现高效的数据存储。

一、操作

1.启动redis服务器

 ./redis-server redis.conf

2.启动Redis的客户端

./redis-cli -p 6379

3.lpush rpush lrange操作:从左边,右边设置值和获取值

lpush k1 v1
lpush k1 v0
rpush k1 v2
lrange k1 0 -1

格式: lpush key value rpush key value
lrange key start stop
在这里插入图片描述
4.lpop rpop:从列表的左边或者右边移除值
格式: lpop key rpop key

lpop k1 
rpop k2

在这里插入图片描述
在这里插入图片描述
5.lindex:获取指定下标的值
格式: lindex key index

lindex k1 0

在这里插入图片描述
6.llen:获取列表中的元素个数
格式: llen key

llen k1

在这里插入图片描述
7.lrem:移除列表中的元素
格式:lrem key count value

lrem k1 v0

在这里插入图片描述
8.ltrim:截取列表的值
格式:ltrim key start stop

ltrim k1 1 2

在这里插入图片描述
9.rpoplpush:移除列表中最后一个元素,将它添加到另一个列表中
格式: rpoplpush key1 key2

rpoplpush k1 k2

在这里插入图片描述
10.linsert:在列表中插入值
格式: linsert key before|after value new_value

linsert k1 before v2 a
linsert k1 after v2 b

在这里插入图片描述
在这里插入图片描述
11.lset:根据下标替换列表中的值
格式: lset key index value

lset k1 2 c

在这里插入图片描述
12.小结:
(1)他实际上是一个链表,before or after, left,right都可以插入值
(2)如果key不存在,创建新的链表
(3)如果key存在,新增内容
(4)如果移除了所有的值,空链表,也代表不存在
(5)在两边插入或者改动值,效率最高!中间元素,相对来说效率会低一点
(6)在Redis中,我们可以把list完成栈、队列、阻塞队列
(7)队列: LPOP RPUSH
(8)栈: LPOP LPUSH

二、底层原理

Redis的list使用的是链表数据结构进行数据存储,这就意味着list 的插入、删除操作非常快,为O(1) 复杂度的操作。而查找操作则十分的缓慢,为O(n)。但实际上,Redis的list并不简单使用链表实现,在list元素较少的时候,使用的是一种连续内存空间的数据结构ziplist(压缩列表)进行存储。这样做的好处是防止过多的不连续的内存碎片产生,同时也避免了过多的链表前趋、后继指针占用过多的内存空间。
1.定义

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

2.优点:
(1)带链表长度计数器:通过 len 属性获取链表长度的时间复杂度为 O(1)。
(2)双向:链表具有前置节点和后置节点的引用,获取这两个节点时间复杂度都为O(1)。
(3)链表节点使用 void* 指针来保存节点值,可以保存各种不同类型的值。

### RedisList 数据类型的用法和特性 #### 使用方法与操作命令 Redis 的 `List` 类型是一种简单的字符串链表,按照插入顺序排序。可以将新元素推送到列表的头部(左侧)或者尾部(右侧),这使得它非常适合用于队列或栈的操作[^4]。 常用的操作命令如下: - **LPUSH key value [value ...]** 将一个或多个值插入到列表头部。如果键不在,则创建一个新的列表并执行 LPUSH 操作。 - **RPUSH key value [value ...]** 将一个或多个值追加到列表尾部。同样地,如果该键对应的列表不在则先创建再执行 RPUSH 操作。 - **LPOP key** 移除并返回列表的第一个元素;若列表为空,则返回 nil。 - **RPOP key** 移除并返回列表最后一个元素;同理,对于空列表会返回 nil。 - **LRANGE key start stop** 获取指定范围内所有元素,索引从0开始表示第一个元素, -1 表示最后一个元素。此命令可用于分页显示数据项。 - **LLEN key** 返回列表长度,即其中包含多少个元素。 这些基本指令能够满足大多数情况下对有序集合的需求,并且由于其高效的性能表现,在实际开发中有广泛的应用场景。 #### 特性分析 - **高效插入删除** 对于两端(头/尾)位置上的增删动作非常快速,时间复杂度接近 O(1),这是因为内部采用了双向链表结构来实现 List。 - **支持阻塞式弹出功能** 提供了 BLPOP 和 BRPOP 命令,可以在尝试取出元素时等待直到有新的条目被加入为止,这对于构建消息队列系统特别有用。 - **内优化机制** 当列表中的元素数量较少而且每项所占空间不大时(例如小整数或是较短的文字串),Redis 可能会选择采用更紧凑的方式来保它们——压缩列表(ziplist)[^2]。这种方式有助于减少不必要的资源浪费。 - **原子性和一致性保障** 虽然 Redis 是基于单线程模型工作的,但这反而保证了每次调用 API 接口期间不会受到其他请求干扰,从而实现了天然的事务隔离效果[^3]。 ```python import redis client = redis.StrictRedis() # 向名为 'mylist' 的 list 添加一些元素 client.rpush('mylist', 'first item') client.lpush('mylist', 'second item') # 查看 mylist 的全部内容 print(client.lrange('mylist', 0, -1)) # 输出当前列表大小 print(f"The length of the list is {client.llen('mylist')}") ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值