一、操作
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* 指针来保存节点值,可以保存各种不同类型的值。