Redis的字典数据库KV键值对到底是什么?

发布于:2024-03-12 ⋅ 阅读:(61) ⋅ 点赞:(0)

1. Redis是如何实现键值对(key-value)数据库的?

redis是key-value存储系统,key一般是String类型的字符串对象,value则为redis对象(redis Object)。value可以是字符串对象,也可以是集合数据类型的对象,比如List对象、Hash对象、Set对象。

在这里插入图片描述

2. Redis十大类型说明

  • 传统的五大类型

String、List、Hash、Set、Zset

  • 新介绍的五大类型

在这里插入图片描述
在这里插入图片描述

bitmap实质是Stirng类型,hyperLoglog实质是String类型,GEO实质为Zset类型,Stream实质是Stream了洗,BITFIFLD需要看具体的key

3. Redis启动过程

我们在终端键入下面的命令,底层到底发生了什么?(redis服务底层的启动流程)

redis-server /myredis/redis7.conf

在这里插入图片描述

上面是第一步, Redis 启动时会先加载配置文件(默认是 redis.conf),配置文件中包含了 Redis 服务器的各种配置参数,比如监听的端口、数据持久化方式、日志文件位置等。

在这里插入图片描述

第二步:Redis 会根据配置文件中的参数进行相应的配置。在加载配置文件后,Redis 会初始化服务器数据结构,包括创建数据库、命令表、事件循环等数据结构,并设置一些全局变量的初始值。

在这里插入图片描述

上面形成数据库就马上就会形成字典数据结构(本质上是hash表)

在这里插入图片描述

字典创建完后,每个key都会形成Entry,即hash表内的实体

在这里插入图片描述

然后形成真正的kv键值对(Object.c文件),redis中一切皆kv

我们前面说到redis中所存的类型就是kv,然后k是String,v是redisObject,我们知道redis底层有很多数据结构,为了redis提供给客户端的API简单,把这些所有类型都抽象成了redisObject对象,有点类似于多态的概念。所以Redis中几乎每个对象都是一个redisObject对象。

3. 字典和KV是什么?

每个键值对都会有一个dictEntry,我们可以到dict.h中可以看。

struct dictEntry {
    void *key;
    union {
        void *val;
        uint64_t u64;
        int64_t s64;
        double d;
    } v;
    struct dictEntry *next;     /* Next entry in the same hash bucket. */
    void *metadata[];           /* An arbitrary number of bytes (starting at a
                                 * pointer-aligned address) of size as returned
                                 * by dictType's dictEntryMetadataBytes(). */
};
  • key就是一个指针,指向一个String对象
  • union是c中的联合体
  • val:既能指向String对象也能指向集合类的对象(比如List+Hash+Set+Zset对象)
  • next:指向下一个entry的指针

在这里插入图片描述
在这里插入图片描述

看这篇博客:https://www.cnblogs.com/kismetv/p/8654978.html

dictEntry到RedisObject

struct redisObject {
    unsigned type:4;
    unsigned encoding:4;
    unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or
                            * LFU data (least significant 8 bits frequency
                            * and most significant 16 bits access time). */
    int refcount;
    void *ptr;
};

在这里插入图片描述

由于字典使用hash表实现的,所以我们的kv读取的时间复杂度是O(1)

  • 总结:

RedisObject(对象): RedisObject 是 Redis 中表示数据的通用对象结构。它包含了存储在 Redis 中的数据的值、类型信息以及与值相关的一些元信息。在 Redis 中,所有的数据都以 RedisObject 的形式存储,包括字符串、列表、哈希、集合等。

dictEntry(字典节点): dictEntry 是 Redis 中字典(dict)的节点结构。字典是 Redis 内部实现的一种键值对映射的数据结构,用于快速查找和存储数据。dictEntry 结构包含了键值对的信息,其中键(key)和值(value)都是以 RedisObject 的形式存储的。

两者的关系可以通过 Redis 的字典实现来解释:

在 Redis 中,字典(dict)是一种哈希表(hash table)的实现,用于存储键值对映射关系。
在哈希表中,每个键值对都被存储在一个 dictEntry 结构中。这个结构中包含了一个指向键的指针和一个指向值的指针。
这里的键和值都是以 RedisObject 的形式存储的,因此一个 dictEntry 中的键值对实际上是由两个 RedisObject 构成的。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到