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 */
    struct evictionPoolEntry *eviction_pool;    /* Eviction pool of keys */
    int id;                     /* Database ID */
    PORT_LONGLONG avg_ttl;          /* Average TTL, just for stats */
} redisDb;

一、数据库  默认是16个

二、切换数据库:select 0~15

三、数据库键空间  *dict  

  保存了数据库中的所有键值对,它是一个字典称之为键空间

  键空间的键 =数据库的键;

  键空间的值=数据库的值;

  3.1 添加新键:新键添加到键空间字典中

  3.2 删除键:键空间 删除键所对应的键值对对象

  3.3 更新键:对键空间的键对应的值进行更新

四、读写键控件时的维护操作

  4.1 读取一个键之后,判断键是否存在,更新服务器的键空间命中次数或者键空间未命中次数。 

127.0.0.1:6379> INFO stats
# Stats
total_connections_received:3
total_commands_processed:20
instantaneous_ops_per_sec:0
total_net_input_bytes:1026
total_net_output_bytes:31711
instantaneous_input_kbps:0.00
instantaneous_output_kbps:0.00
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:8  //命中次数
keyspace_misses:0 //未命中次数
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:261
migrate_cached_sockets:0
slave_expires_tracked_keys:0
active_defrag_hits:0
active_defrag_misses:0
active_defrag_key_hits:0
active_defrag_key_misses:0

  4.2  服务器会更新LRU(最后一次使用)时间,用于计算键的空闲时间

    OBJECT idletime key   毫秒

127.0.0.1:6379> OBJECT idletime sun
(integer) 827

    4.3 如果发现键过期,先删除这个键,然后执行后续操作

  4.4 如果这个键被监视 WATCH key  ,标记为脏(dirty)。服务器每次修改一个键,都会对脏键进行+1

  4.5 数据库开通通知功能,每次修改键,都会发送通知。 

 五、设置键的生存时间或者过期时间 

EXPIRE key ttl    秒数
   PEXPIRE key ttl   毫秒数
   EXPIREAT key timestamp  秒数时间戳
   PEXPIREAT  key timestamp  毫秒数时间戳

 六、保存过期时间

dict *expires 过期时间键的集合
   过期字典键-指针,指向数据库的键
   过期字典值-long,毫秒精度时间戳

七、移除过期时间
  PERSIST
  在过期字典集合中,查询键,解除过期设置。
  TTL 
  秒为单位键的剩余生存周期
  PTTL 毫秒级
127.0.0.1:6379> get msg
(nil)
127.0.0.1:6379> set msg "sun"
OK
127.0.0.1:6379> PEXPIREAT msg 1161680467300000
(integer) 1
127.0.0.1:6379> get msg
"sun"
127.0.0.1:6379> TTL msg
(integer) 1160163662408
127.0.0.1:6379> PERSIST msg
(integer) 1
127.0.0.1:6379> TTL msg
(integer) -1
八、过期键的删除策略
惰性删除+定期删除

九、过期键的影响
9.1 RDB文件 -- SAVA 和 BGSAVE,已经过期的键不保存
  主服务器载入RDB--忽略过期间
  从服务器载入RDB--全局导入,主从同步时,从数据会被清空。
9.2 AOF文件
 AOF文件写入
  执行惰性或者定期删除之前 -- 过期间不受影响
  执行惰性或者定期删除之后 -- 追加一条删除记录
 AOF重写
  过期键不会写入到AOF文件中
9.3 复制
  复制模式,从服务器依赖于主服务器,从服务器即便接收到删除命令,也不会删除。

十、数据库通知
  客户端订阅指定的变化通知
127.0.0.1:6379> SUBSCRIBE __KEYSPACE@0__:MSG
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "__KEYSPACE@0__:MSG"
3) (integer) 1