本文共 1906 字,大约阅读时间需要 6 分钟。
我们先看代码 server.h/redisServer
struct redisServer{ ... //保存 db 的数组 redisDb *db; //db 的数量 int dbnum; ...}
再看redisDb的代码:
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 *ready_keys; /* Blocked keys that received a PUSH */ dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */ int id; /* Database ID */ long long avg_ttl; /* Average TTL, just for stats */} redisDb;
总体来说redis的 server 包含若干个(默认16个) redisDb 数据库。
Redis 是一个 k-v 存储的键值对数据库。其中字典 dict 保存了数据库中的所有键值对,这个地方叫做 keyspace 直译过来就是“键空间”。所以我们就可以这么认为,在 redisDb 中我们使用 dict(字典)来维护键空间。
keyspace 的 key 是数据库的 key,每一个key 是一个字符串对象。注意不是字符串,而是字符串对象。
keyspace 的 value 是数据库的 value,这个 value 可以是 redis 的,字符串对象,列表对象,哈希表对象,集合对象或者有序对象中的一种。
所以对于数据的增删改查,就是对 keyspace 这个大 map 的增删改查。
当我们执行:
redis SET mobile "13800000000"
看图:
对于删改查,没啥好说的。类似java 的 map 操作,大多数程序员应该都能理解。
需要特别注意的是,再执行对键的读写操作的时候,Redis 还要做一些额外的维护动作:
Redis 作为缓存使用最主要的一个特性就是可以为键值对设置过期时间。
在 Redis 中与过期时间有关的命令
其实这些命令,底层的命令都是由 REXPIREAT 实现的。
在 redisDb 中使用了 dict *expires,来存储过期时间的。其中 key 指向了 keyspace 中的 key(c 语言中的指针), value 是一个 long long 类型的时间戳,标定这个 key 过期的时间点,单位是毫秒。
如果我们为上文的 mobile 增加一个过期时间。
redis PEXPIREAT mobile 1521469812000
转载地址:http://gzorb.baihongyu.com/