`

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基础数据结构.pptx

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

    redis内存存储结构分析

    redis缓存解决方案和基本命令,redisredis内存存储结构分析.Redis的数据全部放在内存带来了高速的性能,但是也带来一些不合理之处。比如一个中型网站有100万注册用户,如果这些资料要用Redis来存储,内存的容量必须...

    Redis源代码分析

    Redis源代码分析,里面的数据结构写的真好,希望大家可以学习一下。

    Java思维导图xmind文件+导出图片

    redis数据结构分析 Redis主从复制原理及无磁盘复制分析 Redis管道模式详解 Redis缓存与数据库一致性问题解决方案 基于redis实现分布式实战 图解Redis中的AOF和RDB持久化策略的原理 redis读写分离架构实践 ...

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

    1. 介绍经典的skiplist数据结构,并进简单的算法分析 2. 讨论Redis的skiplist的具体实现 3. 讨论sorted set是如何在skipl

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

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

    redis_3.2.9_内存分布分析

    这是本人分redis内部数据存储结构的过程文档,部分无用细节忽略,这是数据存储结构的分析,没有增、删、改、查的动态处理过程,需要参考部分源码查看

    redis开发的概要介绍与分析

    Redis是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理。Redis支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等,并提供了丰富的API供开发者使用。 在Redis开发过程中,...

    数据结构课程设计任务书.rar

    26 redis数据结构(内存模型) 17 27 银行家算法 17 28 文件索引 18 29 城市公交线网优化调查分析 18 30 AVLree的实现及分析 18 31 Red-Black Tree 的分析和实现 19 32 CD管理 19 33 公交线路上优化路径的...

    数据结构与算法分析(城市数据库的实现)

    数据结构与算法分析中城市数据库的实现,欢迎正在学习该课程的童鞋前来参考下!PS: 肯定有很多不足,互相学习下!

    redis-source-code-analysis:Redis源代码分析Redis源码解读-redis source code

    ### 1,Redis数据结构的实现 ### 2,Redis内在编码数据结构实现 ### 3,Redis数据类型的实现 ### 4,数据库的实现 ### 5,Redis客户端与服务端 ### 6,Redis多机服务 ### 7,其他 注: 本项目使用的是redis3.0.7的...

    聊聊高并发高可用那些事(Kafka、Redis、MySQL)

    - 基本数据结构介绍 - MyIsAM InnoDB 等存储引擎 - 索引类型和方式、聚簇和非聚簇索引 - 回表、覆盖索引、最左前缀、联合索引、索引下推 - Explain分析SQL语句 - 索引失效的场景、索引优化方案 - TB级数据(600亿条)...

    java 大数据 spark flink redis hive hbase kafka 面试题 数据结构 算法 设计模式.zip

    基本操作:针对每种数据结构,定义了一系列基本的操作,包括但不限于插入、删除、查找、更新、遍历等,并分析这些操作的时间复杂度和空间复杂度。 算法: 算法设计:研究如何将解决问题的步骤形式化为一系列指令,...

    redis实现排行榜的简单方法

    我们分析一下排行榜,一个用户一个排名,意味着要去重,这时我们会想到Java的一种数据结构Set。不过Set又是无序的。有没有一种结构是可以保住元素唯一以及有序的呢。 幸运的是,还真的有。Redis的ZSet的就是这样的一...

    Redis-Source-Code-Analyze:Redis原始阅读和分析(Redis-3.2.5)-redis source code

    数据结构的实现强调内存效率,因此与使用高级编程语言建模的相同数据结构相比,Redis内部的数据结构可能使用较少的内存。 Redis提供了许多自然可以在数据库中找到的功能,例如复制,持久性的可调级别,集群,高...

    redis个人总结

    从redis数据结构、项目应用、主从复制、数据存储角度结合资料总结,如何与mysql同步分析等

    redis:redis源码分析与个人理解

    数据结构的实现强调内存效率,因此与使用高级编程语言建模的相同数据结构相比,Redis内部的数据结构可能使用较少的内存。 Redis提供了许多自然可以在数据库中找到的功能,例如复制,持久性的可调级别,集群,高...

    redis安装配置详细教程.pdf

    Redis的主要特点包括高性能、多样化的数据结构、支持事务、发布订阅机制、高可用性、简单易用等。 Redis的读写速度非常快,可以达到每秒数十万次的操作,因此常被用作缓存。其支持多种类型的数据结构,如字符串、...

    Redis-64-5.0.10.7z

    支持多种数据结构:Redis支持字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等数据结构,这使得Redis可以适应不同的应用场景。 高可用性:Redis可以配置主从复制、哨兵和集群等高可用...

Global site tag (gtag.js) - Google Analytics