Redis笔记(八)Redis的持久化

Redis相比Memcached的很大一个优势是支持数据的持久化

通常持久化的场景一个是做数据库使用,另一个是Redis在做缓存服务器时,防止缓存失效。

Redis的持久化主要有快照Snapshotting和AOF日志文件两种方式。

前者会根据配置的规则定时将内存中的数据持久化到硬盘上,

后者则是在每次执行写命令之后将命令记录下来。

RDB方式

Redis是会以快照的形式将数据持久化到磁盘上。

默认会将快照文件存储在Redis当前进程的工作目录的dump.rdb文件中,

可以通过配置文件中的dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。

如何执行快照保存

Redis使用fork函数复制一份当前进程(父进程)的副本(子进程);
父进程继续处理来自客户端的请求,子进程开始将内存中的数据写入硬盘中的临时文件;
当子进程写完所有的数据后,用该临时文件替换旧的RDB文件,至此,一次快照操作完成。
需要注意的是:
在执行fork是时候操作系统(类Unix操作系统)会使用写时复制(copy-on-write)策略,
即fork函数发生的一刻,父进程和子进程共享同一块内存数据,当父进程需要修改其中的某片数据(如执行写命令)时,
操作系统会将该片数据复制一份以保证子进程不受影响,所以RDB文件存储的是执行fork操作那一刻的内存数据。
所以RDB方式理论上是会存在丢数据的情况的(fork之后修改的的那些没有写进RDB文件)。
RDB文件是经过压缩处理的二进制文件,所以占用的空间会小于内存中数据的大小,更有利于传输。
Redis启动时会自动读取RDB快照文件,将数据从硬盘载入到内存。

Redis执行快照的规则

1.根据配置规则进行自动快照

下面是默认的快照保存配置:
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内如果超过10个key被修改,则发起快照保存
save 60 10000 #60秒内如果超过10000个key被修改,则发起快照保存
每个快照条件是||的关系,满足一个系统就会执行。

2.用户执行SAVE, BGSAVE命令
执行SAVE命令时,Redis会同步进行快照操作,期间会阻塞所有来自客户端的请求;
执行BGSAVE命令时,这个命令是在后台异步进行的,进行快照操作的同时还能处理来自客户端的请求。

3.执行复制(replication)时
当使用多台服务器时,Redis提供了复制功能,可以实现自动同步。复制的原理同样是使用快照,
主数据库在后台保存快照,并且将快照期间的客户端请求命令缓存起来,快照完成后,将快照文件和缓存命令一起发送给从数据库,从而实现数据的同步。

AOF方式

默认情况下,Redis没有开启AOF方式的持久化,可以查看配置文件:

appendonly no

需要在配置文件中将appendonly参数开启:

appendonly yes

开启之后,Redis每执行一条写命令就会将该命令写入硬盘中的AOF文件。

AOF文件和RDB文件在同一路径下,可以通过appendonlyfilename参数修改配置:

# The name of the append only file (default: "appendonly.aof")
appendfilename "appendonly.aof"

AOF的实现

AOF以纯文本的形式记录了Redis执行的写命令,我修改上面的配置后,重启Redis,执行下面的命令:
redis> set key1 value1
OK
redis> set key2 value2
OK
redis> set key1 value3
OK
然后查看Redis路径下的文件:
bingyue@ubuntu:/data/redis-3.0.3$ cat appendonly.aof
set   
$4   
key1   
$6  
value1  
*3  
$3  
set  
$4           
key2          
$6          
value2          
*3          
$3          
set          
$4          
key1          
$6          
value3          

Redis重写

注意我上面做了一次覆盖的操作,并且被AOF文件记录下来了,
实际使用中遇到反复修改的数据,这么做是很浪费资源的,
Redis可以清除AOF文件中的无效的命令,即Redis的重写,并且可以在配置文件中配置重写规则:

# Automatic rewrite of the append only file.
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

配置文件中对这两项做了说明:

# Redis is able to automatically rewrite the log file implicitly calling
# BGREWRITEAOF when the AOF log size grows by the specified percentage.
# This is how it works: Redis remembers the size of the AOF file after the
# latest rewrite (if no rewrite has happened since the restart, the size of
# the AOF at startup is used).
# This base size is compared to the current size. If the current size is
# bigger than the specified percentage, the rewrite is triggered. Also
# you need to specify a minimal size for the AOF file to be rewritten, this
# is useful to avoid rewriting the AOF file even if the percentage increase
# is reached but it is still pretty small.
# Specify a percentage of zero in order to disable the automatic AOF
# rewrite feature.

即当AOF文件大小超过最近一次重写时文件的百分之多少,并且AOF文件大于配置的最小值时,触发Redis重写操作。

同时可以执行BGREWRITEAOF命令,手动进行重写,

我做了一次这个操作,再查看AOF文件:
SET
$4
key2
$6
value2
*3
$3
SET
$4
key1
$6
value3

虽然每次执行更改,AOF文件都会记录,但实际上由于操作系统的缓存机制,
默认情况下系统会每30秒执行一次同步,将硬盘缓存中的数据真正写入到硬盘,
这中间如果应用发生异常则不能保存这部分数据。

Redis可以配置在写入AOF文件时执行同步操作的规则:

# appendfsync always 每次写入都会执行同步操作
appendfsync everysec 每秒进行一次同步
# appendfsync no 不主动进行同步

一般来说每秒钟进行同步已经足够,这也是Redis默认的规则。

时间: 2024-09-17 04:46:11

Redis笔记(八)Redis的持久化的相关文章

Redis学习笔记~StackExchange.Redis实现分布式Session

对于多WEB的环境现在已经是必须的了,很难想像一台WEB服务器面对百万并发的响应,所以,我们需要多台WEB服务器集群合作,来缓解这种高并发,高吞吐的场景,而对于多WEB的场景又会有个问题出现,即session存储的问题,如一个用户登陆后,把一个状态信息存储到当前WEB服务器的session里,而你请求其它页面时,很可能就被路由到另一台服务器了,这时,session也就丢了,而对于这种情况,有人把redis这个存储中间件想了起来,对它进行了封装,就有了今天基于redis的session共享机制.

《Redis官方文档》持久化

原文链接 译者:Alexandar Mahone 这篇文章从技术层面描述了Redis持久化,建议所有读者阅读.如果希望更多了解Redis持久化和持久性保障,建议阅读Redis持久化揭秘. Redis 持久化 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集. AOF 文件中的命令全部以 Redis 协议的格

Redis笔记(一)Redis简介

关于Redis Redis是一款开源的高性能键值对数据库, 最初的作者是意大利的Salvatore Sanfilippo, 他的github是 antirez ,Redis的源码同样托管在Git上:https://github.com/antirez/redis. 目前,Vmware在资助着redis项目的开发和维护. Redis的特性 键值对如dict["key"]="value"中,"key"是键名,"value"是键值,

redis笔记

redis笔记 什么是redis 意大利的老司机内部用mysql不能满足高并发的请求,为了解决问题,该司机申请的内部项目,诞生了redis,用C语言开发的高性能的键值对缓存数据服务~ 支持的数据结构 string Set Hash sortSet List redis目的 数据据库缓存集群,保持并发业务的高可用,高速响应 基础知识 Redis内置16384个hash槽,crc16算法来确定请求该访问哪一个槽.->crc16根据客户端的key计算一个结果,对16384取余,确定区间,然后确定该请求

Redis笔记(五)Redis的事务

关系型数据库的事务 事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消. Atomic(原子性):  一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节. Consistency(一致性): 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态. Isolation(隔离性):  一个事务的执行不能其它事务干扰.事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正确性和完整性. Du

ApsaraDB for Redis(阿里云redis) 如何导出redis数据?

问题描述 ApsaraDB for Redis(阿里云redis) 如何导出redis数据? ApsaraDB for Redis(阿里云redis) 如何导出redis数据? 需求直接把所有数据复制到我本地redis,设置主从不行,求办法

redis 如何用redis Cluster 实现共享session

问题描述 redis 如何用redis Cluster 实现共享session 10C 在分布式服务器上部署了服务,希望能够达到session同步,所以希望把session存储到redis cluster中,目前网上都都是针对tomcat修改配置后存储到redis单个节点的,请问有人实现过使用redis集群配置的吗?或者有相关资料参考也不甚感激.PS:我已经用redis集群搭建了四主四从8个节点,采用redis-trib命令搭建的,想请问的是如何使用该集群存储session 解决方案 基于Red

redis安装,redis项目以来,redis和spring整合,redis的service,redis的service实现类

一.redis安装: Redis-3.2.6.tar.gz安装,参考方式: 用源码工程来编译安装 1.  到官网下载最新stable版,这里使用的是:redis-3.2.6.tar.gz 2.  cd /usr/local   3.  make redis-src 4.  tar -zxvf    redis-3.2.6.tar.gz  -C  ./redis-src/ 2.解压源码并进入目录cd  /usr/local/redis-src/redis-3.2.6 3. 先执行make,检查是否

基于Redis Sentinel的Redis集群(主从Sharding)高可用方案(转)

本文主要介绍一种通过Jedis&Sentinel实现Redis集群高可用方案,该方案需要使用Jedis2.2.2及以上版本(强制),Redis2.8及以上版本(可选,Sentinel最早出现在Redis2.4中,Redis2.8中Sentinel更加稳定),Redis集群是以分片(Sharding)加主从的方式搭建,满足可扩展性的要求: Redis Sentinel介绍 Redis Sentinel是Redis官方提供的集群管理工具,主要有三大功能: 监控,能持续监控Redis的主从实例是否正常

《架构之路Redis系列》Redis哨兵模式的搭建

一.哨兵模式 1.简介 Redis Sentinel是Redis官方提供的集群管理工具,可以部署在其他与redis集群可通讯的机器中监控redis集群. 2.特性 监控:能持续监控Redis的主从实例是否正常工作; 通知:当被监控的Redis实例出问题时,能通过API通知系统管理员或其他程序; 自动故障恢复:如果主实例无法正常工作,Sentinel将启动故障恢复机制把一个从实例提升为主实例,其他的从实例将会被重新配置到新的主实例,且应用程序会得到一个更换新地址的通知. 更多访问官方:https: