Redis学习笔记之单机实现
1.数据库
Redis的所有数据库都保存在redisServer.db数组中,数据库主要是由两个字典组成:dict字典,负责保存键值对;expires,负责保存键的过期时间
Redis使用惰性删除和定期删除两种方式处理过期键:惰性删除是指在碰到了过期键才将其删除,定期删除是指每隔一段时间主动查找并删除过期键(Redis采用随机查找)
针对过期键的处理:RDB(快照)中不包含过期键,AOF文件也不会包含过期键;主服务器发现过期键后会删除过期键,并向从服务器发送一个DEL命令;从服务器发现过期键后置之不理,当没过期处理。
2.RDB文件
结构:REDIS,字符串常量(二进制数据)
db_version,RDB文件的版本号
databases,零个或者多个数据库以及数据库中的键值对数据
SELECTDB,常量,提示接下来要读入的将是一个数据库号码
db_number,数据库号码
key_value_pairs,保存了一个或以上数量的键值对,(EXPIRETIME_MS、ms、)
TYPE、key、value
EOF,结束标志
check_sum,校验和,检查RDB文件是否有出错或者损坏
value编码
|
对象 |
TYPE |
编码 |
补充说明 |
||
|
字符串 |
REDIS_RDB_TYPE_STRING |
*_INT |
整数,有8、16、32位 |
||
|
*_RAW |
纯字符串,有是否压缩之分 |
||||
|
列表 |
REDIS_RDB_TYPE_LIST |
*_LINKEDLIST |
list_length |
Item |
…… |
|
集合 |
REDIS_RDB_TYPE_SET |
*_HT |
set_size |
elem |
…… |
|
哈希表 |
REDIS_RDB_TYPE_HASH |
*_HT |
hash_size |
(k,v) |
…… |
|
有序集合 |
REDIS_RDB_TYPE_ZSET |
*_SKIPLIST |
sorted_set_size |
(member,score) |
…… |
备注:表格中的*为REDIS_ENCODING,此处为省略写法。
服务器周期性操作函数serverCron默认每隔100毫秒就会执行一次,其中一项工作就是检查sava选项所设置的保存条件是否满足。
3.AOF持久化
本质:保存Redis服务器所执行的写命令来记录数据库状态
文件写入和同步:当AOF持久化功能处于打开状态时,服务器每执行一次写命令之后,会以协议格式将被执行的命令追加到服务器状态的aof_buf缓冲区末尾,appendfsync值的不同(always、everysec、no)产生不同的持久化行为(包括写入AOF文件和磁盘同步)
文件的载入和数据还原:服务器启动载入程序——创建伪客户端(fake client,Redis的命令只能在客户端上下文执行)——从AOF文件读取命令并执行——命令全部被执行完,载入完毕
AOF重写
目的:不改变数据库状态,去除冗余命令,减小AOF文件的体积
原理:从数据库中读取值,然后用一条命令来记录键值对,代替之前记录这和键值对的多条命令,但是为了防止缓冲区溢出,重写程序在处理列表、哈希表、集合、有序集合这四种可能会带有多个元素的键时,会先检查键所包含的元素数量,如果超过了设置值,会使用多条命令来进行替换(一次写入会造成缓冲区溢出,分多条命令写入)
AOF后台重写:有服务器进程创建子进程进行AOF重写,期间服务器仍然接收来自客户端的命令,可能造成数据不同步,解决方法是添加AOF重写缓冲区,在子进程重写AOF文件的过程中服务器接收的命令写入AOF重写缓冲区,当子进程重写完成后,再将AOF缓冲区的命令写入AOF文件中
4.事件
文件事件:Redis服务器通过套接字与客户端进行连接,服务器与客户端的通信会产生相应的文件事件,服务器通过监听并处理这些事件来完成一系列网络通信操作。由于一个服务器通常会连接多个套接字,所有文件事件可能并发出现,但是I/O多路复用程序会将套接字都放到一个队列里,然后以有序、每次一个套接字的方式向文件事件分派器传送套接字。
时间事件:定时事件,让程序在指定的时间之后执行一次;周期性事件,让程序每隔指定时间就执行一次。
实现:服务器会将所有的时间事件放入一个无序链表(时间无序)中,每次当时间事件执行器运行时,遍历无序链表,查找所有已到达的时间事件,并调用相应的事件处理器。
实例:serverCron函数,一般情况下只执行这一个时间事件
5.命令请求的执行过程
1) 发送命令请求:客户端向服务器发送命令请求
用户键入命令,客户端将其转换为协议的格式,通过套接字连接发送给服务器
2) 读取命令请求
读取套接字中协议格式的命令请求,将其保存到客户端状态的输入缓冲区中
3) 命令执行过程
查找命令表(字典),检查命令和客户端状态(是否找到命令、命令参数个数是否正确、是否通过了身份验证……),调用命令的实现函数,执行后续操作(慢查询日志、AOF、复制到从服务器)
4) 将命令回复发送给客户端
5) 客户端接收并打印命令回复
Redis学习笔记之单机实现的更多相关文章
- Redis学习笔记1 -- 单机环境时分布式锁的使用
使用第三方开源组件Jedis实现Redis客户端,且只考虑Redis服务端单机部署的场景. 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁:2. 基于Redis的分布式锁:3. 基于ZooKee ...
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记7--Redis管道(pipeline)
redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...
- Redis学习笔记一:数据结构与对象
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- (转)redis 学习笔记(1)-编译、启动、停止
redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...
- Redis学习笔记(二)-key相关命令【转载】
转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...
随机推荐
- [BUG] python实例化N次类,调用类函数log会输出N遍的bug 解决办法
最近再写DOU用例时,采用的是 unittest测试框架,就涉及到将其它所有模块需要全部在一个 .py文件中进行实例化,然后再运行时发现在控制台中同一个日志信息会打印多次(实例化几次,同一消息就会打印 ...
- html5式程序员表白
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/whqet/article/details/26394493 前端开发whqet,csdn,王海庆,w ...
- BZOJ2115:[WC2011] Xor(线性基)
Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...
- BZOJ5368:[PKUSC2018]真实排名(组合数学)
Description 小C是某知名比赛的组织者,该比赛一共有n名选手参加,每个选手的成绩是一个非负整数,定义一个选手的排名是:成绩不小于他的选手的数量(包括他自己). 例如如果333位选手的成绩分别 ...
- 3130: [Sdoi2013]费用流
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络流方案 ...
- ThreadLocal解决SimpleDateFormat多线程安全问题中遇到的困惑
测试代码: public class Main { public static void main(String[] args) { for (int k = 0; k < 10; k++) { ...
- Velocity.js初步
Js越来越强大了,超乎我的想象,以前JS仅仅只能通过ajax与后台交互,后来又有了Node.js,JS可以用于服务端,然后今天我又发现了JS的动态语言.明天呢?也许不少前端的小伙伴会说,慢些吧,慢些吧 ...
- Docker实战(二)之操作Docker容器
容器是Docker的另外一个核心概念.简单来说,容器是镜像的一个运行实例.所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层.如果认为虚拟机是模拟运行的一整套操作系统系统(包括内核,应 ...
- QGis C++ 开发之创建临时图层并添加要素
开发环境:Win10 + VS2010 + Qt 4.8.6 + QGis 2.14.4 其实本文实现的功能类似于QGis中“添加文本数据图层”的一个简化版,本文不会涉及到对话框的使用 ...
- Android 一个相对完整的自动升级功能实现代码
由于项目的需要最近做了一个关于Android自动升级的功能,下面将贴出Android手机客户端的完整代码.这段代码参考别的代码居多,由于不满足需求,所以自己仅仅改了一些需要变动的内容,其他功能都是按照 ...