Redis 设计与实现——读书笔记

项目中能用到的:

  1. redis 数据结构(网络数据存储数据结构,使用何种数据结构能有利于网络数据的查询,如存储拓扑结构,前端需要频繁查询拓扑结构的数据(交换机自身信息switches+交换机链接links),switches 可以使用 map 保存,键为交换机编号+值为交换机信息,从而方便利用编号直接找到相应信息,并方便获取所有现有交换机编号。)
  2. RDB 文件的格式(考虑是否需要将内存中存储网络状态持久化,不需要将内存数据持久化:对于交换机来说,区块链文件 append保存交换机收到的所有命令, 状态数据库根据命令更新交换机状态数据,交换机状态数据如果保存在内存中则状态读写速度很快,等到网络状态崩溃的时候,就可以利用内存中的状态数据库回复网络状态。)
  3. AOF 文件重写:删除旧AOF 文件中的冗余命令(缩短网络状态恢复时间,如果已经有一个状态数据库了,是否还需要删除区块链中的冗余命令? )
    1. 如果要求必须根据区块链文件恢复网络的话,则需要进行区块链文件重写;
    2. 如果设置内存状态数据库(实际上如果需要前端展示网络状态的话,则必须设置),且根据内存状态数据库恢复网络。为了避免数据库损坏,应该使用区块链文件进行防篡改校验。
    3. 应该对比上述两者的恢复效率(类比 AOF 与 RDB)。

定期删除策略的实现

Redis 使用过期字典记录包含过期时间的键与其相应过期时间之间的关联关系。对于过期键的删除存在三种对于 CPU 时间占用和内存占用需求不同的删除策略,这三种删除策略分别是定时删除、定期删除、惰性删除。 

定时删除要求设置定时器,表现为当键过期时能够立刻删除它;

惰性删除则是指在客户点对某键调用命令(任何命令)时,都先服务器都先检查该键是否过期,如果过期则进行删除(此处涉及:1、使用键过期检查函数 2、命令执行函数设计:在执行命令之前,先判断键是否存在,如果键不存在直接返回空回复,如果键存在则还需要判断键是否过期,如果键过期则返回空回复,否则执行响应命令);

定期删除则表示通过配置 定期删除操作执行时间、定期删除操作面向的数据库数量、每个数据库检查的键数量 来实现“对一定数量的数据库定期随机检测各数据库中一定数量的带有过期时间的键是否过期”

实现定期删除的主要思路为(对照 书籍P110的伪代码进行的分析):

  1. Redis 服务器会周期性操作 serverCron函数(定时任务),该函数执行时,实现定期删除策略的 activeExpireCycle 函数就会被调用,它会在规定的时间内,分多次遍历服务器中的各个数据库(DEFAULT_DB_NUMBERS 定义每次检查的数据库数量),从数据库的 expires 字典中随机检查一部分键(DEFAULT_KEY_NUMBERS 定义每个数据库检查的键数量)的过期时间,并删除其中的过期键
  2. 使用全局变量 current_db 记录检查进度(下次该检查哪个数据库了,下次定期删除操作开始的时候,从current_db 对应的数据库开始检查)
  3. 首先定期删除操作有一个执行时间上限 Tmax ,来保证不会过长的占用 CPU 时间,当达到执行时间上限时,会停止键过期检查操作(整个定期删除操作),等到下次定期删除触发的时候,再继续定期删除操作
  4. activeExpireCycle函数中首先确定要检查的数据库数量 db_numbers=min(redis 服务器中的数据库总数,DEFAULT_DB_NUMBERS )。
  5. activeExpireCycle函数中以遍历的形式对db_numbers个数据库进行检查(遍历次数最多为db_numbers次,这个次数是用来限制在“一直不超时的情况下,已经遍历了db_numbers多个数据库了,这个时候就不再继续检测了,也就是保证在一次定期策略的执行中不会对超过db_numbers个数据库进行检测”)
  6. 每次遍历中表示对某个数据库进行检测,首先利用current_db得到要检查的数据库对象,然后创建循环(循环次数最多为DEFAULT_KEY_NUMBERS 次),每次循环中随机从该数据库的 expires 过期字典中随机获取一个键,看该键的过期时间是否小于当前时间,如果是则说明该键已经过期,将它从过期字典中删除掉。
    1. 每次遍历中判断过期字典大小是否为0(因为存在遍历删除中将过期字典键值对删完的情况),如果为零当然就不再继续对该数据库进行检查啦,直接跳出该循环,也就是结束了对该数据库的检测。
    2. 在每次遍历过程中,需要判断是否达到了进行一次定期删除策略执行的时间上限,如果达到了就结束该 activeExpireCycle 函数

AOF 文件重写

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值