Redis入门到通关之Redis数据结构-List篇

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis入门到通关之Redis数据结构-List篇

☃️概述


RedisList类型可以从首、尾操作列表中的元素:


☃️数据结构


哪一个数据结构能满足上述特征?

  • LinkedList :普通链表,可以从双端访问,内存占用较高,内存碎片较多
  • ZipList :压缩列表,可以从双端访问,内存占用低,存储上限低
  • QuickListLinkedList + ZipList,可以从双端访问,内存占用较低,包含多个ZipList,存储上限高

RedisList结构类似一个双端链表,可以从首、尾操作列表中的元素:

在3.2版本之前Redis采用ZipList和LinkedList来实现List,当元素数量小于512并且元素大小小于64字节时采用ZipList编码,超过则采用LinkedList编码。

在3.2版本之后,Redis统一采用QuickList来实现List:


☃️源码



☃️其他


底下的就别看了 就图一乐

在 Redis 中,List 类型的底层数据结构是双向链表(doubly linked list)。下面是关于 Redis List 类型底层数据结构的一些详细信息:

双向链表结构:

Redis 中的 List 类型使用双向链表来实现。每个节点包含了一个指向前一个节点和一个指向后一个节点的指针,这使得在链表中任意位置插入或删除节点的操作都很高效。

特点:

双向链表支持在列表头部和尾部进行快速的插入和删除操作,时间复杂度为 O(1)。

对于索引定位的操作,双向链表的性能相对较差,因为需要从头或尾依次遍历节点来找到指定位置的元素,时间复杂度为 O(n)。

节点结构:

每个节点由一个包含值的对象和两个指针组成。节点结构如下:

typedef struct listNode {
    struct listNode *prev;
    struct listNode *next;
    void *value;
} listNode;

头尾指针:

Redis 的 List 对象中包含指向链表头部和尾部的指针,即 head 和 tail 指针。这使得在列表的两端进行插入和删除操作都非常高效。

压缩列表:

在某些情况下,Redis 也可以使用压缩列表(ziplist)作为 List 的底层数据结构,主要是当列表元素数量比较少或元素都是较小的整数或短字符串时。但是,压缩列表不支持随机访问,而是通过遍历来获取元素,因此对于需要频繁随机访问的 List,Redis 会使用双向链表作为底层数据结构。

Redis 的 List 类型在大多数情况下使用双向链表作为底层数据结构,这种设计使得 List 支持高效的头尾操作,但在随机访问或根据索引查找元素时效率较低。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4天前
|
存储 缓存 NoSQL
rodert单排学习redis入门【黑铁】2
rodert单排学习redis入门【黑铁】
8 0
|
4天前
|
存储 缓存 NoSQL
rodert单排学习redis入门【黑铁】1
rodert单排学习redis入门【黑铁】
12 0
|
12天前
|
存储 NoSQL 安全
Redis第六弹-List列表-(相当于数组/顺序表)Lpush key element-一次可以插入多个元素(假如key已经存在,并且key对应的value并非是list,则会报错)
Redis第六弹-List列表-(相当于数组/顺序表)Lpush key element-一次可以插入多个元素(假如key已经存在,并且key对应的value并非是list,则会报错)
|
12天前
|
缓存 NoSQL 关系型数据库
Redis第二课,1.set key value(设置对应的key和value)2.get key(得到value值)Redis全局命令(支持很多的数据结构)3.keys(用来查询当前
Redis第二课,1.set key value(设置对应的key和value)2.get key(得到value值)Redis全局命令(支持很多的数据结构)3.keys(用来查询当前
|
12天前
|
存储 NoSQL Redis
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
|
24天前
|
Java Redis
redis-学习笔记(Jedis list简单命令)
redis-学习笔记(Jedis list简单命令)
23 1
|
24天前
|
存储 消息中间件 NoSQL
redis-学习笔记(list)
redis-学习笔记(list)
10 0
|
24天前
|
NoSQL Java Redis
redis-学习笔记(string , hash , list , set , zset 前置知识)
redis-学习笔记(string , hash , list , set , zset 前置知识)
7 0
redis-学习笔记(string , hash , list , set , zset 前置知识)
|
24天前
|
存储 JSON NoSQL
Redis数据结构介绍及Redis的基本数据类型
Redis数据结构介绍及Redis的基本数据类型
39 3
|
25天前
|
机器学习/深度学习 存储 NoSQL
Redis -- list列表
Redis -- list列表
14 0

热门文章

最新文章