Redis数据结构-list

Redis的5种数据结构:string、list、hash、set和zset

redis_list.jpg

1、基本操作

  • 列表的存储结构使用的是链表,不是数组;
  • 使用的是双向链表;
  • 随机定位性能较弱,首尾删除性能较优;
  • 链表元素的位置使用自然数(0,1,2......n-1)表示,也可以使用负数,-1表示【倒数第一个】,-n表示【第一个元素】;

2、队列、堆栈

列表常用来作为异步队列使用

通过使用rpush、rpop、lpush、lpop四条指令,在链表的表头和表尾追加或移除元素,可以将链表作为队列或堆栈使用;

# 右进左出队列
localhost:0>rpush muscleape go
"1"
localhost:0>rpush muscleape java python
"3"
localhost:0>lpop muscleape
"go"
localhost:0>lpop muscleape
"java"
localhost:0>lpop muscleape 
"python"
# 左进右出队列
localhost:0>lpush muscleape go java python
"3"
localhost:0>rpop muscleape
"go"
localhost:0>rpop muscleape
"java"
localhost:0>rpop muscleape
"python"

获取长度

localhost:0>rpush muscleape go java python
"3"
localhost:0>llen muscleape
"3"

读取
lindex 读取指定位置元素;
lrange 获取链表子元素列表;

localhost:0>rpush muscleape go java python
"3"
localhost:0>lindex muscleape 1
"java"
localhost:0>lrange muscleape 0 1
 1)  "go"
 2)  "java"
localhost:0>lrange muscleape 0 -1
 1)  "go"
 2)  "java"
 3)  "python"

修改元素
lset 在指定位置修改元素

localhost:0>rpush muscleape go java python
"3"
localhost:0>lset muscleape 1 PHP
"OK"
localhost:0>lrange muscleape 0 -1
 1)  "go"
 2)  "PHP"
 3)  "python"

插入元素
linsert 指定元素,在前或后插入元素

localhost:0>linsert muscleape before PHP Java
"4"
localhost:0>lrange muscleape 0 -1
 1)  "go"
 2)  "Java"
 3)  "PHP"
 4)  "python"

删除元素(指定删除元素的个数及元素的值-可能会有多个值)
lrem 键 数量 值

localhost:0>lrange muscleape 0 -1
 1)  "go"
 2)  "Java"
 3)  "PHP"
 4)  "python"
 5)  "java"
 6)  "java"
 7)  "C"
 8)  "C++"
 9)  "java"
 10)  "C#"
 11)  "java"
 12)  "java"
 13)  "java"
localhost:0>lrem muscleape 3 java
"3"
localhost:0>lrange muscleape 0 -1
 1)  "go"
 2)  "Java"
 3)  "PHP"
 4)  "python"
 5)  "C"
 6)  "C++"
 7)  "C#"
 8)  "java"
 9)  "java"
 10)  "java"

定长列表(范围之外的所有元素都将被移除)
ltrim 键 开始位置 结束位置【结束位置<开始位置===>等价于删除指令】

localhost:0>lrange muscleape 0 -1
 1)  "go"
 2)  "Java"
 3)  "PHP"
 4)  "python"
 5)  "C"
 6)  "C++"
 7)  "C#"
 8)  "java"
 9)  "java"
 10)  "java"
localhost:0>ltrim muscleape 0 6
"OK"
localhost:0>lrange muscleape 0 -1
 1)  "go"
 2)  "Java"
 3)  "PHP"
 4)  "python"
 5)  "C"
 6)  "C++"
 7)  "C#"

3、快速列表

redis_quicklist.jpg

1、Redis底层存储的不是一个简单的LinkedList,而是一种快速链表结构;
2、在列表元素较少时,使用一块连续的内存存储,ziplist(压缩列表);
3、数据较多时,改成quicklist,为普通链表需要附加指针空间太大,比较浪费空间;
4、链表和ziplist组合(做个ziplist使用双向指针串起来使用);

猜你喜欢

转载自www.cnblogs.com/muscleape/p/9957720.html