前言
本文基于 黄建宏-《Redis设计与实现》总结。第二部分为Redis 数据库,RDB持久化,AOF持久化,事件,客户端,服务器
数据库
服务器中的数据库
Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库。
在初始化服务器时,会根据redisServer的dbnum属性来创建多少个数据库,默认值为16
服务器数据库示例
切换数据库
默认情况下,Redis客户端的目标数据库为0号数据库,可以通过select命令来切换目标数据库,如 SELECT 1 OR SELECT 2
### 客户端状态与服务器状态之间的关系
在不同语言的客户端中,没有都一直显示目标数据库的号码,为了避免对数据库进行误操作,在执行Redis命令之前,先执行SELECT命令,切换到指定数据库再执行别的命令。
数据库键空间
Redis服务器中每个数据库redis.h/redisDb结构的dict字典保存了该数据库的所有键值对,这个字典称为键空间
数据库键空间示例
redis>SET message "hello world"
OK
redis>RPUSH alphabet "a" "b" "c"
(integer)3
redis>HSET book name "Redis in Action"
(integer)1
redis>HSET book author "Josiah L. Carlson"
(integer)1
redis>HSET book publisher "Manning"
(integer)1
读写键空间时的维护操作
当使用Redis命令对数据库进行读写操作时,服务器不仅会对键空间执行指定的读写操作,还会执行一些额外的维护操作,包括
- 在读取一个键后,服务器会根据键是否存在来更新服务器的键空间 hit/miss 次数,这两个值可以在INFO stats命令的keyspace_hits/keyspace_misses属性查看
- 在读取一个键后,服务器会更新键的LRU时间,这个值可以用于计算键的闲置时间,使用OBJECT idletime命令可以查看键的闲置时间
- 如果服务器读取键时发现该键已经过期,那么会先删除这个过期键,再执行余下操作
- 如果客户端使用WATCH命令监视了某个键,那么服务器再对该键进行修改后,会将其标记为dirty,从而让事务程序注意到该键已经被修改过
- 服务器每次修改一个键,都会对dirty键计数器的值加一,这个计数器会触发服务器的持久化以及复制操作
- 如果服务器开启了数据库通知功能,对键修改后,服务器会按配置发送响应的数据库通知
设置键的生存时间/过期时间
通过EXPIRE(设置秒)或PEXPIRE(设置毫秒)可以给键设置生存时间TTL,过后服务器会自动删除生存时间为0的键
EXPIRE key 5
通过EXPIREAT或PEXPIREAT可以给键设置过期时间,过期时间时一个UNIX时间戳,过后服务器会自动删除这个键
EXPIREAT key 1377257300
TTL或PTTL命