Redis第二天

Redis使用键空间管理键值对,提供过期键值删除策略,包括惰性删除和定期删除。持久化方面,RDB是通过快照生成二进制文件,AOF则记录写操作日志。服务器通过文件事件和时间事件驱动处理客户端请求,确保数据一致性。
摘要由CSDN通过智能技术生成

Redis使用

Redis默认创建16个数据库

键空间

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

常用命令
  • 添加新键:SET key value
  • 删除键:DEL key
  • 更新键:SET key value
  • 对键取值:GET key
  • 清空数据库:FLUSHDB
  • 设置键的生存时间:EXPIRE/PEXPIRE key time(秒)、SETTEX (针对字符串)、EXPIREAT/PEXPIREAT key 时间戳(毫秒)
  • 查看键的生存时间:TTL/PTTL key
  • 移除过期时间: PERSIST key

上面几个过期命令除了SETEX,都是使用PEXPIREAT实现,过期时间统一由redisDb的expires保存

过期键值删除策略

Redis使用的策略:惰性删除、定期删除
对于已过期的键:

  1. 生成RDB文件时已过期的键不会保存到RDB文件中
  2. 载入RDB文件时,主服务器不会载入过期键,从服务器会载入过期键,主从同步时会把从服务器的过期键刷掉
  3. 写入AOF文件时,过期键被惰性删除或者定期删除之后,会向AOF追加一条DEL命令
  4. 当服务器运行在复制模式下,从服务器不会主动删除过期间,只有当主服务器发送一条DEL命令之后才会将过期键删除。

持久化

RDB持久化

RDB是一个经过压缩的二进制文件,由两个命令可以用于生成RDB文件,一个是SAVE(阻塞主线程),一个是BGSAVE(不阻塞主线程)。RDB文件的载入是在服务器启动时自动执行的。如果服务器启动了AOF持久化功能,那么服务器会优先使用AOF文件还原数据库状态,只有当AOF持久化功能处于关闭状态,服务器才会使用RDB文件还原数据库状态。Redis允许通过设置服务器配置的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令:save time (时间范围,通过lastsave属性判断) update(修改次数,通过dirty属性判断),表示在time时间内修改了update次的话就执行一次BGSAVE命令。

BGSAVE、SAVE、BGREWRITEAOF之间的互斥关系:

  • 在执行BGSAVE期间、客户端发送的SAVE会被服务器拒绝
  • 在执行BGSAVE期间、客户端发送的BGSAVE会被服务器拒绝
  • BGREWRITEAOF和BGSAVE不能同时执行
    1)如果BGSAVE正在执行,BGREWRITEAOF会被延迟到BGSAVE之后执行
    2)如果BGREWRITEAOF正在执行,BGSAVE会被服务器拒绝

RDB文件结构
REDIS | db_version (4字节) | database | EOF(1字节 编码为 377)| check_sum (校验和,8字节)

database部分:
SELECTDB (1字节,编码为376) | db_number (数据库序号,1|2|5字节 ) | key_value_pairs

key_value_pairs部分:
EXPIRTIME_MS (1字节) | ms (8字节) | TYPE (1字节) | key | value

value部分:

  1. 字符串对象:ENCODING | value

1.如果字符串长度超过20字节,且服务器打开了RDB文件压缩功能,则字符串会在压缩之后保存
2.如果字符串小于等于20字节,字符串会被原样保存
无压缩字符串保存结构 : len | string
压缩后的字符串:REDIS_RDB_ENC_IZF | Compressed_len | origin_len | compressed_string

  1. 列表对象
    list_length (列表的长度) | item1 | item2 | … | itemN
  2. 集合对象
    set_size | elem1 | … | elemN
  3. 哈希表对象
    hash_size | key_value_pair1 | … | key_value_pairN
    key_value_pair: key_value
  4. 有序集合对象
    sorted_set_size | element | … | elementN
    element : member | score

AOF持久化

保存Redis服务器所执行的写命令,当AOF持久化功能处于打开状态,服务器在执行一个写命令之后,会以协议的格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾。

配置AOF持久化
appendsync:

  • always:将aof_buf缓冲区中的所有内容写入并同步到AOF文件中
  • everysec:每隔1秒写入AOF文件
  • no:不同步AOF文件,何时同步由操作系统决定

重写:Redis提供了AOF文件重写功能将多条写命令合并,并替换旧AOF文件以解决AOF文件体积膨胀的问题。重写功能不会阻塞服务器进程运行,它会在子进程中完成AOF写入操作,在完成AOF重写工作之后,它会向父进程发送一个信号。在子进程执行重写时,服务器进程执行完的写命令,会同时发送至AOF缓冲区和AOF重写缓冲区,在收到子进程的信号后,服务器进程会调用一个信号处理函数,将AOF重写缓冲区的内容写入新AOF文件,该函数会阻塞服务进程。

事件

Redis是一个时间驱动程序,主要处理两类时间:文件时间、时间时间。

文件事件

文件事件处理器主要包括四个组成部分:套接字、I/O多路复用程序、文件时间分派器以及事件处理器。I/O多路复用程序总是会将所有产生事件的套接字都放到一个队列里面,然后通过队列,以有序、同步,每次一个的方式向文件事件分派器传送套接字。

事件类型:

  1. 当套接字可读:(客户端对套接字执行write、close操作或者有新的应答套接字出现时,套接字产生AE_READABLE事件)
  2. 当套接字可写:(客户端对套接字执行read操作,套接字产生AE_WRITABLE事件)
    如果一个套接字同时产生了这两种事件,优先执行AE_READABLE事件
时间事件

服务器将所有时间事件都放在一个无序链表中,每当时间事件执行器运行时,它就遍历整个链表,查找所有已到达的时间事件,并执行相应的事件处理器。

serverCron:默认每秒运行10次,根据hz配置

  1. 更新服务器的各类统计信息:比如时间、内存占用、数据库占用
  2. 清理过期键值对
  3. 关闭和清理连接失效的客户端
  4. 尝试进行AOF和RDB持久化
  5. 如果服务器是主服务器,会对从服务器进行定期同步
  6. 如果处于集群模式,对集群进行定期同步和连接测试
  7. 处理SIGTERM信号
服务端处理事件流程

CLIENT list 查看所有客户端
一个命令请求从发送到完成主要包括以下步骤

  1. 客户端将命令请求发送给服务器
  2. 服务端读取命令请求,并解析命令参数
  3. 命令执行器根据参数查找命令的实现函数,然后执行实现函数并得出命令回复
  4. 服务器将命令回复返回给客户端
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值