Redis小记(二)
1、redis数据库
redis数据库属于内存数据库,若不将数据存到磁盘中,服务器进程退出,数据也会消失
redis所有数据库都保存在redisServer结构的db数组中,db数组的每一项都是一个redisDb结构,每一个redisDb结构代表一个数据库
初始化服务器时,redis服务会根据dbnum属性来决定创建多少个数据库,dbnum属性有服务器配置的database选项决定,默认为16
通过select num 命令来切换数据库,因为客户端状态结构redisClient结构的db属性记录当前客户端目标数据库,通过修改redisClient.db的指针来切换数据库
expire <key> <ttl> 将键key的生存时间设置为ttl秒
pexpire <key> <ttl> 将键key的生存时间设置为ttl毫秒秒
expireat <key> <timestamp> 将键key的过期时间设置为timestamp指定的秒数
pexpireat <key> <timestamp> 将键key的过期时间设置为timestamp指定的毫秒数
过了时间,服务器会自动删除键
persist 命令移除一个键的过期时间,在过期字典查找给定的键,解除键和过期字典的关联
TTL返回键剩余秒数,PTTL返回键剩余毫秒数
通过过期字典判断键是否过期:(1)检查键是否存在于过期字典,若存在获取键的过期时间
(2)获取当前操作系统的时间戳并与键的过期时间进行对比,大于,键过期,小于,键未过期
删除过期键的策略:定时删除,设定定时器,键即将过期时进行删除,占用大量CPU资源,影响服务器响应和吞吐量
惰性删除,每次取键时判断是否过期,过期则删除,未过期返回键,浪费内存,容易发生内存泄漏
定期删除,每过一段时间,检查字典,删除过期键,需要根据服务器情况,定制删除策略
2、RDB持久化
RDB持久化生成一个经过压缩的二进制的RDB文件,可以把数据存到磁盘中,避免数据丢失,通过RDB文件可以还原数据库
RDB持久化可以手动执行,也可以根据服务器配置选项定期执行
SAVE命令会阻碍服务器进程,直到RDB文件生成完毕才放开进程,阻塞期间服务器不能处理任何命令要求
BGSAVE命令会单启动一个子进程,由子进程创建RDB文件,服务器(父进程)继续处理命令
Redis服务载入RDB文件是自动进行的,当Redis服务器启动时检测到存在RDB文件,就会自动载入RDB文件
dirty属性,记录服务器上次持久化到这次持久化期间的操作次数
lastsave属性,记录服务器上次执行SAVE或BGSAVE的时间
RDB文件结构:REDIS,长度5字节,保存REDIS这五个字符,在程序载入文件时可以通过这个部分判断是否是RDB文件
db_version,长度4字节,值是字符串保存的整数值,记录RDB文件版本号
database,保存多个数据库以及其中的键值对数据
EOF,长度1字节,标志RDB文件结束
check_sum,长度8字节,无符号整数,保存校验和,程序通过对REDIS、db_version、database、EOF四部分的内容计算得出,可以用来判断RDB文件是否有损坏
database部分用来保存数据库数据,分为selectdb(1字节)、db_number(1-5字节,数据库号码)、key_value_pairs(键值对数据)三部分
key_value_pairs可以分为但部分TYPE、KEY、VALUE
3、AOF持久化
AOF持久化通过保存redis服务器所执行的命令来记录数据
AOF实现三步骤:命令追加,服务器执行完一个命令后,会以协议格式将命令追加到服务器状态的aof_buf缓冲区末尾
文件写入、文件同步,调用flushAppendOnlyFile函数,将aof_buf缓冲区的命令写入保存到AOF文件中,flushAppendOnlyFile函数的配置由配置文件的appendfsync属性来决定,默认为everysec
AOF文件载入过程:

AOF重写,可以解决AOF文件体积太大的问题,通过重写,创建一个新的AOF文件替换现有文件,两个文件保存状态相同的数据库,因为新文件不包含冗余命令,所以体积要小很多
AOF重写本质是通过读数据库键值对来实现,程序无需对现有的AOF进行写入、分析等操作
3、Redis事件
Redis服务器是一个事件驱动程序,redis事件分为两类:文件事件(服务器对套接字操作的抽象)、时间事件(服务器对定时操作的抽象)
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合
文件事件,基于Reactor模式开发的网络事件处理器,又称文件事件处理器,文件处理器使用I/O多路复用程序同时监听多个套接字,根据套接字目前执行的任务来为套接字关联不同的处理器
文件事件处理器分为套接字、I/O多路复用程序、文件事件分派器、事件处理器四部分,事件类型分为AE_READABLE和AE_WRITABLE,AE_READABLE优先级大于AE_WRITABLE,事件处理器分为连接应答处理器、命令请求处理器、命令回复处理器
时间事件,主要由id(标识号)、when(操作系统时间戳,毫秒)、timeProc(时间事件处理器,一个函数),时间类型分为定时事件(返回值为AE_nomore,一次时间到后会删除)、周期性事件(返回值为非AE_nomore,周期执行)
服务器将时间时间存放到无序链表中,时间事件应用实例,serverCron函数,主要负责信息统计、清理过期键值对、清理失效客户端连接、尝试进行AOF和RDB持久化、对从服务器定期同步、对集群进行定期同步和连接测试
事件调度负责对文件事件和时间事件进行调度分配,由aeProcessEvents函数来实现
时间事件的实际处理事件会比设定时间晚一些
4、客户端与服务器
客户端分为普通客户端和伪客户端两种,类型由fd属性决定,fd=-1,伪客户端,反之普通客户端
服务器处理命令过程:客户端给服务器发送命令、服务器解析命令,获得命令参数、根据参数找到执行函数,执行函数并回复、服务端将命令回复给客户端
服务器自启动到执行客户端命令需要经过初始化服务器状态、载入服务器配置、初始化服务器数据结构、还原数据库状态、执行事件循环
5、其它
AOF更新频率高于RDF,服务器会优先载入AOF文件,只有AOF持久化关闭时,服务器才会使用RDB文件还原数据库
Redis小记(二)的更多相关文章
- redis(二)高级用法
redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- redis入门(二)
目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在redis入门(一)简单 ...
- redis(二)redis的主从模式和集群模式
redis(二)redis的主从模式和集群模式 主从模式 集群模式 主从模式 redis的主从模式,指的是针对多台redis实例时候,只存在一台主服务器master,提供读写的功能,同时存在依附在这台 ...
- 【Docker】 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二)
系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...
- Redis系列(二)-Hredis客户端设计及开源
接上篇c#实现redis客户端(一),重新整理些了下. 阅读目录: 项目说明 Hredis设计图 单元测试场景 总结 项目说明 背景:因为有地方要用,而又没找到对sentinel良好支持的Net客户端 ...
- Redis教程(二):String数据类型
一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...
- Redis系列二之事务及消息通知
一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...
- C# Redis实战(二) [转]
二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 ...
随机推荐
- ASP.NET Core 3.1 WebAPI的跨域问题
1.nuget要加上 Microsoft.AspNetCore.Cors 中间件. 2.在Startup类里先定义一个全局变量. private readonly string AllowSpecif ...
- 力扣Leetcode 199. 二叉树的右视图
199. 二叉树的右视图 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, ...
- day42:HTML标签和CSS选择器
目录 1.HTML 1.1 文档结构 1.2 head标签 1.3 body标签 1.3.1 h1-h6标签 1.3.2.br标签:换行 1.3.3.hr标签:一行横线 1.3.4 a标签:超链接标签 ...
- markdown 语法总结(一)
1.标题 代码 注:# 后面保持空格 # h1 ## h2 ### h3 #### h4 ##### h5 ###### h6 ####### h7 // 错误代码 ######## h8 // 错误 ...
- 用LR录制终于可以在我的电脑上顺利弹出IE了
之前在我的电脑上各种折腾,由于是win764bit+IE11,安装了LR11连最基本的录制都没能搞定.google之后各种的尝试,也没能解决问题.狠下心来把IE11换成了IE8,终于可以勉强使用了,没 ...
- Linux+Jenkins自动构建服务器包
何时使用: 测试过程中我们需要持续构建一个软件项目,为避免重复的手动下载.解压操作,我们需要搭建一个能够自动构建的测试环境,当代码有更新时,测试人员只需点一下[构建]即可拉取最新的代码进行测试(也可设 ...
- The Triangle (简单动态规划)
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calc ...
- JS中的数组,添加删除元素,判断是否存在一个值的方法总结
一.添加元素: 1:在最后添加,返回数组长度:arr.push(...); 2:在最前面添加,返回数组长度:arr.unshift(...); 3:在指定位置添加,没有返回值:arr[i] = xxx ...
- 百度网盘,实现免费不限速,10M/S?
前段时间,各大消息都说百度网盘实现了免费和不限速的『提速模式』,可以达到10M/S,于是我带着好奇想要进行测试一下,探一探真假,毕竟只有自己动手实践才知道真理,结果,辜负众望,一向对用户限速还限制上传 ...
- ElasticSearch7.6.1 安装及其head插件安装
本来打算写一篇ES和Solr的差别的,后来想想算了简单说说吧, 如果是对已存在数据建立完成索引的情况下,Solr更快 一但进行索引的操作的时候,Solr的IO是阻塞的 对于大数据量的实时检索,还是El ...