1、什么是redis持久化?
“因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。”所以,redis内存中的数据会伴随着服务器的退出而消失。因此。为了保存redis中的数据,我们需要将其写入磁盘。
2、redis支持那些持久化方式?
2.1、RDB (RedisDataBase)
RDB持久性按指定的时间间隔执行数据集的时间点快照。 默认情况下,RDB生成在redis的安装目录下。
什么叫快照呢?官网上是这么介绍的:
配置Redis,使其在数据集中至少有M个更改时每N秒保存一次数据集,也可以手动调用SAVE或BGSAVE命令。
例如,如果更改了至少1000个键,此配置将使Redis每60秒自动将数据集转储到磁盘上。
(也就是60s之内,redis中有1000次值的修改,则立即出发rdb持久化,将其数据写入rdb文件)
即更改redis.conf配置文件,设置值 save 60 1000
这种策略就叫做快照
redis生成的rdb文件为 dump.rdb。其文件结构如下:
其中,根据type类型的不同,value的储存方式也会有很大区别。
2.2、AOF (AppendOnlyFile)
AOF持久性会记录服务器接收的每个写入操作,这些操作将在服务器启动时再次播放,以重建原始数据集。使用与Redis协议本身相同的格式记录命令,并且采用仅追加方式
AOF文件的三种写入方式:
aways 每个事件循环都要将缓冲区内容同步写入aof文件,并save文件
everysec 每个事件循环都要将缓冲区内容写入aof文件,并每隔一秒都要在子线程中save文件
no 每个事件循环都要将缓存区内容写入aof文件,但不保存
AOF文件载入过程
AOF的重写
“因为AOF持久化是通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的AOF文件很可能对Redis服务器、甚至整个宿主计算机造成影响,并且AOF文件的体积越大,使用AOF文件来进行数据还原所需的时间就越多”
所以Redis提供了aof文件重写来解决aof文件膨胀的问题。
aof文件重写过程
aof重写触发机制?
Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
3、总结
因为RDB文件只用作后备用途,在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。
如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。
如果不Enable AOF ,仅靠Master-Slave Replication (redis的主从复制) 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。
1、什么是redis持久化?
“因为Redis是内存数据库,它将自己的数据库状态储存在内存里面,所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面,那么一旦服务器进程退出,服务器中的数据库状态也会消失不见。”所以,redis内存中的数据会伴随着服务器的退出而消失。因此。为了保存redis中的数据,我们需要将其写入磁盘。
2、redis支持那些持久化方式?
2.1、RDB (RedisDataBase)
RDB持久性按指定的时间间隔执行数据集的时间点快照。 默认情况下,RDB生成在redis的安装目录下。
什么叫快照呢?官网上是这么介绍的:
配置Redis,使其在数据集中至少有M个更改时每N秒保存一次数据集,也可以手动调用SAVE或BGSAVE命令。
例如,如果更改了至少1000个键,此配置将使Redis每60秒自动将数据集转储到磁盘上。
(也就是60s之内,redis中有1000次值的修改,则立即出发rdb持久化,将其数据写入rdb文件)
即更改redis.conf配置文件,设置值 save 60 1000
这种策略就叫做快照
redis生成的rdb文件为 dump.rdb。其文件结构如下:
其中,根据type类型的不同,value的储存方式也会有很大区别。
2.2、AOF (AppendOnlyFile)
AOF持久性会记录服务器接收的每个写入操作,这些操作将在服务器启动时再次播放,以重建原始数据集。使用与Redis协议本身相同的格式记录命令,并且采用仅追加方式
AOF文件的三种写入方式:
aways 每个事件循环都要将缓冲区内容同步写入aof文件,并save文件
everysec 每个事件循环都要将缓冲区内容写入aof文件,并每隔一秒都要在子线程中save文件
no 每个事件循环都要将缓存区内容写入aof文件,但不保存
AOF文件载入过程
AOF的重写
“因为AOF持久化是通过保存被执行的写命令来记录数据库状态的,所以随着服务器运行时间的流逝,AOF文件中的内容会越来越多,文件的体积也会越来越大,如果不加以控制的话,体积过大的AOF文件很可能对Redis服务器、甚至整个宿主计算机造成影响,并且AOF文件的体积越大,使用AOF文件来进行数据还原所需的时间就越多”
所以Redis提供了aof文件重写来解决aof文件膨胀的问题。
aof文件重写过程
aof重写触发机制?
Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍且文件大于64M时触发
3、总结
因为RDB文件只用作后备用途,在Slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。
如果Enalbe AOF,好处是在最恶劣情况下也只会丢失不超过两秒数据,启动脚本较简单只load自己的AOF文件就可以了。代价一是带来了持续的IO,二是AOF rewrite的最后将rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设到5G以上。默认超过原大小100%大小时重写可以改到适当的数值。
如果不Enable AOF ,仅靠Master-Slave Replication (redis的主从复制) 实现高可用性也可以。能省掉一大笔IO也减少了rewrite时带来的系统波动。代价是如果Master/Slave同时倒掉,会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,载入较新的那个。
Redis单机数据库
“Redis服务器的所有数据库都保存在redisServer.db数组中,而数据库的数量则由redisServer.dbnum属性保存。
·客户端通过修改目标数据库指针,让它指向redisServer.db数组中的不同元素来切换不同的数据库。(select 0-15)
·数据库主要由dict和expires两个字典构成,其中dict字典负责保存键值对,而expires字典则负责保存键的过期时间。
“·数据库的键总是一个字符串对象,而值则可以是任意一种Redis对象类型,包括字符串对象、哈希表对象、集合对象、列表对象和有序集合对象,分别对应字符串键、哈希表键、集合键、列表键和有序集合键。
·expires字典的键指向数据库中的某个键,而值则记录了数据库键的过期时间,过期时间是一个以毫秒为单位的UNIX时间戳。
·Redis使用惰性删除和定期删除两种策略来删除过期的键:惰性删除策略只在碰到过期键时才进行删除操作,定期删除策略则每隔一段时间主动查找并删除过期键。”
“·执行SAVE命令或者BGSAVE命令所产生的新RDB文件不会包含已经过期的键。
·执行BGREWRITEAOF命令所产生的重写AOF文件不会包含已经过期的键。
·当主服务器删除一个过期键之后,它会向所有从服务器发送一条DEL命令,显式地删除过期键。
·从服务器即使发现过期键也不会自作主张地删除它,而是等待主节点发来DEL命令,这种统一、中心化的过期键删除策略可以保证主从服务器数据的一致性。”
“·当Redis命令对数据库进行修改之后,服务器会根据配置向客户端发送数据库通知。” redis的客户端必须订阅相应的事件(keyspace或者keyevent与具体的key值)