redis数据库

89 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

Redis单机数据库-数据库

Redis保存数据的方式:将所有的数据存到Redis服务器中的数据库里

服务器中的数据库

Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中,db数组中的每个项都是一个redis.h/redisDb结构,每个redisDb结构代表一个数据库,默认会穿件16个数据库
    /usr/local/redis/src/redis.h

    struct redisServer {
        //...

        // 一个数组,保存着服务器中的所有数据库
        redisDb *db;


        // 服务器的数据库数量
        int dbnum;
        //...
    };

    /usr/local/redis/redis.conf

    ...
    databases 16
    ...

切换数据库

默认情况下,Redis客户端的目标数据库是0号数据库,但客户端可以通过执行SELECT命令切换目标数据库
客户端通过修改目标数据库指针,让它指向redisServer.db数组中不同元素来切换不同的数据库

数据库空间

数据库主要由dict和expires两个字典构成.其中dict字典负责保存键值对,而expires字典则负责保存键的过期时间
因为数据库由字典构成,所以对数据库的操作都是建立在字典操作之上的
数据库的键总是一个字符串对象,而值可以是任意一种Redis对象类型包括字符串对象、哈希表对象、集合对象、列表对象和有序集合对象,分别对应字符串键、哈希表键、集合键、列表键、有序集合键

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

expires字典的键指向数据库中的某个键,而值则记录了数据库键的过期时间,过期时间是一个以毫秒为单位的UNIX时间戳
  • EXPIRE 将键key的生存时间设置为ttl秒
  • PEXPIRE 将键key的生存时间设置为ttl毫秒
  • EXPIREAT 将key的过期时间设置为timestamp
  • PEXPIREAT 将key的过期时间设置为timestamp所指定的毫秒数

过期删除策略

  • 定时删除
    • 在设置键的过期时间的同时,设定一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作
    • 占用太多CPU时间,影响服务器的响应时间和吞吐量
  • 惰性删除
    • 放任键过期不管,但每次从键空间获取键时都要检查取得的键是否过期,如果过期的话就删除,没有过期的话就返回
    • 浪费太多内存,有内存泄露的危险
  • 定期删除
    • 每隔一段时间,程序就对数据库进行一次检查,删除里边的过期键.删除多少过期键和检查多少过期键由算法决定

Redis的过期键删除策略

Redis采用惰性删除和定期删除两种策略来删除过期的键.惰性删除只在碰到过期键时才进行删除操作,定时删除则会每隔一段时间主动查找并删除过期键

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

  • 生成RDB文件
    • 执行SAVE命令或者BGSAVE命令所产生的新RDB文件不会包含已经过期的键
  • 载入RDB文件
    • 主服务器载入RDB文件的时候会对文件中保存的键进行检查,未过期的会被载入到数据库中,过期键则会被忽略
    • 从服务器载入RDB文件的时候不论是否过期都会被载入到数据库中.不过,主从服务器进行数据同步的时候,从数据库的数据库就会被清空
  • AOF文件写入
    • 执行BGREWRITEAOF所产生的重新AOF文件不会包含已经过期的键
    • 当一个过期键被删除之后,服务器会追加一条DEL命令到现有AOF文件的末尾,显式地删除过期键
  • AOF文件重写
    • 程序会对数据库中的键进行检查,已过期的键不会被保存到重写后的AOF文件中
  • 复制
    • 当主服务器删除一个过期键之后,它会向所有服务器发送一条DEL命令,显式地删除过期键
    • 从服务器即使发现过期键也不会主动删除它,二是等待主节点发来DEL命令,保证主从服务器数据的一致性

数据库通知

当Redis命令对数据库进行修改之后,服务器会根据配置向客户端发送数据库通知