`

Redis数据结构分析

阅读更多

Redis有 内存数据库的赞誉,其支持一下几种数据结构:

1.       String

2.       Hashes

3.       List

4.       Set

本文从源代码角度来分析各种数据结构在 Redis 内部是如何存储和读取的。

在介绍各种数据结构之前,首先来介绍下 redisObject 这个 Struct String Hash List Set Redis 内部都是以 redisObject 来存储的

 

/* A redis object, that is a type able to hold a string / list / set */
/* The actual Redis Object */
#define REDIS_LRU_CLOCK_MAX ((1<<21)-1) /* Max value of obj->lru */
#define REDIS_LRU_CLOCK_RESOLUTION 10 /* LRU clock resolution in seconds */
typedef struct redisObject {
    unsigned type:4;
    unsigned storage:2;     /* REDIS_VM_MEMORY or REDIS_VM_SWAPPING */
    unsigned encoding:4;
    unsigned lru:22;        /* lru time (relative to server.lruclock) */
    int refcount;
    void *ptr;
    /* VM fields are only allocated if VM is active, otherwise the
     * object allocation function will just allocate
     * sizeof(redisObjct) minus sizeof(redisObjectVM), so using
     * Redis without VM active will not have any overhead. */
} robj; 
 

type:String, Hash,List,Set,Sorted set;

storage: 这个参数只是在VM 开启后才能用到,当VM 有很大的性能问题,基本不建议开启;

encoding: 编码方式: raw/int/ht/zmap/linkedlist/ziplist/intset

 

lru LRU 期限,Redis 默认的LRU 时间是1.5 年,所有基本不需要考虑keyLRU 掉的问题

refcount: 被引用的次数,因为RedisshareObject 的概念,目前只支持共享StringObjectRedis 的共享对象有两大类比:第一类:Redis server 的各种操作需要经常用到的各类对象,如:Redis Command 的分隔符 "\r\n", 用于Redis commandreply"+OK\r\n" 或者"-ERR\r\n" 等对象,因为在Redis 的各种操作这类对象要被频繁使用,所以就在启动 Redis 的时候创建好,然后共用这些对象,减少时间成本和空间成本;第二,类的共享对象就是对应于数字的StringObject ,如:Set "olylakers1" 1234; Set "olylakes2" 1234;Redis 内部,"olylakers1""olylakers2" 这两个key 都指向由数字1234 转化的StringObject 。这 样在海量数据和特定存储内容下,可以节省大量的内存空间。可用通过REDIS_SHARED_INTEGERS 这个参数来指定Redis 启动的时候创建多 少个第二类共享对象,默认的参数是10000 ,即创建的StrongObject 个取值范围是0-9999 之间。

Ptr :对象数据;

 

redisObjects 都是存放在redisDb 里面的,Redis 默认的是创建16db

 

typedef struct redisDb {
    dict *dict;                 /* The keyspace for this DB */
    dict *expires;              /* Timeout of keys with a timeout set */
    dict *blocking_keys;        /* Keys with clients waiting for data (BLPOP) */
    dict *io_keys;              /* Keys with clients waiting for VM I/O */
    dict *watched_keys;         /* WATCHED keys for MULTI/EXEC CAS */
    int id;
} redisDb;
 

        redisDb 维护了各种dict ,所以说redis 内部基本的数据存储结构就是一个dictdict 就是一个字典的数据结构,比较特殊的就是每个dict 含有两个table ,即两个dictht ,这是为了实现增量rehashe 准备的,当redisdict 在进行rehashe 的时候,新的数据插将被添加到dictht ht[1] 当中,反之则添加到ht[0]

 

typedef struct dict {
    dictType *type;
    void *privdata;
    dictht ht[2];
    int rehashidx; /* rehashing not in progress if rehashidx == -1 */
    int iterators; /* number of iterators currently running */
} dict;

typedef struct dictht {
    dictEntry **table;
    unsigned long size;
    unsigned long sizemask;
    unsigned long used;
} dictht;
 

Redis 在响应各种命令的时候,把接收到的命令参数(keyvalue 等)都转化成type= REDIS_STRING redisObject ,最终执行命令将keyvalue 存储到redisDbdict 的时候,存储的形式和内容是不相同的:在dict 里面,key 存储的是redisObject 里面的prt 所指向的数据,而value 存储的则是和命令对应的redisObject ,如执行list 的命令lpush listname contentredisDb 里面,存放的一条记录key 为内容listname 的字符串,而value (此value 不是命令对应的value )存储的则是一个redisObjecttype= REDIS_ENCODING_ZIPLIST prt=ziplist ),然后把content 对应的内容addziplist 上。

最后通过一张图来展示Redis内部DB的实现和其支持的各种data types在redis DB内的存储方式

Redis DB & data types

 

 

 

  • 大小: 172 KB
0
0
分享到:
评论

相关推荐

    Redis数据结构.pptx

    针对Redis的高级数据结构PPT。该PPT一共14页,介绍了Zset的数据结构类型,以及跳表的数据结构。简单阐述了BitMap,HLL,Bloom Filter的原理以及一些常用的指令。针对Bloom Filter有一些自己的见解以及分析

    redis数据结构基础知识及案列(每个数据结构一个案例).zip

    在【大学生 C/C++/JAVA/Python数据结构学习笔记和资料大全】中,你可以找到更多关于数据结构和算法的知识,这些是理解和使用Redis数据结构的基础。通过深入学习和实践,你不仅可以掌握Redis的使用,还能提升自己的...

    Redis基础数据结构.pptx

    详细分析redis设计及实现原理 详细分析redis设计及实现原理

    Redis流量-流量分析

    总结,Redis流量分析涉及到多个层面,包括数据结构的选择、操作频率的监控、内存管理、持久化策略、网络优化以及使用适当的监控工具。通过对这些方面的深入了解和细致调整,可以有效控制和优化Redis的流量,确保系统...

    Redis技术分析及运用

    2. **数据类型丰富**:除了基本的键值对存储,Redis还支持更复杂的数据结构,如列表、集合、有序集合和哈希表,这些数据结构可以满足多种业务需求。 3. **持久化机制**:虽然Redis的主要工作方式是在内存中存储数据...

    redis底层数据模型与数据结构

    通过以上分析,我们可以了解到 Redis 的底层数据模型和数据结构是如何设计的,包括 `redisObject` 和 `redisDb` 的细节。这些结构的设计考虑到了内存高效利用、数据访问性能优化以及复杂命令的实现等方面的需求。...

    Redis源码解析涵盖数据结构及特性实现

    使用场景及目标:本资源适用于想要理解Redis数据结构优化手段及其高级特性的技术人员。有助于更好地进行故障排除和优化Redis应用程序。 使用说明:阅读此内容是为了获得对Redis设计及其实现的理解,从而提高解决实际...

    Redis源代码分析.pdf

    链表是Redis中最基本的数据结构,由adlist.h和adlist.c定义。基本数据结构listNode是最基本的结构,标示链表中的一个结点。结点有向前(next)和向后(prev)两个指针,链表是双向链表。保存的值是void*类型。 链表通过...

    cpp-RCT是一个通过解析rdb文件对redis内存结构分析的一站式平台

    通过cpp-RCT,你可以得到关于Redis数据的详细信息,包括键的类型、过期时间、占用的内存大小等,这对于优化Redis的性能和内存管理至关重要。 在cpp-RCT中,有以下几个核心功能: 1. **RDB文件解析**:cpp-RCT能够...

    redis内存存储结构分析

    ### Redis内存存储结构分析 #### 一、Redis内存存储总体结构概述 Redis是一种高性能的键值存储系统,它将所有数据存储在内存中,从而实现了非常快的数据读写速度。然而,这种设计也有其局限性,例如对于拥有大量...

    Go 实现的 Redis 内存分析工具

    3. **内存分析**:了解 Redis 数据结构(如 String、Hash、List、Set 和 Sorted Set)的内存占用情况,以及如何通过 Redis 命令获取相关统计信息。 4. **数据收集和排序**:收集每个 Key 的内存占用数据,根据大小...

    redis面试题之数据结构.zip

    在面试中,Redis的数据结构是考察候选人技术深度的重要部分。以下将详细介绍Redis中的主要数据结构及其应用。 1. 字符串(String) Redis中的字符串是最基本的数据类型,可以存储任何可打印的字符序列,包括整数和...

    【作者面对面问答】包邮送《Redis 5设计与源码分析》5本

    墨墨导读:本文节选自《Redis 5设计与源码分析》,主要为读者分析Redis高性能内幕,重点从源码层次讲解了Redis事件模型,网络IO事件重在使用IO复用模型,时间事件重在...系统讲解Redis 5设计、数据结构、底层命令实现,

    redis源码分析

    Redis支持多种数据结构,如字符串(String)、哈希表(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。这些数据结构在源码中由不同的C结构体实现,例如`sds`用于表示字符串,`dict`表示哈希表,`list`...

    Redis学习实践 - 超实用超详细

    Redis数据结构、原理分析、应用实战 什么是Redis Redis的作用 Redis的存储结构 Redis的安装 Redis的数据类型 字符串类型 列表类型 hash类型 集合类型 有序集合 Redis原理分析 过期时间设置 过期删除的原理 发布订阅 ...

    Redis源代码分析

    以上是Redis源代码分析中关于基本数据结构的部分总结,通过这些数据结构的支持,Redis能够提供强大的功能和优异的性能。后续章节将进一步探讨Redis的服务器模型、虚拟内存、备份机制等高级特性。

    Redis内部数据结构详解(6)——skiplist1

    Redis中的跳跃列表(skiplist)是一种高效的数据结构,用于实现有序集合(sorted set)。它是一种概率性数据结构,通过随机概率控制层数,从而在平均情况下提供接近于对数时间复杂度的查找、插入和删除操作。skiplist...

Global site tag (gtag.js) - Google Analytics