第九章 数据库

9.1 服务器中的数据库

  Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中。

struct redisServer{
    //一个数组,保存着服务器中的所有数据库
    redisDb *db;
    //服务器的数据库数量
    int denum;

}

  denum属性可配置,默认值为16。

9.2 切换数据库

  每个Redis客户端有目标数据库,对目标数据库执行读写等操作。可以通过SELECT命令切换目标数据库。Redis目前没有提供查询客户端当前目标数据库的命令。

9.3 数据库键空间

  服务器中的每个数据库由一个redis.h/redisDb结构表示,其中dict字典保存了数据库中的所有键值对,称这个字典为键空间。

typedef struct redisDb{
    //数据库键空间,保存所有键值对
    dict *dict;

}

 

  键空间的键即是数据库的键,每个键对象都是字符串对象。键空间的值是数据库的值,可以是五种对象之一。譬如执行以下命令

redis>SET message "hello world"

redis>RPUSH alphabet "a" "b" "c"

redis>HSET book name "Redis in Action"

redis>HSET book author "Josiah L. Carlson"

redis>HSET book publisher "Manning"

  所有对数据库的操作,都是通过对键空间字典进行操作实现的。

9.4 设置键的生存时间或过期时间

  通过EXPIRE(秒)命令或者PEXPIRE(毫秒),设置键值对的生存时间,经过指定时间后,服务器会自动删除生存时间为0的键。类似的EXPIREAT命令或PEXPIREAT命令可以为某个键值对设置过期时间。

  9.4.2 保存过期时间

  redisDb结构的expires字典(过期字典)保存了数据库中所有键的过期时间。

typedef struct redisDb{

    //过期字典,保存键的过期时间
    dict *expires;

}redisDb;

 

 

  9.4.5 过期键的判定

  • 检查给定键是否存在于过期字典,如果存在,取得键的过期时间。
  • 检查当前UNIX时间戳是否大于键的过期时间,大于则判定为过期键,否则未过期。

9.5 过期键删除策略

  9.5.1 定时删除

  在替键设置过期时间时,创建一个定时器,由定时器执行最后的键删除操作。

  优点:能及时释放不需要的内存。

  缺点1. 删除键需要占用CPU时间,降低业务吞吐量和服务器的响应时间。2.定时器的实现方式——时间事件,查找事件复杂度较高(O(n))

  9.5.2 惰性删除

  在获取键的同时,检查键是否过期,过期则删除否则返回键

  优点:不会浪费CPU时间去删除无关的键

  缺点:内存不能及时回收,浪费内存,并且当一个过期键不再被访问时,这部分内存将无法回收造成内存泄漏(除非手动执行FLUSHDB)

  9.5.3 定期删除

  每个一段时间,对数据库进行检查,删除过期键

9.6 Redis的过期键删除策略

  Redis中采用惰性删除和定期删除结合的方式

9.7 AOF、RDB和复制功能对过期键的处理

  讨论RDB持久化和AOF持久化以及复制功能如何处理数据库中的过期键

  9.7.1 RDB文件

  生成RDB文件时,对数据库中的键进行检查,已过期的键不会被保存到RDB文件中;

  在启动Redis服务器时,如果服务器开启了RDB功能,将载入RDB文件,载入RDB文件时,

  • 当前服务器是主服务器,载入时,会检查键是否已过期,过期键不会载入内存
  • 当前服务器是从服务器,全部载入,当主服务器同步时,清空从服务器数据

  9.7.2 AOF文件写入

  在过期键被删除后,向AOF文件追加一条DEL命令,显示该键已经被删除

  9.7.3 AOF重写

  在AOF重写时,检查如果是过期键不会保存到重写后的AOF文件中

  9.7.5 复制

  从服务器为了保持和主服务器的一致性,从服务器的过期键删除由主服务器控制。当主服务器删除过期键,向从服务器发送一个DEL命令,从服务器才删除这个过期键。当从服务器执行客户端的读命令时,遇到过期键不会执行删除操作。

9.8 数据库通知

   客户端可以订阅给定的频道或者模式,得知数据库中键的变化,以及数据库中命令的执行情况。

 

posted @ 2021-02-24 22:16  walker993  阅读(36)  评论(0编辑  收藏  举报