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‘

原文地址:https://www.cnblogs.com/bigdevilking/p/9757094.html

时间: 2024-11-07 15:42:24

Redis4.0 之持久化存储的相关文章

Redis4.0之持久化存储

一,redis概述与实验环境说明 1.1 什么是redis redis是一种内存型的NoSQL数据库,优点是快,常用来做缓存用 redis存储数据的方法是以key-value的形式 value类型支持字符串,列表,哈希等多种类型 1.2 环境说明 主机名 IP 用途 Redis01 10.1.1.146 Redis-master [[email protected] ~]# cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core) [

redis-4.0.14 cluster 配置实战

1.操作系统配置 切换到root用户修改配置sysctl.conf vim /etc/sysctl.conf # 添加配置: vm.max_map_count=655360 vm.overcommit_memory=1 net.core.somaxconn= 32767 fs.file-max=65535 # ulimit -n 最大文件描述符 65536 vim /etc/security/limits.conf # 添加 * soft nofile 65536 * hard nofile 6

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身

饿了么开源项目:便捷高效的Android数据持久化存储框架

版权所有.所有权利保留. 欢迎转载,转载时请注明出处: http://blog.csdn.net/xiaofei_it/article/details/51436972 Android应用开发时经常要对许多数据进行持久化存储,便于以后访问. 对于int.double.boolean这些基本数据,可以使用SharedPreference.对于一些对象,往SharedPreference里存储的时候需要使用序列化技术.如果对象很大,或者碰到列表.数组等结构,就必须使用数据库.而使用数据库比较麻烦,成

Redis4.0 主从复制(PSYN2.0)

Redis4.0版本相比原来3.x版本,增加了很多新特性,如模块化.PSYN2.0.非阻塞DEL和FLUSHALL/FLUSHDB.RDB-AOF混合持久化等功能.尤其是模块化功能,作者从七年前的redis1.0版本就开始谋划,终于在4.0版本发布了,所以版本号也就从3.x直接迭代到了4.0以表示版本变化之大.简单看了一下新版的PSYN2.0,虽然很多细节没搞清楚,但是大概流程倒是搞明白了. 一.主要流程 在新版的PSYN2.0中,相比原来的PSYN功能,最大的变化支持两种场景下的部分重同步,一

Swift - 使用Core Data进行数据持久化存储

一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象. 2,虽然其底层也是由类似于SQL的技术来实现,但我们不需要编写任何SQL语句,有点像Java开发中的Hibernate持久化框架 3,Core Data数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型. 4,与SQLite区别:只能取出整个实体记录,然后分解,

iOS开发之数据持久化存储

概论 数据持久化存储:所谓持久化存储就是将数据保存到硬盘中,使得应用程序或者机器在重启后可以访问之前保存的数据. 常见方式: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite3(数据库) CoreData(苹果基于数据库封装的持久化存储工具,这种方式效率不高,因为会帮我们动态生成很多重复的代码,我只有写XMPP的时候会用一下,因为XMPP里面的存储用的就是CoreData) 沙盒 说到持久化存储就不得不说一下苹果的沙盒机制,苹果的

数据持久化存储

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以下沙盒机制.iOS程序默认情况下只能访问程序自己的目录,这个目录被称为“沙盒”. 1.结构 既然沙盒就是一个文件夹,那就看看里面有什么吧.沙盒的目

日志缓冲必须被刷新持久化存储

日志缓冲必须被刷新持久化存储,以确保提交的事务完全被持久化了,如果和持久化相比更在乎性能,可以修改innodb_flush_log_at_trx_commit变量来控制日志缓冲拴心的频繁程度,可能的设置如下: 0  把日志缓冲写到日志文件,并且每秒钟刷新一次,但是事务提交时不做任何事. 1 将日志缓冲写到日志文件,并且每次提交事务都刷新到持久化存储,这是默认的(并且是最安全的)设置,该设置能保证不会丢失任何已经提交的事务,除非磁盘或操作系统是“伪”刷新的. 2 每次提交时把日志缓冲写到日志文件,