Redis设计与实现阅读总结(二)单机数据库的实现
书的重点内容逐渐到了,我们的写作方式也该换一下了,不会像(一)一样流水账式了的解释几种数据结构了
在第一篇文章中,我简略的解释下有关的数据结构,现在我们开始想想如何实现
先提几个问题
- 如何实现多数据库
- 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
.
文件事件处理器
连接应答处理器
为了对连接服务器的客户端进行应答,服务器为套接字连接进行应答的处理器 复制代码
命令处理器
命令回复处理器
后面主要就是 服务器和客户端的通信协议部分,这部分我不准备讲解,也不是什么特别重要和难点的部分,就略过了
转载于:https://juejin.im/post/5c94806c5188252d8478552d
Redis设计与实现阅读总结(二)单机数据库的实现相关推荐
- Redis设计与实现详解二:Redis数据库实现
Redis设计与实现详解一:数据结构与对象 Redis设计与实现详解三:多机功能实现 Redis设计与实现详解四:其他单机功能 数据库 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态 ...
- 学习Redis(二)——单机数据库
一.Redis的安装: 首先来回忆一下如redis的安装和使用. redis是使用C写的,所以需要先安装c的运行环境: 1.安装gcc套装: yum install cpp yum install b ...
- Redis设计与实现阅读总结(一)数据结构和对象
大家有什么建议欢迎在下方评论提出,多多讨论 大家可能发现这个部分写的很粗略,因为redis本身设计的就是很简单的,这些数据结构基本没有太多好写的,主要是写 了后做一个总结 1. SDS(简单动态字符串 ...
- 共读《redis设计与实现》-单机(一)
Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https ...
- 《Redis设计与实现 黄建宏 著》阅读笔记目录(持续更新)
<Redis设计与实现 黄建宏 著>第3章 该书基于Redis2.9,即Redis3.0开发版编写 目录: 第一部分 数据结构与对象 01 简单动态字符串 02 链表 03 字典 04 跳 ...
- 《redis设计与实现》 读书笔记
<redis设计与实现> 作者:黄健宏 读书笔记 一.前言 什么是redis: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数 ...
- 2022黑马Redis跟学笔记.实战篇(二)
2022黑马Redis跟学笔记.实战篇 二 实战篇Redis 开篇导读 4.1短信登录 4.1.1. 搭建黑马点评项目 一.导入黑马点评项目 二.导入SQL 三.有关当前模型 四.导入后端项目 相关依 ...
- Redis 设计与实现读书笔记-第三章
引言 第三部分,属于多机数据库的实现,相较而言是很受关注的一部分,也是面试的高频考点,总体包含三个部分:主从复制.Sentinel 以及 集群.这三部分(加上之前介绍到的根据 RDB 和 AOF 实现 ...
- 《Redis设计与实现》之第七章:压缩列表
压缩列表是列表键和哈希键的底层实现之一.压缩列表是为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构. [压缩列表是一种数据结构,这种数据结构的功能是将一系列数据与其编码信息存储 ...
最新文章
- 【Netty】Netty线程模型和EventLoop
- 求字符串中最长无重复子序列
- cat命令分析_学习记录
- 海尔智家股市被看好,增长逻辑令人深思
- 计算机专业开学周记,【热门】开学周记集锦5篇
- ASP.NET自带的散列加密口令【转】
- js中字符串编码函数escape()、encodeURI()、encodeURIComponent()区别详解
- eeprom的wp 引脚_EEPROM存储芯片24C02
- 【原】web服务器占有量统计等 web网站
- 【tarjan缩点】受欢迎的牛
- 一个创业公司CEO的85条感悟
- php小总结之 mysqli面向过程、面向对象和PDO在增删改查使用中的一些小区别
- python读取csv文件中数据_python读取.csv文件中的数据
- linux正则表达式大全,正则表达式,正则表达式语法大全
- 获取微信公众号关注页链接
- 二十一世纪大学英语读写教程学习笔记(原文)——2 - Conversational Ballgames(对话风格与球类运动)
- 2021-01-22
- 解决Android Studio无法安装HAXM问题(特点:AMD CPU、Windows10家庭中文版系统)
- 基于Jsp+Servlet的宿舍管理系统(JavaWeb毕业设计源码)
- 量化交易---主要流程---003
热门文章
- Android -- 消息处理机制源码分析(Looper,Handler,Message)
- 解决Fiddler不能监听Java HttpURLConnection请求的方法
- IT规划中的技术体系架构
- 一些知识点的初步理解_4(协方差矩阵,ing...)
- 详解ASP.NET的最新安全漏洞,Padding Oracle攻击原理及其他
- Linux软件安装通用思路
- mac 部署python环境
- 解决Eclipse 启动后总是Building WorkSpace(sleeping)
- Java从零开始学四十六(Junit)
- UI设计 - 首页(主页)的任务