Redis4.0 之持久化存储
Posted 大魔王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis4.0 之持久化存储相关的知识,希望对你有一定的参考价值。
redis如果提供缓存服务,可以关闭所有持久化存储,如此一来redis重启后所有数据会丢失
开启rdb或aof持久化存储,能把redis中的数据持久化到磁盘中。
rdb和aof对性能都有影响,所以建议持久化的操作在从库上进行
Redis的rdb存储方式,使用save配置开启rdb存储或者关闭rdb存储
# 默认情况下rdb持久化存储是开启的 [[email protected] ~]# redis-cli -h 127.0.0.1 config set save "" # 关闭rdb存储 OK [[email protected] ~]# redis-cli -h 127.0.0.1 config rewrite # 保存配置 OK [[email protected] ~]# redis-cli -h 127.0.0.1 config set save "180 1 120 10 60 10000" # 开启rdb OK [[email protected] ~]# redis-cli -h 127.0.0.1 config rewrite # 保存配置 OK
进行数据写入 , 观察rdb存储日志
# 输入一万条数据 [[email protected] ~]# for line in `seq -w 10000`;do redis-cli set key_${line} value1_${line};done # 查看日志 [[email protected] ~]# tail -5 /data/redis/redis.log 54721:M 08 Oct 18:43:39.026 * 10000 changes in 60 seconds. Saving... # 60秒内发生了一万条数据变化,出发rdb存储 54721:M 08 Oct 18:43:39.027 * Background saving started by pid 85432 85432:C 08 Oct 18:43:39.032 * DB saved on disk 85432:C 08 Oct 18:43:39.033 * RDB: 0 MB of memory used by copy-on-write 54721:M 08 Oct 18:43:39.127 * Background saving terminated with success
Redis也提供了bgsave命令能够立刻出发rdb存储
[[email protected] ~]# redis-cli save # 会阻塞前端客户数据写入 OK [[email protected] ~]# redis-cli bgsave # 后台启动新进程进行rdb存储 Background saving started [[email protected] ~]# tail -5 /data/redis/redis.log 54721:M 08 Oct 18:46:44.263 * DB saved on disk # save触发rdb存储 54721:M 08 Oct 18:47:02.738 * Background saving started by pid 85602 # bgsave触发的rdb存储 85602:C 08 Oct 18:47:02.744 * DB saved on disk 85602:C 08 Oct 18:47:02.744 * RDB: 0 MB of memory used by copy-on-write 54721:M 08 Oct 18:47:02.835 * Background saving terminated with success
Redis的AOF存储方式
aof持久化存储会把用户每次的操作都记录到文件中
# 动态开启和关闭aof [[email protected] ~]# redis-cli -h 127.0.0.1 config set appendonly yes # 开启aof OK [[email protected] ~]# redis-cli -h 127.0.0.1 config rewrite OK [[email protected] ~]# redis-cli -h 127.0.0.1 config set appendonly no # 关闭aof OK [[email protected] ~]# redis-cli -h 127.0.0.1 config rewrite OK
写入数据, 查看aof文件
[[email protected] ~]# cd /data/redis/ [[email protected] redis]# ls appendonly.aof dump.rdb redis.log redis.pid [[email protected] redis]# du -sh appendonly.aof 460K appendonly.aof [[email protected] redis]# du -sh dump.rdb 236K dump.rdb # 写入数据 [[email protected] redis]# for line in `seq -w 100`;do redis-cli set key_${line} value1_${line};done # 查看aof和rdb文件大小 [[email protected] redis]# du -sh appendonly.aof 960K appendonly.aof [[email protected] redis]# du -sh dump.rdb 236K dump.rdb
重写aof文件 , 整理相同的key , 写入最后的有效值
执行AOF文件重写操作会重新创建一个当前AOF文件的体积优化版本
即使BGREWRITEAOF执行失败,也不会有任何数据丢失,因为旧的AOF文件在BGREWRITEAOF成功之前不会被修改
重写操作只会在没有其他持久化工作在后台执行时被触发
从Redis2.4开始,AOF重写由Redis自行触发,BGREWRITEAOF仅仅用于手动触发重写操作
[[email protected] redis]# > appendonly.aof # 清空aof文件 [[email protected] redis]# ll 总用量 252 -rw-r--r--. 1 root root 0 10月 8 19:00 appendonly.aof -rw-r--r--. 1 root root 242163 10月 8 18:59 dump.rdb -rw-r--r--. 1 root root 5654 10月 8 18:59 redis.log -rw-r--r--. 1 root root 6 10月 8 16:08 redis.pid [[email protected] redis]# redis-cli bgrewriteaof # 手动触发aof重写 Background append only file rewriting started [[email protected] redis]# ll 总用量 716 -rw-r--r--. 1 root root 474323 10月 8 19:00 appendonly.aof # redis里的所有数据会被重新写入aof -rw-r--r--. 1 root root 242163 10月 8 18:59 dump.rdb -rw-r--r--. 1 root root 6395 10月 8 19:00 redis.log -rw-r--r--. 1 root root 6 10月 8 16:08 redis.pid [[email protected] redis]# > appendonly.aof [[email protected] redis]# ll 总用量 252 -rw-r--r--. 1 root root 0 10月 8 19:01 appendonly.aof -rw-r--r--. 1 root root 242163 10月 8 18:59 dump.rdb -rw-r--r--. 1 root root 6395 10月 8 19:00 redis.log -rw-r--r--. 1 root root 6 10月 8 16:08 redis.pid [[email protected] redis]# redis-cli set weihan mingming OK [[email protected] redis]# ll 总用量 256 -rw-r--r--. 1 root root 39 10月 8 19:01 appendonly.aof -rw-r--r--. 1 root root 242163 10月 8 18:59 dump.rdb -rw-r--r--. 1 root root 6395 10月 8 19:00 redis.log -rw-r--r--. 1 root root 6 10月 8 16:08 redis.pid [[email protected] redis]# cat appendonly.aof *3 $3 set $6 weihan $8 mingming [[email protected] redis]# redis-cli del weihan mingming (integer) 1 [[email protected] redis]# cat appendonly.aof *3 $3 set $6 weihan $8 mingming *3 $3 del $6 weihan $8 mingming [[email protected] redis]# ll 总用量 256 -rw-r--r--. 1 root root 78 10月 8 19:03 appendonly.aof -rw-r--r--. 1 root root 242180 10月 8 19:02 dump.rdb -rw-r--r--. 1 root root 6721 10月 8 19:02 redis.log -rw-r--r--. 1 root root 6 10月 8 16:08 redis.pid
我们向redis添加了一个key,又删除了这个key,redis数据库从本质上来说并没有新增任何数据 但是aof文件仍旧把操作都给记录了 这样就会导致aof文件最终会非常大,所以aof文件的优化,就是让aof文件进行重写,只记录数据的增量部分 如此aof文件就小很多了
aof配置自动rewrite机制
[[email protected] redis]# cd /usr/local/redis/conf/ [[email protected] conf]# vim redis.conf auto-aof-rewrite-percentage 100 # 默认100%,也就是aof增加一倍后考虑rewrite,两个条件要同时满足 auto-aof-rewrite-min-size 64mb # 默认64mb,也就是aof达到64M后考虑rewirte,两个条件要同时满足 # 获取aof-rewrite配置 [[email protected] conf]# redis-cli config get auto-aof-rewrite* 1) "auto-aof-rewrite-percentage" 2) "100" 3) "auto-aof-rewrite-min-size" 4) "67108864" # 进行aof自动重写 [[email protected] conf]# redis-cli config set auto-aof-rewrite-min-size 100000 OK [[email protected] conf]# redis-cli config get auto-aof-rewrite* 1) "auto-aof-rewrite-percentage" 2) "100" 3) "auto-aof-rewrite-min-size" 4) "100000" [[email protected] conf]# redis-cli config rewrite OK [[email protected] conf]# cd /data/redis/ [[email protected] redis]# > appendonly.aof [[email protected] redis]# du -sh appendonly.aof 0K appendonly.aof [[email protected] redis]# for line in `seq -w 1000`;do redis-cli set key2_${line} value2_${line};done [[email protected] redis]# du -sh appendonly.aof 48K appendonly.aof [[email protected] redis]# for line in `seq -w 1000`;do redis-cli set key2_${line} value2_${line};done [[email protected] redis]# du -sh appendonly.aof 128K appendonly.aof [[email protected] redis]# du -sh appendonly.aof 92K appendonly.aof # 自动触发了aof重写机制
Redis的删除算法
# Redis的键值设置有效期 , 过期自动删除
redis-cli flushall命令 # 手动清空redis里所有数据 [[email protected] redis]# redis-cli set name weihan OK [[email protected] redis]# redis-cli ttl name (integer) -1 # -1代表key永不过期 [[email protected] redis]# redis-cli expire name 10 # 设定key过期时间为10s (integer) 1 [[email protected] redis]# redis-cli ttl name # 查看key剩余的存活时间 (integer) 9 [[email protected] redis]# redis-cli ttl name (integer) 7 [[email protected] redis]# redis-cli ttl name (integer) 5 [[email protected] redis]# redis-cli ttl name (integer) 3 [[email protected] redis]# redis-cli ttl name (integer) 1 [[email protected] redis]# redis-cli ttl name (integer) -2 [[email protected] redis]# redis-cli get name # key已经因为过期被删除 (nil)
Redis的最大内存设置
[[email protected] redis]# redis-cli config get maxmemory 1) "maxmemory" 2) "0" # 默认对内存无限制 [[email protected] redis]# redis-cli config set maxmemory 1M # 设置限制为1M OK [[email protected] redis]# redis-cli config get maxmemory 1) "maxmemory" 2) "1000000"
Redis的内存清理算法
volatile-lru : 使用LRU算法删除键(key需要设置过期时间)
volatile-random : 随机删除键(key需要设置过期时间)
volatile-ttl : 删除ttl最小的键(key需要设置过期时间)
allkeys-lru : 使用LRU算法删除键(所有key)
allkeys-random : 随机删除键(所有key)
noeviction : 不进行任何的操作,只返回错误,默认
[[email protected] redis]# redis-cli config get maxmemory-policy 1) "maxmemory-policy" 2) "noeviction" # 默认算法 # 模拟内存溢出 [[email protected] redis]# for line in `seq -w 10000`;do redis-cli set key_${line} value_${line};done [[email protected] redis]# redis-cli set name weihan (error) OOM command not allowed when used memory > ‘maxmemory‘. [[email protected] redis]# redis-cli 127.0.0.1:6379> set name weihan (error) OOM command not allowed when used memory > ‘maxmemory‘. # 测试会报错
设置删除算法
# 将删除算法设置为volatile-lru [[email protected] redis]# redis-cli config get maxmemory-policy 1) "maxmemory-policy" 2) "noeviction" [[email protected] redis]# redis-cli config set maxmemory-policy volatile-lru OK [[email protected] redis]# redis-cli config get maxmemory-policy 1) "maxmemory-policy" 2) "volatile-lru" [[email protected] redis]# redis-cli config rewrite OK [[email protected] redis]# redis-cli get key_00111 "value1_00111" [[email protected] redis]# redis-cli expire key_00111 3600 (integer) 1 [[email protected] redis]# redis-cli ttl key_00111 (integer) -2 [[email protected] redis]# redis-cli get key_00111 (nil)
# 测试发现 volatile-lru算法可以实现当内存达到了预设的最大值后,会优先删除有过期时间的key
Redis禁用屏蔽危险命令
FLUSHALL和FLUSHDB会清除redis的数据,比较危险
KEYS在键过多的时候使用会阻塞业务请求
# 配置代码如下, 写入配置文件即可,此配置无法平滑更新 [[email protected] redis]# vim /usr/local/redis/conf/redis.conf rename-command FLUSHALL "" # 将命令改名成空 rename-command FLUSHDB "" # 将命令改名成空 rename-command KEYS "" # 将命令改名成空 [[email protected] redis]# redis-cli shutdown [[email protected] redis]# redis-server /usr/local/redis/conf/redis.conf [[email protected] redis]# redis-cli flushall (error) ERR unknown command ‘flushall‘ [[email protected] redis]# redis-cli flushdb (error) ERR unknown command ‘flushdb‘ [[email protected] redis]# redis-cli 127.0.0.1:6379> keys * (error) ERR unknown command ‘keys‘
以上是关于Redis4.0 之持久化存储的主要内容,如果未能解决你的问题,请参考以下文章