前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >Redis持久化解决方案实操

Redis持久化解决方案实操

原创
作者头像
Power
发布2025-03-02 00:41:50
发布2025-03-02 00:41:50
9900
代码可运行
举报
运行总次数:0
代码可运行

一、准备Redis测试实例

1.1 二进制编译安装Redis

代码语言:javascript
代码运行次数:0
复制
[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 可执行工具说明

代码语言:javascript
代码运行次数:0
复制
[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-server

Redis服务器

redis-cli

Redis命令行客户端

redis-benchmark

Redis性能测试

redis-check-aof

AOF文件修复工具

redis-check-dump

RDB文件检查工具

redis-sentinel

sentinel服务器(2.8以后)

1.3 Redis三种启动方式

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

代码语言:javascript
代码运行次数:0
复制
[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)动态参数启动(指定端口)

代码语言:javascript
代码运行次数:0
复制
[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)指定配置文件启动

代码语言:javascript
代码运行次数:0
复制
[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
代码语言:javascript
代码运行次数:0
复制
[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?

Redis持久化解决方案实操(图1)
Redis持久化解决方案实操(图1)

2.2 RDB触发机制

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

Redis持久化解决方案实操(图2)
Redis持久化解决方案实操(图2)
代码语言:javascript
代码运行次数:0
复制
[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文件
Redis持久化解决方案实操(图3)
Redis持久化解决方案实操(图3)
代码语言:javascript
代码运行次数:0
复制
◆ 文件策略:如存在老的RDB文件,新替换老
◆ 复杂度:O(N)

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

Redis持久化解决方案实操(图4)
Redis持久化解决方案实操(图4)
代码语言:javascript
代码运行次数:0
复制
[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时间已经更新
代码语言:javascript
代码运行次数:0
复制
◆ 文件策略:如存在老的RDB文件,新替换老
◆ 复杂度:O(N)

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

命令

save

bgsave

IO类型

同步

异步

阻塞?

是(阻塞发生在fork)

复杂度

O(n)

O(n)

优点

不会消耗额外内存

不阻塞客户端命令

缺点

阻塞客户端命令

需要fork,消耗内存

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

Redis持久化解决方案实操(图5)
Redis持久化解决方案实操(图5)
代码语言:javascript
代码运行次数:0
复制
[root@10-27-0-224 ~]# vim redis-6379.conf
……
save 900 1
save 300 10
save 60 10000
……

2.3 AOF运行原理

(1)AOF运行原理-创建

Redis持久化解决方案实操(图6)
Redis持久化解决方案实操(图6)

(2)AOF运行原理-恢复

Redis持久化解决方案实操(图7)
Redis持久化解决方案实操(图7)

2.4 AOF三种策略

(1)AOF三种策略之Always

Redis持久化解决方案实操(图8)
Redis持久化解决方案实操(图8)

(2)AOF三种策略之Everysec(默认)

Redis持久化解决方案实操(图9)
Redis持久化解决方案实操(图9)

(3)AOF三种策略之NO

Redis持久化解决方案实操(图10)
Redis持久化解决方案实操(图10)

(4)AOF三种策略之对比

命令

always

everysec

no

优点

不丢失数据

每秒一次fsync丢1秒数据

不用管

缺点

IO开销较大,一般的sata盘只有几百TPS

丢1秒数据

不可控

2.5 AOF重写

原生AOF

AOF重写

set hello worldset hello javaset hello heheincr counterincr counterrpush mylist arpush mylist brpush mylist c过期数据

set hello heheset counter 2rpush mylista bc

代码语言:javascript
代码运行次数:0
复制
◆ 减少硬盘占用量
◆ 加速恢复速度

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

Redis持久化解决方案实操(图11)
Redis持久化解决方案实操(图11)
代码语言:javascript
代码运行次数:0
复制
[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-size

AOF文件重写需要的尺寸

auto-aof-rewrite-percentage

AOF文件增长率

统计名

含义

aof_current_size

AOF当前尺寸(单位:字节)

aof_base_size

AOF上次启动和重写的尺寸(单位:字节)

代码语言:javascript
代码运行次数:0
复制
自动触发时机:
◆ aof_current_size > auto-aof-rewrite-min-size
◆ aof_current_size - aof_base_size/aof_base_size > auto-aof-rewrite-percentage

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、准备Redis测试实例
    • 1.1 二进制编译安装Redis
    • 1.2 可执行工具说明
    • 1.3 Redis三种启动方式
  • 二、AOF与RDB操作
    • 2.1 什么是RDB?
    • 2.2 RDB触发机制
    • 2.3 AOF运行原理
    • 2.4 AOF三种策略
    • 2.5 AOF重写
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档