第9章 数据库

Huan Lee Lv5

本章将对Redis服务器的数据库实现进行详细介绍,说明服务器保存数据库的方法,客户端切换数据库的方法,数据库保存键值对的方法,以及针对数据库的添加、删除、查看、更新操作的实现方法等。除此之外,本章还会说明服务器保存键的过期时间的方法,以及服务器自动删除过期键的方法。最后,本章还会说明Redis2.8新引入的数据库通知功能的实现方法。

9.1 服务器中的数据库

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

Untitled

9.2 切换数据库

每个Redis客户端都有自己的目标数据库, 默认为0号数据库, 可以通过SELECT命令进行切换.

Untitled

9.3 数据库键空间

Redis是一个键值对(key-value pair)数据库服务器,服务器中的每个数据库都由一个redis.h/redisDb结构表示,其中,redisDb结构的dict字典保存了数据库中的所有键值对,我们将这个字典称为键空间(key space)键空间和用户所见的数据库是直接对应的:

  • 键空间的键也就是数据库的键,每个键都是一个字符串对象。
  • 键空间的值也就是数据库的值,每个值可以是字符串对象、列表对象、哈希表对象、集合对象和有序集合对象中的任意一种Redis对象。

键空间命令:

  • 增删改查: SET, DEL, SET, GET
  • 其他操作: FLUSHDB, RANDOMKEY, DBSIZE, EXISTS, RENAME, KEYS等等

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

  • 设置生存时间间隔: EXPIRE(以秒为单位), PEXPIRE(ms)

  • 设计过期时间节点: EXPIREAT(以秒为单位, UNIX时间戳), PEXPIREAT(ms)

    • 上诉4个命令实际上都由PEXPIREAT转换实现, redisDb维护一个expires字典, 保存了数据库中所有键(不包含没设置过期时间)的过期时间.
  • 移除过期时间: PERSIST, PEXPIREAT的反操作,

  • 计算剩余生存时间: TTL(秒), PTTL(ms)

9.5 过期键删除策略

  • 定时删除: 使用定时器, 保证尽快删除过期的对象, 从而释放内存. 但是对CPU不友好, 可能对CPU的响应时间和吞吐量造成影响.
  • 惰性删除: 程序只在取出键时才对键进行过期检查, 保证删除过期键的操作指挥在非做不可得情况下进行, 并且删除的目标仅限于当前处理的键. 但是这对内存不友好, 有些过期键可能长期存在于内存中, 占用内存.
  • 定期删除: 结合上述两个策略, 每隔一段时间执行一次删除过期键操作.

9.6 Redis的过期键删除策略

  • 惰性删除策略实现: 在所有命令执行前对输入键进行检查, 若过期则删除.
  • 定期删除策略实现: 在规定时间内, 分多次遍历服务器的各个数据库, 随机检查一部分键的过期时间, 并删除其中的过期键.

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

RDB持久化功能, AOF持久化功能以及复制功能处理过期键的方式

  • 生成RDB文件时(SAVE, BGSAVE), 对键进行检查, 若过期则不保存.

  • 载入RDB文件时, 若为主服务器模式, 对键进行检查, 若过期则不载入; 若为从服务器模式, 全部载入数据库中, 但是主从服务器进行数据同步时会先清空数据库, 所以影响不大.

  • AOF文件写入: 如果过期键还没被删除, 则没有任何影响; 如果以及被删除, 则会像AOF文件追加一条DEL命令

  • AOF重写: 会对键进行检查, 已过期的键不会保存.

  • 复制: 服务器的过期键删除动作由主服务器控制

    • 主服务器删除一个过期键后, 会显式地向所有从服务器发送一条DEL

    • 从服务器不主动处理过期键, 只有收到主服务器地DEL命令后, 才会删除过期键

9.8 数据库通知

客户端可以通过订阅给定地频道或者模式, 来获取数据库中键的变化以及命令执行情况.

  • 键空间通知: 跟踪键, 其键执行了什么命令
  • 键事件通知: 跟踪命令, 该命令被哪些键执行

Untitled

  • Title: 第9章 数据库
  • Author: Huan Lee
  • Created at : 2023-08-25 19:49:06
  • Updated at : 2024-02-26 04:53:15
  • Link: https://www.mirthfullee.com/2023/08/25/notion-第9章 数据库-b8c4e74c/
  • License: This work is licensed under CC BY-NC-SA 4.0.