美文网首页
Redis基本操作-list

Redis基本操作-list

作者: Muscleape | 来源:发表于2018-11-14 14:14 被阅读26次

    Redis的5种数据结构:string、list、hash、set和zset
    Redis 所有的数据结构都是以唯一的 key 字符串作为名称,然后通过这个唯一 key 值来获取相应的 value 数据。不同类型的数据结构的差异就在于 value 的结构不一样。

    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使用双向指针串起来使用);

    相关文章

      网友评论

          本文标题:Redis基本操作-list

          本文链接:https://www.haomeiwen.com/subject/cvndfqtx.html