一,redis高性能的原因
造就redis高性能的主要原因主要有如下三个:
-
纯内存访问,redis的所有数据都存储在内存,内存的响应时间大约为100纳秒,这时Redis达到每秒万级别访问的重要基础;
-
IO多路复用,Redis使用epoll作为I/O多路复用技术的实现,在加上Redis自身的事件处理模型将epoll中的链接、读写、关闭都转换为事件,不在网络I/O上浪费过多的时间;
-
单线程,单线程是redis的一大特点,正因为如此单线程避免了线程切换和竞态产生的消耗
二,持久化
持久化概念
为了保证redis在重启之后数据不丢失,需要将内存中的数据同步到硬盘中,这一过程就是持久化
redis中的持久化
redis支持两种方式的持久化,AOF和RDB,可以使用其中一种方式,也可以同时使用两种持久化方式
RDB持久化(Redis DataBase)
redis默认支持RDB方式的持久化,无需配置
什么是RDB持久化
RDB持久化是指在指定的时间间隔将内存中的数据以数据集快照的形式同步到硬盘中
RDB工作
默认情况下,redis将数据库快照保存在dump.rdb的二进制文件中,可以对 Redis 进行设置, 让它在“ N 秒内数据集至少有 M 个改动”这一条件被满足时, 自动保存一次数据集
save 60 1000 //60 秒内有至少有 1000 个键被改动”这一条件时, 自动保存一次数据集:
执行快照
-
Redis 调用 fork() ,同时拥有父进程和子进程。
-
子进程将数据集写入到一个临时 RDB 文件中。
-
当子进程完成对新 RDB 文件的写入时,Redis 用新 RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
RDB优缺点
优点
-
保存了redis在某些时间点上的数据,可以用作备份
-
对于大数据集,RDB启动更快
-
高性能,只需要分出子进程,由子进程完成持久化工作,避免了主进程执行IO操作
-
适用于数据恢复
缺点
-
可能会出现数据丢失
-
当数据集较大时子进程持久化操作可能会导致主进程停止服务一段时间
AOF持久化(append only file
什么是AOF持久化
AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。
开启AOF
可以通过修改配置文件来打开 AOF 功能
appendonly yes
每当 Redis 执行一个改变数据集的命令时,比如
SET key value [EX seconds] [PX milliseconds] [NX|XX]
这个命令就会被追加到 AOF 文件的末尾。
这样的话, 当 Redis 重新启时, 程序就可以通过重新执行 AOF 文件中的命令来达到重建数据集的目的。
所以AOF更像是一个redis命令日志
AOF持久化配置
在Redis的配置文件中存在三种同步方式,它们分别是:
appendfsync always #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec #每秒钟同步一次,该策略为AOF的缺省策略。
appendfsync no #从不同步。高效但是数据不会被持久化。
AOF优缺点
优点
-
可以带来更高的数据安全性,即数据持久性
-
由于该机制对日志文件的写入操作采用的是append模式,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。
-
如果日志过大,Redis可以自动启用rewrite机制
缺点
-
对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
-
根据同步策略的不同,AOF在运行效率上往往会慢于RDB,每秒同步策略的效率是比较高的,同步禁用策略的效率和RDB一样高效