一、从常用数据结构说起
上文说到Redis提供了丰富的数据结构,包括STRING(字符串)、LIST(列表)、SET(集合)、HASH(散列)和ZSET(有序集合)基本数据类型。
先来一波操作感受一下:
基本的数据类型的大概使用就到这里,接下来就分析一下它的内部结构是怎么实现的。
二、底层实现
Redis是KV类型的数据库,Key-Value我们一般会用什么数据结构存储?
哈希表!没错Redis的最外层确实也是通过hashtable实现的。在Redis里面每个键值对都是一个dictEntry,通过指针指向key的存储结构和value的存储结构,此外还有一个next存储里指向下一个键值对的指针。
typedef struct dictEntry {
void *key; //key void*表示任意类型指针
union {
void *val;//value定义
uint64_t u64;
int64_t s64;
double d;
}
v;
struct dictEntry *next;
//next指针
}
dictEntry;
看到这里大家会有疑惑,那过期时间放在哪里?
对,实际上在dicEntry的外面还有一层redisDB。
/* Redis数据库结构体 */
typedef struct redisDb
{
// 数据库键空间,存放着所有的键值对(键为key,值为相应的类型对象)
dict *dict;
// 键的过期时间
dict *expires;
// 处于阻塞状态的键和相应的client(主要用于List类型的阻塞操作)
dict *blocking_keys;
// 准备好数据可以解除阻塞状态的键和相应的client
dict *ready_keys;
// 被watch命令监控的key和相应client
dict *watched_k