Redis 功能入门大全和基于scala实现示例(3) -- 持久化

《Redis 功能入门大全和基于scala实现示例(3) -- 持久化》 redis-scala.PNG

概要

  • Redis server 基于5.0.0的stable版本
  • Client基于 Jedis 2.9.0
  • Scala 基于 2.11.X

在系列的文章完成后,我们会了解redis的基本功能,实现scala语言对redis进行基本操作。
本文侧重理论是redis数据保存策略的重要环节。实战中,性能调优很多基于这些参数进行。

本文内容提要:

  • redis 数据持久化策略
  • redis持久化配置方式

数据持久化

redis是内存型数据库,也是作为缓存使用重要原因。数据存储在内存中,一个致命的缺陷是:如果服务器出现重启、宕机,数据不可恢复。持久化机制因数据恢复功能而存在。Redis服务重启后,从持久化的文件中加载数据。Redis支持2种数据持久化模式, RDB(Redis DataBase)AOF(append only file)。持久化方式分别介绍配置、基本操作流程特点。

Redis服务支持2种持久化模式同时开启。同时开启时,重启服务默认加载AOF持久化的数据,原因后面会提到。

无论那种模式都使用fork函数开始子进程,进而开启持久化流程。另外,持久化过程中,若发生硬盘Io问题,都会导致阻塞。

1. RDB
  • RDB配置

    # save <seconds> <changes>

    save 900 1 #900秒内如果超过1个key被修改,则保存

    save 300 10 #900秒内如果超过10个key被修改,则保存
    save 60 10000 #60秒内如果超过10000 个key被修改,则保存

    stop-writes-on-bgsave-error yes #bgsave发生错误是否停止写入

    rdbcompression yes #是否使用 LZF 压缩数据,减少文件大小

    rdbchecksum yes #是否进行CRC64校验,开启会损失 10%性能

    dbfilename dump.rdb #保存文件名称 dump.rdb

    dir “/home/data/” #数据保存目录

  • RDB工作流程

    RDB通常指的是快照式数据存储,也支持手动触发数据存储。持久化实现逻辑:

    • 满足保存条件时, redis调用系统函数fork() ,创建一个子进程。
    • 子进程将数据集写入到一个临时 RDB 文件中。
    • 当子进程完成对临时RDB文件的写入时,redis 用新的临时RDB 文件替换原来的RDB 文件,并删除旧 RDB 文件。

    RDB持久化数据保存的是fork时间点的服务的数据,在进行RDB操作时,Redis服务是阻塞状态的。对服务响应实时性要求很高,一般不使用RDB持久化。

    持久化用临时替代旧文件,保证了即使在写入失败时,依然有一份完整的数据可供恢复。

  • RDB缺点

    • RDB周期性持久化,不适合实时性要求,可能存在数据丢失。
2. AOF
  • AOF 配置

    appendonly no #开启AOF模式

    appendfilename “appendonly.aof” #保存的文件名

    # 数据写的方式

    # appendfsync always

    appendfsync everysec

    # appendfsync no

    no-appendfsync-on-rewrite no #重写配置

    auto-aof-rewrite-percentage 100
    auto-aof-rewrite-min-size 64mb

    aof-load-truncated yes

    aof-use-rdb-preamble yes

  • AOF 工作流程

    AOF模式包括几个步骤: 命令写入、文件同步、文件重写、重启加载(在数据恢复时使用)。

    • 所有写入命令会追加到缓冲区中
    • AOF缓冲区根据对应的策略向硬盘做同步操作(见配置参数中同步策略)。
    • 定期对AOF文件进行重写(重写也是通过fork子进程生成新的AOF文件)。
  • AOF 优缺点

    • 更高的数据安全性。Redis中提供了3中同步策略,即每秒同步、每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒钟之内修改的数据将会丢失。而每修改同步,我们可以将其视为同步持久化,即每次发生的数据变化都会被立即记录到磁盘中。
    • 容灾。由于该机制对日志文件的写入操作采用的是append模式,因此写入时出现宕机现象,也不会破坏日志文件中已经存在的内容。然而如果写入了一半数据就出现了系统崩溃问题,在Redis下一次启动之前,我们可以通过redis-check-aof工具来帮助我们解决数据一致性的问题。
    • 自动重写。如果日志过大,Redis可以自动启用rewrite机制。即Redis以append模式不断的将修改数据写入到老的磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行。因此在进行rewrite切换时可以更好的保证数据安全性。
    • 持久化文件占用大存储空间。相同场景下,RDB重启恢复时间要快于AOF模式。

    2种持久化模式都开启时,默认使用AOF数据是由其更高的数据安全性决定的。

往期传送门:

Redis 功能入门大全和基于scala的应用实现(1)
Redis 功能入门大全和基于scala的应用实现(2)
Redis 功能入门大全和基于scala实现示例(3) — 持久化

据说,点赞会让女变美,男变靓。年终奖上涨非常浪,O(∩_∩)O~

    原文作者:小赵营
    原文地址: https://www.jianshu.com/p/bbb5aa840e2b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞