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 构成的。