资讯专栏INFORMATION COLUMN

Redis持久化解决方案

社区管理员 / 404人阅读

一、准备Redis测试实例

1.1 二进制编译安装Redis

[root@10-27-0-224 ~]# wget http://download.redis.io/releases/redis-3.0.7.tar.gz
[root@10-27-0-224 ~]# tar -zxvf redis-3.0.7.tar.gz
[root@10-27-0-224 ~]# ln -s redis-3.0.7 redis       # 增加软连接,方便管理与升级
[root@10-27-0-224 ~]# ll
total 1344
lrwxrwxrwx 1 root root      11 Nov  3 09:12 redis -> redis-3.0.7
drwxrwxr-x 6 root root     306 Jan 25  2016 redis-3.0.7

[root@10-27-0-224 ~]# cd redis
[root@10-27-0-224 redis]# make && make install

1.2 可执行工具说明

[root@10-27-0-224 ~]# cd redis/src/
[root@10-27-0-224 src]# ls * |grep redis-
redis-benchmark
redis-check-aof
redis-check-dump
redis-cli
redis-sentinel
redis-server
可执行文件说明
redis-serverRedis服务器
redis-cliRedis命令行客户端
redis-benchmarkRedis性能测试
redis-check-aofAOF文件修复工具
redis-check-dumpRDB文件检查工具
redis-sentinelsentinel服务器(2.8以后)

1.3 Redis三种启动方式

(1)最简启动Redis(默认配置文件启动)

[root@10-27-0-224 ~]# redis-server 
130445:C 03 Nov 09:22:45.434 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.0.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 130445
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'

(2)动态参数启动(指定端口)

[root@10-27-0-224 ~]# redis-server --port 6380
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.0.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6380
 |    `-._   `._    /     _.-'    |     PID: 130539
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'

(3)指定配置文件启动

[root@10-27-0-224 ~]# vim redis-6379.conf
daemonize yes                     # 以守护进程的方式启动
pidfile "/var/run/redis-6379.pid"
logfile "6379.log"
#save 900 1
#save 300 10
#save 60 10000
dbfilename "dump-6379.rdb"
dir "/root/redis-3.0.7/data"
slave-read-only yes
appendfilename "appendonly-6379.aof"

[root@10-27-0-224 ~]# mkdir /root/redis-3.0.7/data

[root@10-27-0-224 ~]# redis-server redis-6379.conf 
[root@10-27-0-224 ~]# netstat -antulp |grep 6379
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      542/redis-server *: 
tcp6       0      0 :::6379                 :::*                    LISTEN      542/redis-server *:

二、AOF与RDB操作

2.1 什么是RDB?

image.png


2.2 RDB触发机制

image.png

(1)RDB触发机制之SAVE(同步)



[root@10-27-0-224 ~]# redis-cli 
127.0.0.1:6379> save
OK

[root@10-27-0-224 ~]# ll /root/redis/data/
total 8
-rw-r--r-- 1 root root 2181 Nov  3 09:56 6379.log
-rw-r--r-- 1 root root   18 Nov  3 09:56 dump-6379.rdb  # 生成了RDB文件

image.png

◆ 文件策略:如存在老的RDB文件,新替换老
◆ 复杂度:O(N)

(2)RDB触发机制之bgsave(异步)


image.png

[root@10-27-0-224 ~]# redis-cli 
127.0.0.1:6379> bgsave
Background saving started

[root@10-27-0-224 ~]# ll /root/redis/data/
total 8
-rw-r--r-- 1 root root 2434 Nov  3 09:57 6379.log
-rw-r--r-- 1 root root   18 Nov  3 09:57 dump-6379.rdb  # RDB时间已经更新
◆ 文件策略:如存在老的RDB文件,新替换老
◆ 复杂度:O(N)

(3)RDB触发机制之save与bgsave对比

命令savebgsave
IO类型同步异步
阻塞?是(阻塞发生在fork)
复杂度O(n)O(n)
优点不会消耗额外内存不阻塞客户端命令
缺点阻塞客户端命令需要fork,消耗内存

(4)RDB触发机制之自动生成RDB

image.png

[root@10-27-0-224 ~]# vim redis-6379.conf
……
save 900 1
save 300 10
save 60 10000
……

2.3 AOF运行原理

(1)AOF运行原理-创建

image.png

(2)AOF运行原理-恢复

image.png

2.4 AOF三种策略

image.png

(4)AOF三种策略之对比

命令alwayseverysecno
优点不丢失数据每秒一次fsync丢1秒数据不用管
缺点IO开销较大,一般的sata盘只有几百TPS丢1秒数据不可控

2.5 AOF重写

原生AOFAOF重写

set hello world
set hello java
set hello hehe
incr counter
incr counter
rpush mylist a
rpush mylist b
rpush mylist c
过期数据

set hello hehe
set counter 2
rpush mylista bc



◆ 减少硬盘占用量
◆ 加速恢复速度

(1)AOF重写实现的两种方式之 bgrewriteaof

image.png

[root@10-27-0-224 ~]# redis-cli 
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started

[root@10-27-0-224 ~]# ll /root/redis/data/
total 8
-rw-r--r-- 1 root root 3160 Nov  3 10:21 6379.log
-rw-r--r-- 1 root root    0 Nov  3 10:21 appendonly-6379.aof
-rw-r--r-- 1 root root   18 Nov  3 09:57 dump-6379.rdb

(2)AOF重写实现的两种方式之“AOF重写配置”

配置名含义
auto-aof-rewrite-min-sizeAOF文件重写需要的尺寸
auto-aof-rewrite-percentageAOF文件增长率

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/128160.html

相关文章

  • Redis 久化(persistence)技术口袋书

    摘要:则出一个子进程,子进程负责执行保存处理,并在保存完成之后向主进程发送信号,通知主进程保存完成。当子进程完成对新文件的写入时,用新文件替换原来的文件,并删除旧的文件。写时复制持久化的运行原理主进程执行创建出子进程。 本文首发于 Redis 持久化(persistence)技术口袋书,转载请注明出处。 本文讲解 Redis 数据库的数据持久化解决方案。 测试环境: Windows 7 R...

    MudOnTire 评论0 收藏0
  • redis数据库迁移方案

    摘要:迁移方案整理一下常用的几种迁移的方案,分别对应不同的场景。而因为是保存的命令,只是在新的上重新执行了一遍,所以不会覆盖新上的数据。简单来说如果需要保留新的数据,可以使用。 redis迁移方案 整理一下常用的几种redis迁移的方案,分别对应不同的场景。 备份/拷贝/重启 redis-dump 客户端 1. 备份/拷贝/重启 利用redis的持久化功能,redis重启的时候,会自...

    Steve_Wang_ 评论0 收藏0
  • SegmentFault 技术周刊 Vol.37 - 分布式缓存利器:Redis

    摘要:持久化到中反向代理的负载均衡基于的集群搭建如何实现从中订阅消息转发到客户端的扩展是阻塞式,使用订阅发布模式时,会导致整个进程进入阻塞。缓存是用于解决高并发场景下系统的性能及稳定性问题的银弹。 showImg(https://segmentfault.com/img/bVYE6k?w=900&h=385); Redis 是由意大利程序员 Salvatore Sanfilippo(昵称:a...

    kuangcaibao 评论0 收藏0
  • SegmentFault 技术周刊 Vol.37 - 分布式缓存利器:Redis

    摘要:持久化到中反向代理的负载均衡基于的集群搭建如何实现从中订阅消息转发到客户端的扩展是阻塞式,使用订阅发布模式时,会导致整个进程进入阻塞。缓存是用于解决高并发场景下系统的性能及稳定性问题的银弹。 showImg(https://segmentfault.com/img/bVYE6k?w=900&h=385); Redis 是由意大利程序员 Salvatore Sanfilippo(昵称:a...

    binaryTree 评论0 收藏0
  • 【数据库】Redis进阶篇

    摘要:子进程负责把进程内的数据分批写入文件,这个过程属于密集操作,通常子进程对单核利用率接近。如果部署多个实例,尽量保证同一时刻只有一个子进程执行重写工作。避免在大量写入时做子进程重写操作,这样将导致父进程维护大量页副本,造成内存消耗。 欢迎关注公众号:【爱编码】如果有需要后台回复2019赠送1T的学习资料哦!! 继续接着上一篇【数据库】Redis基础篇 事务 为了保证多条命令组合的原子性,...

    ssshooter 评论0 收藏0
  • 春夏秋冬又一春之Redis久化

    摘要:命令和创建快照原理十分相似,所以文件重写也需要用到子进程,这样会导致性能问题和内存占用问题,和快照持久化一样。 历史文章推荐: 一只准程序猿的唠叨 可能是最漂亮的Spring事务管理详解 Java多线程学习(八)线程池与Executor 框架 面试中关于Redis的问题看这篇就够了 非常感谢《redis实战》真本书,本文大多内容也参考了书中的内容。非常推荐大家看一下《redis实战》这...

    harriszh 评论0 收藏0

发表评论

0条评论

社区管理员

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<