一个Redis服务器实例在单机运行时可以添加多个数据库来保存键值对,Redis在实现中通过一个redisDb结构体来描述数据库,该结构体中有一个字典类型的字段来保存数据库中所有的键值对,redisServer结构体来描述服务器实例,该结构体中有一个dbnum字段来保存数据库数量,一个redisDb数组字段来保存服务器中的所有数据库。

struct redisServer{...redisDb *db;int dbnum;...
};typedef struct redisDb{...dict *dict;...
} redisDb;

当客户端调用SET、RPUSH等命令之后会把命令中内容作为键值对添加到redisDb的dict字典字段中,调用DEL等删除操作时会删除dict字段中相应的数据。

客户端可以通过调用select <数据库编号> 来切换数据库。在服务器内部,通过redisClient结构体保存客户端状态,该结构体中有一个db字段来记录目标数据库,切换数据库之后,redisClient结构体中的db属性指向目标的数据库结实例。

typedef struct redisClient{...redisDb *db;...
}redisClient;

键的过期时间:
redis提供了四种命令设置键的过期时间:

  • EXPIRE <key> <ttl> 设置key的生存时间为ttl秒。
  • PEXPIRE <key> <ttl> 设置key的生存时间为ttl毫秒。
  • EXPIREAT <key> <timestamp> 设置key的过期时间为timestamp所指定秒数时间戳。
  • PEXPIREAT <key> <timestamp>设置key的过期时间为timestamp所指定的毫秒数时间戳。

在redisDb结构体中有一个expires字段,用来保存数据库中所有键的过期时间,这是一个字典字段,键是一个指向键对象的指针,值是一个长整型数保存过期时间(精确的UNIX毫秒时间戳),服务器通过该字段来检查键是否已过期。

此外可以通过TTL<key>和PTTL<key>查询键的剩余生存时间,通过PERSIST <key>移除键的过期时间。

当键过期时有三种删除策略:

  1. 定时删除,创建一个定时器,在定时任务中删除过期的键。这种策略节约内存但是耗CPU资源。
  2. 惰性删除,不主动删除过期键,每次访问该键时如果该键过期删除该键。这种策略对CPU消耗比较小,但是浪费内存,而且如果过期的键一致不被访问的话有内存泄露的风险。
  3. 定期删除,每隔一段时间,程序对数据库做一次检查,删除里面的过期键。但是不全部删除,删除多少由算法定,可以根据删除键花费的时间或者一次删除键的数量来控制。这种策略是1和2的折中,在内存和CPU上平衡,事实上很多性能调优的场景都是在内存和CPU之间牺牲哪一个而纠结。

redis在实现时采用了2和3策略。

关于持久化和复制功能对过期键的处理:

  • 在生成RDB文件时会过滤掉过期的键。
  • 在生成AOF文件时如果键过期会增加一条DEL命令到AOF文件中,AOF重写时也会忽略过期的键。
  • 当主服务器删除一个过期的键后它会向所有从服务器发送一条DEL命令,显示地删除过期键。从服务器不会主动删除过期的键,而是由主服务器统一通知,这种统一、中心化的过期键删除策略可以保证主从服务器数据的一致性

《Redis设计与实现》学习笔记-单机数据库相关推荐

  1. redis设计与实现学习笔记1

    文章目录 1.对象 1.1 类型 1.2 内存回收 1.3 对象共享 1.4 对象空转时长 2.单机数据库 2.1 RDB 2.2 AOF 2.3 事件 2.4客户端 2.5服务器 3.常用命令 参考 ...

  2. 《Redis设计与实现》笔记|SDS动态字符串|链表字典跳跃表整数集合压缩列表结构|redis中的对象|数据库原理|RDB持久化|AOF持久化|事件与多路利用模型|发布订阅原理|事务原理|慢查询日志

    <Redis设计与实现>笔记 前记: 参考配套网站:http://redisbook.com 带注释的源码地址:https://github.com/huangz1990/redis-3. ...

  3. Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式

    Redis运维和开发学习笔记(5) 主从复制和sentinel哨兵模式 主从复制 将主节点的数据改变同步给从节点 作用 备份数据 读写分离 存在的问题: 手动干预切主等操作 主节点的写能力受到单机限制 ...

  4. Redis 设计与实现 读书笔记(菜鸟版)

    Redis 设计与实现 读书笔记(简略版) 写在前面 第一章(内部数据结构) SDS List Dictionary Rehash Rehash 与 COW 渐进式Rehash 字典收缩 Skipli ...

  5. Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令

    Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令 文章目录 Redis运维和开发学习笔记(6) 监控Redis工作状态-info命令 info server info clie ...

  6. Redis运维和开发学习笔记(4) Redis参数意义

    Redis运维和开发学习笔记(4) Redis参数意义 文章目录 Redis运维和开发学习笔记(4) Redis参数意义 参数意义 参数意义 Client连接 问题 id=567800790 addr ...

  7. Redis运维和开发学习笔记(2) redis持久化

    Redis运维和开发学习笔记(2) redis持久化 文章目录 Redis运维和开发学习笔记(2) redis持久化 持久化 持久化方式一:RDB 触发~~的三种~~方式 1. save命令 2. b ...

  8. Linux内核设计与实现学习笔记目录

    **注:**这是别人的笔记,我只是把目录抄过来 <Linux内核设计与实现学习笔记> 1.<Linux内核设计与实现>读书笔记(一)-内核简介 2.<Linux内核设计与 ...

  9. oracle protocol=beq 不可用,学习笔记:Oracle数据库坏块 深入研究obj$坏块导致exp/expdp不能执行原因...

    天萃荷净 深入研究Oracle坏块obj$导致exp/expdp不能执行导出的原因 上篇(案例:Oracle出现obj$坏块exp/expdp导出不能导出的解决办法ORA-01578 ORA-0111 ...

  10. 家族关系查询系统程序设计算法思路_【学习笔记】数据库基础 - 查询优化

    目录 什么是数据库查询优化? 影响查询优化的因素 优化策略概述 查询优化的总体思路 语义优化 -- 内容等价性 语法优化(逻辑层优化)---语法等价性 执行优化(物理层优化) 查询优化在DBMS中的位 ...

最新文章

  1. centos6.5 设置tomcat8自启动
  2. 把LabelImg标注的YOLO格式标签转化为VOC格式标签 和 把VOC格式标签转化为YOLO格式标签
  3. 一篇文章彻底明白Hive数据存储的各种模式
  4. 2019三星比2018好在哪_高端人士的选择: 三星w2019与三星w2018相比, 是什么让它如此价值不菲...
  5. 极限分辨率是艾里斑的直径还是半径_小孔成像(二)——衍射,数值孔径和分辨率...
  6. 3.自编码器(变分自编码器,VAE)
  7. 直流可逆调速控制系统matlab,逻辑无环流直流可逆调速系统的Matlab仿真
  8. 计算机中回收站的作用,windows7回收站的功能与作用
  9. Hexo添加Icarus主题
  10. java引用另一个程序图像,java – 在Android应用程序上显示图像的另一种方法
  11. Word打字很卡顿 Office打字时反应慢 延迟 Excel输入迟钝 PPT卡死的终极解决办法大全(24种方法)
  12. Win10下搭建burpsuite pro,最详细的安装步骤(附Burpsuite pro安装包)
  13. Web安全笔试题总结(2022持续更新)
  14. 欧姆龙CX-one编程基本知识
  15. Python的pdfminer的字体下载
  16. 从软件哲学角度谈 Amazon SageMaker(第二讲)
  17. Git实战之git客户端上传文件到github
  18. css3 transition用法(很详细)
  19. VTOL是指这样的,垂直起降固定翼,不是四旋翼
  20. php取商,PHP 免费获取手机号的归属地,运营商等数据

热门文章

  1. PHP如何使用换行符?(代码示例)
  2. java计算机毕业设计中美医院病历管理系统源代码+系统+数据库+lw文档
  3. VsCode 配置java环境(详细教程)
  4. JS代码对表格进行新增时无法解析HTML代码的解决方式
  5. 如何自己写一个CNV分析软件?
  6. 医疗新基建,更需新安全
  7. java权限管理与用户角色权限设计
  8. maple的Linux安装步骤,[原创]CentOS6.0下安装Freeiris2/Asterisk全程指导教程
  9. java生成mib文件_【snmp】使用MIB Builder生成MIB文件
  10. 破解还原卡的方法总结