zoukankan      html  css  js  c++  java
  • 《Redis核心原理与实战》学习笔记5——列表使用与内部实现原理

    一、简介

    列表类型 (List) 是一个使用链表结构存储的有序结构,它的元素插入会按照先后顺序存储到链表结构中,因此它的元素操作 (插入/删除) 时间复杂度为 O(1),查询时间复杂度为 O(n)。

    二、基础使用

    1、给列表添加一个或多个元素

    语法:lpush key value [value ...]

    127.0.0.1:6379> lpush list 1 2 3
    (integer) 3
    

    2、给列表尾部添加一个或多个元素

    语法:lpush key value [value ...]

    127.0.0.1:6379> lpush list 1 2 3
    (integer) 3
    

    2、给列表尾部添加一个或多个元素

    语法:rpush key value [value ...]

    127.0.0.1:6379> rpush list 4 5 6
    (integer) 3
    

    2、给列表尾部添加一个或多个元素

    语法:lpush key value [value ...]

    127.0.0.1:6379> lpush list 1 2 3
    (integer) 3
    

    3、返回列表指定区间内的元素

    语法:lrange key start stop
    其中 -1 代表列表中的最后一个元素

    127.0.0.1:6379> lrange list 0 -1
    "6"
    "5"
    "4"
    "3"
    "2"
    "1"
    

    4、获取并删除列表的第一个元素

    语法:lpop key

    127.0.0.1:6379> lpop list
    "6"
    
    127.0.0.1:6379> lrange list 0 -1
    "5"
    "4"
    "3"
    "2"
    "1"
    

    5、获取并删除列表的最后一个元素

    语法:rpop key

    127.0.0.1:6379> rpop list
    "1"
    
    127.0.0.1:6379> lrange list 0 -1
    "5"
    "4"
    "3"
    "2"
    

    6、根据下标获取对应的元素

    语法:lindex key index

    127.0.0.1:6379> lindex list 0
    “2”
    

    7、根据下标修改元素

    语法:lset key index value

    127.0.0.1:6379> lset list 0 8
    OK
    
    127.0.0.1:6379> lindex list 0
    “8”
    

    8、根据下标删除元素

    语法:ltrim key start stop

    127.0.0.1:6379> ltrim list 1 2
    OK
    
    127.0.0.1:6379> lrange list 0 -1
    "5"
    "4"
    "8"
    

    三、内部实现

    早期的列表类型使用的是ziplist(压缩列表)和双向链表组成的,Redis 3.2改为用 quicklist来存储列表元素。

    quicklist是一个双向链表,链表中的每个节点实际上是一个ziplist,ziplist本质是一个字节数组。

    quicklist添加操作对应函数是quicklistPush,先判断quicklist的head节点是否可以插入数据,如果可以插入则使用ziplist的接口进行插入,否则就新建quicklistNode节点进行插入。函数的返回值为int,0表示没有新建head,1表示新建了head。

    quicklist单一元素删除对应函数是quicklistDelEntry,区间元素删除对应函数是quicklistDelRange。quicklist在区间删除时,会先找到start所在的quicklistNode,计算删除的元素是否小于要删除的count,如果不满足删除的个数,则会移动至下一个quicklistNode继续删除,依次循环直到删除完成为止,quicklistDelRange函数的返回值为int,返回1表示成功删除指定区间的元素,返回 0表示没有删除任何元素。

    四、应用场景

    1、消息队列

    列表类型可以使用rpush实现先进先出的功能,同时又可以使用lpop轻松的弹出(查询并删除)第一个元素,所以列表类型可以用来实现消息队列;

    2、文章列表

    对于博客站点来说,当用户和文章都越来越多时,为了加快程序的响应速度,我们可以把用户自己的文章存入到List中,因为List是有序的结构,这样可以完美的实现分页功能,从而加速程序的响应速度。

  • 相关阅读:
    1004: 画图
    1002: 数字排序问题
    1003: 相邻数对问题
    1001: 图像旋转问题
    1000: 数塔
    springday05-go1
    springday04-go2
    springday04-go1
    springday03-go2
    Android—PopupWindow的简单使用
  • 原文地址:https://www.cnblogs.com/luckyliulin/p/13593775.html
Copyright © 2011-2022 走看看