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即为其服务端程序,双击即开始运行,如图 ...
随机推荐
- Docker 学习笔记(一)
Docker 入门 Docker 学习 概述 安装 命令 镜像命令 容器命令 操作命令 Docker 镜像 容器数据卷 DockerFile Docker网络原理 IDEA 整合Docker 单机版D ...
- [转] Linux操作系统启动流程
总启动流程 这部分转自:https://www.cnblogs.com/liang-io/p/9651656.html 一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可 ...
- /usr/bin/ld: cannot find -lcrypto
当我们使用openssl里边的函数的时候,需要链接crypto的库 如果找不到,加一个软链接,如下: ln -s /usr/lib64/libcrypto.so.1.1 /usr/lib64/libc ...
- Combine 框架,从0到1 —— 3.使用 Subscriber 控制发布速度
本文首发于 Ficow Shen's Blog,原文地址: Combine 框架,从0到1 -- 3.使用 Subscriber 控制发布速度. 内容概览 前言 在发布者生产元素时消耗它们 使 ...
- Android Studio或者Eclipse中的最常用的快捷键,最简单的,部分不适用eclipse
重写方法:ctrl+shift+s 然后选择Generate 构建即可: 执行程序:shift+F10 多行注释:ctrl+shift+/ 单行注释:ctrl+/ 快速打印log:logr 快速复制 ...
- unity坑-编译错误
问题: 项目里面有一个 StreamReader来读取一个文件,使用OpenText() 方法. 但是UNITY却提示 StreamReader类不包含OpenText()方法,并且也没有找到扩展方法 ...
- <string name="xxx"> 的复杂用法:格式化及使用html标签
1.官方文档: https://developer.android.com/guide/topics/resources/string-resource 2.格式化字符串 2.1 示例 <res ...
- hdu6075 2019CCPC网络选拔赛1004 path
题意:给定一个带权有向图,有q组询问,每次询问在有向图的所有路径中,第k小的路径权值 解题思路:因为k最大只有5e4,考虑暴力搜索出前maxk小的路径并用数组记录权值,然后就可以O(1)查询. 具体实 ...
- Linux服务器关联Git,通过执行更新脚本实现代码同步
1.在Linux服务器安装Git yum install git -y tips: 卸载Git : yum remove git 2.在Linux生成ssh key 1)创建用户 git ...
- vue中饼状图的使用
图形构建子组件 <template> <div> <div id="myChart" :style="echartStyle"&g ...