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即为其服务端程序,双击即开始运行,如图 ...
随机推荐
- MPI中的cannon算法
Cannon算法 算法过程 假设矩阵\(A,B\)和\(C\)都可以分成\(m\times m\)块矩阵,即\(A = (A_{(ij)})_{m\times m},B = (B_{(ij)})_{m ...
- 手写迷你Tomcat
手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat手写迷你Tomcat ...
- android开发之使edittext输入弹出数字软键盘。亲测可用。手机号登陆注册常用。
<EditText android:id="@+id/edit_digit_input" android:layout_width="wrap_content&qu ...
- Codeforces Round #560 (Div. 3)A-E
A. Remainder output standard output You are given a huge decimal number consisting of nn digits. It ...
- Matlab摄像头视频基本处理
一.读取摄像头 1.首先保证摄像头及其驱动正确在电脑上安装 2.简单的代码显示驱动摄像头,并显示: vid = videoinput('winvideo',1); preview(vid); 3.默认 ...
- 使用Telnet服务测试端口时,提示没有Telnet服务
1.win7系统是默认不开启Telnet服务的,所以我们第一次使用时要手动开启Telnet服务 1)打开 控制面板 > 程序 > 程序功能 > 打开或关闭Windows功能,勾选上T ...
- Redis安装问题解决方案
Redis部署采坑记 Redis部署采坑记 问题一: 问题描述: make 编译源码时报错 问题详解: 因为缺少gcc-c++编译器的原因 解决方案: 方案一: yum -y install gc ...
- Java原生网络编程
一些常见术语 编程中的Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面 ...
- HTTP 协议类
HTTP 协议的主要特点 简单快速:每个资源的URL是固定的 灵活:在每个 http 协议中都有一个头部分有一个数据类型,通过一个 http 协议就可以完成不同数据类型的传输 无连接:连接一次就好断掉 ...
- [剑指Offer]30-包含min函数的栈
题目 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 题解 辅助栈记录当前最小值. 代码 import java.util.Stack; pub ...