这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
Redis是一个键值对数据库服务器,服务器每个数据库都由一个redis.h中的redisDb结构表示:
/*
* 数据库结构
*/
typedef struct redisDb {
// key space,包括键值对象
dict *dict; /* The keyspace for this DB */
// 保存 key 的过期时间
dict *expires; /* Timeout of keys with a timeout set */
// 正因为某个/某些 key 而被阻塞的客户端
dict *blocking_keys; /* Keys with clients waiting for data (BLPOP) */
// 某个/某些接收到 PUSH 命令的阻塞 key
dict *ready_keys; /* Blocked keys that received a PUSH */
// 正在监视某个/某些 key 的所有客户端
dict *watched_keys; /* WATCHED keys for MULTI/EXEC CAS */
// 数据库的号码
int id;
} redisDb;
redisDb结构的dict字典保存了数据库中的所有键值对,这个字典就是键空间。
键空间的键就是数据库中的键,每个键都是一个字符串对象,值是数据库的值,可以是任意一种Redis对象
添加新键
添加一个新键值对到数据库,实际上就是将一个新键值对添加到键空间字典里面,键为字符串对象,值为redis任意对象
删除键
删除数据库中的一个键,实际就是在键空间里面删除键对应的键值对对象。
更新键
对数据库键进行更新,实际就是对键空间里面键对应的值对象进行更新,根据值对象的类型不同,更新的具体方法不同
查询键的值
对于数据库键进行取值,实际就是在键空间中取出键对应的值对象,根据值对象类型不同,具体的取值方法不同
其他键空间操作
FLUSHDB:清空整个数据库,通过删除键空间中的所有键值对来实现的
RANDOMKEY:随机返回数据库中某个键,通过在键空间中随机返回一个键
DBSIZE:返回数据库键数量,就是返回键空间中包含的键值对的数量
维护操作
redis执行命令的时候还会做一下维护操作:
读取键之后,服务器会根据键是否存在来更新服务器键空间中的命中次数和不命中次数,服务器还会更新键的LRU时间等等