书的重点内容逐渐到了,我们的写作方式也该换一下了,不会像(一)一样流水账式了的解释几种数据结构了

在第一篇文章中,我简略的解释下有关的数据结构,现在我们开始想想如何实现

先提几个问题

  • 如何实现多数据库
  • redis数据是存在内存中的,但是这样数据存在丢失的风险,那我们怎样化解决这个问题
  • redis服务器和多个客户端的交互是怎样实现的呢

在我看来,该书第二部分<单机数据库的实现>就是围绕上面的几个问题,来用列举式行文写下相应部分知识点的。

服务器中的数据库

看到这个多字,其实我们很容易就想到用链表的方式去储存

一个服务器,先假设是一个简单的struct结构来维护的,我们想在其中实现多数据库,自然想到,在其中添加一个键值对,而这个值我们使用一个链表

这个链表中存放一个又一个的指针,每个指针指向一个struct结构(维护着数据库结构的struct)

好,这样,我们就简单的实现这个

然后我们再去实现单数据库

服务器中的多数据库

每个数据库中那有该如何存放数据呢

由于redis是kv数据库,数据都是以kv形式存在的,那我们完全就可以用字典去实现

键值对中的值可以是(一)中的多种形式,那么,

下图的形式就能得出了

到了这里后,书上将过期问题在后续进行了说明。

过期问题

书籍主要是解释了 列举式解释了相关命令

我觉得比较重要是redis的过期键删除策略

一个经典的问题是:如果一个键过期了,那么它什么时候会被删除呢?

这个问题有三种可能的答案,它们分别代表了三种不同的删除策略:

  • 定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。

    • 优点:对内存是最友好的:通过使用定时器,定时删除策略可以保证过期键会尽可能快地被删除,并释放过期键所占用的内存。
    • 缺点:它对CPU时间是最不友好的:在过期键比较多的情况下,删除过期键这一行为可能会占用相当一部分CPU时间 | 创建一个定时器需要用到Redis服务器中的时间事件,而当前时间事件的实现方式——无序链表,查找一个事件的时间复杂度为O(N)
  • 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。

    • 对CPU时间来说是最友好的。 这个策略不会在删除其他无关的过期键上花费任何CPU时间
    • 它对内存是最不友好的:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放
  • 定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定

    • 定期删除策略是前两种策略的一种整合和折中
    • 定期删除策略的难点是确定删除操作执行的时长和频率。

上面大概性的介绍了数据库的存储实现,但是现在数据仍然保持在内存中的,但是这样数据存在丢失的风险,这个时候我们应该设计持久化的策略了。

Redis的持久化

Redis 分别提供了 RDB 和 AOF 两种持久化机制:

RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中。 AOF 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的

我们继续想第三个问题,客户端和服务器是如何交互的?

Redis客户端和服务器的交互

关于这一点,书上用了三个章节来讲解。

分别是 服务器事件客户端服务器

Redis的事件处理器是单线程的,但并不意味着Redis就是单线程的!

I/O多路服用程序

Redis的事件处理机制是I/O多路复用的。多个文件事件可能并发的出现,但是I/O多路复用程序会将所有的产生的套接字放到一个队列里。

以有序,同步的方式,I/O多路复用程序向文件事件分派器传送套接字,当一个套接字处理完,才会传送下一个。

I/O多路复用程序底层有多种实现可以选择,epoll,select,evport,kqueue.

文件事件处理器

  1. 连接应答处理器

     为了对连接服务器的客户端进行应答,服务器为套接字连接进行应答的处理器
    复制代码
  2. 命令处理器

  3. 命令回复处理器

后面主要就是 服务器和客户端的通信协议部分,这部分我不准备讲解,也不是什么特别重要和难点的部分,就略过了

转载于:https://juejin.im/post/5c94806c5188252d8478552d

Redis设计与实现阅读总结(二)单机数据库的实现相关推荐

  1. Redis设计与实现详解二:Redis数据库实现

    Redis设计与实现详解一:数据结构与对象 Redis设计与实现详解三:多机功能实现 Redis设计与实现详解四:其他单机功能 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态 ...

  2. 学习Redis(二)——单机数据库

    一.Redis的安装: 首先来回忆一下如redis的安装和使用. redis是使用C写的,所以需要先安装c的运行环境: 1.安装gcc套装: yum install cpp yum install b ...

  3. Redis设计与实现阅读总结(一)数据结构和对象

    大家有什么建议欢迎在下方评论提出,多多讨论 大家可能发现这个部分写的很粗略,因为redis本身设计的就是很简单的,这些数据结构基本没有太多好写的,主要是写 了后做一个总结 1. SDS(简单动态字符串 ...

  4. 共读《redis设计与实现》-单机(一)

    Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https ...

  5. 《Redis设计与实现 黄建宏 著》阅读笔记目录(持续更新)

    <Redis设计与实现 黄建宏 著>第3章 该书基于Redis2.9,即Redis3.0开发版编写 目录: 第一部分 数据结构与对象 01 简单动态字符串 02 链表 03 字典 04 跳 ...

  6. 《redis设计与实现》 读书笔记

    <redis设计与实现> 作者:黄健宏 读书笔记 一.前言 什么是redis: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数 ...

  7. 2022黑马Redis跟学笔记.实战篇(二)

    2022黑马Redis跟学笔记.实战篇 二 实战篇Redis 开篇导读 4.1短信登录 4.1.1. 搭建黑马点评项目 一.导入黑马点评项目 二.导入SQL 三.有关当前模型 四.导入后端项目 相关依 ...

  8. Redis 设计与实现读书笔记-第三章

    引言 第三部分,属于多机数据库的实现,相较而言是很受关注的一部分,也是面试的高频考点,总体包含三个部分:主从复制.Sentinel 以及 集群.这三部分(加上之前介绍到的根据 RDB 和 AOF 实现 ...

  9. 《Redis设计与实现》之第七章:压缩列表

    压缩列表是列表键和哈希键的底层实现之一.压缩列表是为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构. [压缩列表是一种数据结构,这种数据结构的功能是将一系列数据与其编码信息存储 ...

最新文章

  1. 【Netty】Netty线程模型和EventLoop
  2. 求字符串中最长无重复子序列
  3. cat命令分析_学习记录
  4. 海尔智家股市被看好,增长逻辑令人深思
  5. 计算机专业开学周记,【热门】开学周记集锦5篇
  6. ASP.NET自带的散列加密口令【转】
  7. js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
  8. eeprom的wp 引脚_EEPROM存储芯片24C02
  9. 【原】web服务器占有量统计等 web网站
  10. 【tarjan缩点】受欢迎的牛
  11. 一个创业公司CEO的85条感悟
  12. php小总结之 mysqli面向过程、面向对象和PDO在增删改查使用中的一些小区别
  13. python读取csv文件中数据_python读取.csv文件中的数据
  14. linux正则表达式大全,正则表达式,正则表达式语法大全
  15. 获取微信公众号关注页链接
  16. 二十一世纪大学英语读写教程学习笔记(原文)——2 - Conversational Ballgames(对话风格与球类运动)
  17. 2021-01-22
  18. 解决Android Studio无法安装HAXM问题(特点:AMD CPU、Windows10家庭中文版系统)
  19. 基于Jsp+Servlet的宿舍管理系统(JavaWeb毕业设计源码)
  20. 量化交易---主要流程---003

热门文章

  1. Android -- 消息处理机制源码分析(Looper,Handler,Message)
  2. 解决Fiddler不能监听Java HttpURLConnection请求的方法
  3. IT规划中的技术体系架构
  4. 一些知识点的初步理解_4(协方差矩阵,ing...)
  5. 详解ASP.NET的最新安全漏洞,Padding Oracle攻击原理及其他
  6. Linux软件安装通用思路
  7. mac 部署python环境
  8. 解决Eclipse 启动后总是Building WorkSpace(sleeping)
  9. Java从零开始学四十六(Junit)
  10. UI设计 - 首页(主页)的任务