Redis总结(四)Redis 的持久化

  前面已经总结了Redis 的安装和使用今天讲下Redis 的持久化。

  

  redis跟memcached类似,都是内存数据库,不过redis支持数据持久化,也就是说redis可以将内存中的数据同步到磁盘来持久化,以确保redis 的数据安全。

 

 redis持久化的两种方式

  redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。

  RDB,简而言之,就是将存储的数据快照的方式存储到磁盘上,

  AOF,则是将redis执行过的所有写指令记录下来,通过write函数追加到AOF文件的末尾。在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。

 

  其实RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。

  如果你没有数据持久化的需求,也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。

 

 RDB

  RDB(Redis DataBase),是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。默认的文件名为dump.rdb。

  redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件,以确保数据完整可用。

  save 300 10  #300秒内容如超过10个key被修改,则发起快照保存

   

  不过,由于快照方式是在一定间隔时间做一次的,如果对数据的完整性非常敏感,那么RDB方式就不太适合你,因为即使你每2分钟都持久化一次,当redis故障时,仍然会有近2分钟的数据丢失。所以,redis还提供了另一种持久化方式,那就是AOF。

 

 

 AOF

  AOF(Append Only File),即只允许追加不允许改写的文件。

  Redis会将收到的每一个写操作(如SET等)通过write函数追加到AOF文件的末尾。默认的AOF持久化策略是每秒钟fsync一次(把缓存中的写指令记录到磁盘中)。

 

  当Redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

  appendonly yes           #启用aof持久化方式
  # appendfsync always    #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
  appendfsync everysec     #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
  # appendfsync no       #完全依赖os,性能最好,持久化没保证

  

  但AOF方式是将所有的命令记录下来,所以AOF文件要比RDB文件的体积大。而且,恢复速度也要慢于RDB方式。

 

  redis提供了bgrewriteaof命令,会重新生成一个全新的AOF文件,其中便包括了可以恢复现有数据的最少的命令集。

 

  需要注意到是重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库内容用命令的方式重写了一个新的aof文件,这点和快照有点类似。

 

 如何选择RDB和AOF

  对于我们应该选择RDB还是AOF,取决于具体的应用场景,官方的建议是两个同时使用。这样可以提供更可靠的持久化方案。

 

时间: 2024-09-20 15:24:55

Redis总结(四)Redis 的持久化的相关文章

《Redis官方文档》持久化

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

NoSQL之Redis(四)--- RedisCluster概念以及搭建

之前已经在博文中介绍了redis以及redis的简单实用,但是在实际的项目中用单机版redis还是很少的基本上都是实用redis集群.            RedisCluster概念          RedisCluster架构          架构细节:          (1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.          (2)节点的fail是通过集群中超过半数的节点检测失效时才生效.          (3)客户端

redis 如何用redis Cluster 实现共享session

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

NoSQL数据库之Redis数据库:Redis的介绍与安装部署

 NoSQL(NoSQL = Not Only SQL),它指的是非关系型的数据库.随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显的力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展.   NoSQL的特点: 特点一: 是以key-value形式存储,和传统的关系型数据库不一样,不一定遵循传统数据库的一些基本要求,比如说遵循SQL标准.ACID属性.表结构等等

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

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

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:

Redis桌面客户端 Redis Studio

Redis Studio 详细介绍 Redis Studio 是Redis桌面客户端,支持Windows操作系统. Redis Studio 提供更轻量级,更友好,更高效的Redis管理. 界面一览: 文章转载自 开源中国社区 [http://www.oschina.net]

05_NoSQL数据库之Redis数据库:Redis的常用命令,键值相关命令和服务器相关命令

 Redis常用命令 Redis提供了丰富的命令对数据库和各种数据库类型进行操作,这些命令可以再Linux终端使用.   键值相关命令: Keys:返回满足给定pattern的所有key 用表达式*表示取出所有的key 127.0.0.1:6379> keys * 1) "age" 2) "name" 3) "age2" 127.0.0.1:6379> keys a* 1) "age" 2) "age