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小记(二)的更多相关文章

  1. redis(二)高级用法

    redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...

  2. Redis系列(二):Redis的数据类型及命令操作

    原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...

  3. redis入门(二)

    目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在redis入门(一)简单 ...

  4. redis(二)redis的主从模式和集群模式

    redis(二)redis的主从模式和集群模式 主从模式 集群模式 主从模式 redis的主从模式,指的是针对多台redis实例时候,只存在一台主服务器master,提供读写的功能,同时存在依附在这台 ...

  5. 【Docker】 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二)

    系列目录: [Docker] CentOS7 安装 Docker 及其使用方法 ( 一 ) [Docker] 使用Docker 在阿里云 Centos7 部署 MySQL 和 Redis (二) [D ...

  6. Redis系列(二)-Hredis客户端设计及开源

    接上篇c#实现redis客户端(一),重新整理些了下. 阅读目录: 项目说明 Hredis设计图 单元测试场景 总结 项目说明 背景:因为有地方要用,而又没找到对sentinel良好支持的Net客户端 ...

  7. Redis教程(二):String数据类型

    一.概述: 字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等.在Redis中字符串类型 ...

  8. Redis系列二之事务及消息通知

    一.事务 Redis中的事务是一组命令的集合.一个事务中的命令要么都执行,要么都不执行. 1.事务简介 事务的原理是先将一个事务的命令发送给Redis,然后再让Redis依次执行这些命令.下面看一个示 ...

  9. C# Redis实战(二) [转]

    二.Redis服务  在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图               ...

随机推荐

  1. MPI计算π

    MPI计算\(\pi\) 利用公式 \[\int_0^1 \frac{4}{1+x^2}dx = \pi \] #include<stdio.h> #include<mpi.h> ...

  2. 快速构建一个完整的Selenium框架

    今天跟大家细讲如何构建一个完整的selenium框架,当你学会了这一篇你就也可以说自己会selenium自动化测试了. 1.新建项目,结构如图: 注意:整个项目除了最外层的是文件夹,其他的都是包(pa ...

  3. k8s-1.15.0集群部署+dashboard

    环境:外网环境硬件master-centos7.4  2核4G node1-centos7.4     2核4Gnode2-centos7.4     2核4G软件:三台服务器 :docker-19. ...

  4. Python编程进阶,Python如何实现多进程?

    进程part1 一.进程介绍 1.获取子父进程 2.进程的基本使用 2.创建带有参数的进程 3.进程之间的数据彼此隔离 4.多个进程之间的异步并发 二.join 1.基本语法 2.使用自定义类的方法创 ...

  5. android 数据绑定(4)实用特性及疑惑:使用控件、格式化@string/xxx、对象传递、双向数据绑定

    1.在布局内使用其它控件 1.1 效果 箭头所指3个控件的内容随输入框内容而变化. 1.2 示例代码 <?xml version="1.0" encoding="u ...

  6. 详细分析链表中的递归性质(Java 实现)

    目录 链表中的递归性质 前言 LeetCode 上关于链表的一道问题 203 号题目 移除链表中的元素 递归的基本概念与示例 链表天然的递归性 小结 链表中的递归性质 前言 在前面的 链表的数据结构的 ...

  7. SQL用于更新ID为顺序ID(用于删除了几条数据导致id不连续)

    UPDATE tab1022zhm SET ID =FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) ROW,comName FROM dbo.tab1022z ...

  8. Httprunner框架学习

    前言 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试. 官方文档:https://docs.httprunner. ...

  9. 【小程序】---- 封装Echarts公共组件,遍历图表实现多个饼图

    一.问题描述: 在小程序的项目中,封装公共的饼图组件,并在需要的页面引入使用.要求一个页面中有多个饼图,动态渲染不同的数据. 二.效果实现: 1. 查看——小程序使用Echarts的方式 2. 封装饼 ...

  10. docker下jira数据备份和还原注意路径

    重点:jira页面上的备份与恢复页面的路径,跟我实际路径是有出入的,如果找不到就用find去搜下备份文件就知道怎么操作了 1.登录jira后,右上角的系统——左侧的导入与导出——选择里面的备份与恢复 ...