在关系型数据库如MySQL,数据库数据是按照行记录格式进行存储的。同理,我们常说Redis是一个键值对(Key-Value)
构成的内存数据库,具体是以什么形式进行存储的,下面通过源码一看究竟。
数据结构
在redis.h/redisServer
中记录了一个由redis.h/redisDb
结构组成的数组,这里的每一个redisDb
都是一个数据库,在Redis中默认数据库数量由REDIS_DEFAULT_DBNUM
参数控制,默认是16。
typedef struct redisDb {
// 数据库键空间,保存着数据库中的所有键值对
dict *dict; /* The keyspace for this DB */
// 键的过期时间,字典的键为键,字典的值为过期事件 UNIX 时间戳
dict *expires; /* Timeout of keys with a timeout set */
// 正处于阻塞状态的键
dict *blocking_keys; /* Keys with clients waiting for data (BLPOP) */
// 可以解除阻塞的键
dict *ready_keys; /* Blocked keys that received a PUSH */
// 正在被 WATCH 命令监视的键
dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */
struct evictionPoolEntry *eviction_pool; /* Eviction pool of keys */
// 数据库号码
int id; /* Database ID */
// 数据库的键的平均 TTL ,统计信息
long long avg_ttl; /* Average TTL, just for stats */
} redisDb;
复制代码
- dict 以
字典表
数据结构存储真实的数据库数据 - expires 以
字典表
数据结构存储的所有数据库键Key
的过期时间数据
数据存储
之前剖析过[Redis]数据结构与对象,其中底层数据结构的实现之一是字典(hashtable)
。底层基础决定高层架构,因此Redis数据库的构建、查找、新增、移除、过期等也利用字典的特性完成的。
- 键Key 每个键都是一个
字符串对象
- 值Value 每个值可以是
字符串对象、列表对象、哈希对象、集合对象、有序集合对象
的任意一种
数据查找
正是使用了字典表这种哈希表形式,使得Redis的键查找的时间复杂度为O(1)
,查找处理速度非常快。