Java互联网科技redis学习

详解Redis——持久化方案

2019-08-25  本文已影响8人  Java高级架构狮

欢迎Java工程师关注简书专栏
Java架构技术进阶
本专栏收录各种Java相关技术,面试题,以及学习感悟,心得!

一:前言

Redis是一种基于内存的非关系型数据库,它的所有数据都保存在内存中。因而会存在重启机器数据丢失情况。为避免这类情况发生,Redis支持数据持久化功能。通过配置,开启持久化,将数据保存到硬盘上。

Redis目前提供了两种方式的持久化机制[其实还有VM、DISKSTORE,但是官方不推荐]:

二:RDB

RDB中文名为快照-内存,它的持久化实现原理就是通过开启RDB[默认方案]并配置时间周期定时将数据从内存写入硬盘。

Redis提供如下几种方式来对数据进行快照:

下图将描述Redis如何实现持久化:

RDB的持久化是一个全量保存数据过程,若数据量较大,则保存时间就会有点长。此时,当在快照的时候进行写操作,那么势必出现数据不一致情况。因而Redis采取的是Copy-on-Write方案,来保证在快照中的数据是不会有变化的。该方案中快照数据是fork一个子进程来处理内存中数据写入硬盘。图中可以看到子进程是先保存一个临时的RDB文件,这样好处是当服务端崩溃时,只有上次快照中有新增或变化的数据异常,绝大部分数据仍然是正常的。Redis存储的数据默认保存在与redis-conf同一级目录,名称为dump.rdb。如果想要将数据放在自定义的路径下、自定义名称就修改如下配置即可。

# Note that you must specify a directory here, not a file name.dir./
# The filename where to dump the DBdbfilename dump.rdb修改快照周期,一行一个配置,各配置之间是或的关系:
# 周期性执行条件的设置格式为

三:AOF

为满足Redis异常崩溃导致少量数据丢失,或快照方式存储数据时间较长、占用CPU资源较高,Redis提供增量更新数据的AOF持久化方案。

AOF持久化,其原理是通过日志的形式记录服务器处理的每一个写、删除、更新操作,这样可以方便查看。当RDB与AOF都开启时,将使用AOF。下图简要描述AOF执行过程:

Redis在处理一条命令时,并不立即调用write写AOF文件,只是将数据写入到AOF buffer(server.aof_buf)中。调用write和命令处理是分开的,Redis只在每次进入epoll_wait之前做write操作。如何配置AOF:

# 将no改为yes即可开启appendonlyno# AOF记录日志名称,保存在bin下appendfilename"appendonly.aof"# 同步策略,有everysec、always、no,默认是everysec每秒同步;# always表示有写操作就执行调用fsync(Linux为调用fdatasync);# no表示写入后不会有fsync调用,由操作系统自动调度刷磁盘,性能是最好的appendfsync everysec

四:总结

如何选择持久化方案,取决于实际业务场景的需要,适合才是最重要的。RDB方案适合做冷备份,恢复数据时候数据比AOF快,而且快照时对写入服务影响小,但是会存在丢失数据,而且当数据量大的时候会存在服务短暂停止。AOF方案适合满足缓存一致性,而且当出现数据误删,可以采取将日志文件中误操作步骤删除就可以恢复数据。

上一篇下一篇

猜你喜欢

热点阅读