概述前段时间有朋友问起Redis内存淘汰机制和持久化机制的原理。今天抽空整理出来分享给大家。内容如下:数据可恢复)Redis内存淘汰机制假设生产环境的MySQL数据库有1000w的数据,Redis中只存储了10w的数据。如何保证Redis中的数据是热数据?Redis提供了6种数据淘汰策略:volatile-lru:从设置了过期时间的数据集(server.db[i].expires)中挑选出最近最少使用的数据。volatile-ttl:从设置过期时间的数据集(server.db[i].expires)中选择将要过期的数据。volatile-random:从数据集(server.db[i].expires)中随机选择数据淘汰,设置了过期时间。allkeys-lru:当内存不足以容纳新写入的数据时,在key空间中,移除最近最少使用的key(这个是最常用的)。allkeys-random:从数据集(server.db[i].dict)中随机选择数据淘汰。no-enviction:禁止数据逐出,即当内存不足以容纳新写入的数据时,新的写入操作会报错。这应该没有人使用!使用这6种数据淘汰策略,保证Redis中的数据是热点数据。Redis的持久化机制经常会遇到服务器挂掉或者不小心杀掉进程的情况。那么如何保证Redis挂掉再重启后数据能够恢复呢?其实我们只需要持久化数据,即将内存中的数据写入硬盘即可。大多数原因是为了以后重用数据(比如重启机器,机器故障后恢复数据),或者在系统出现故障时将数据备份到远程位置。Redis区别于Memcached的一个重要点是Redis支持持久化,支持两种不同的持久化操作。Redis的一种持久化方式称为快照(snapshotting,RDB),另一种方式是append-onlyfile(AOF)。下面说说这两种持久化方式。快照(snapshotting)持久化(RDB)Redis可以创建快照来获取某个时间点存储在内存中的数据的副本。Redis创建快照后,可以备份快照,将快照复制到其他服务器,创建一个数据相同的服务器副本(Redis主从结构,主要用于提高Redis性能),快照可以留在原地以在使用时重新启动服务器。快照持久化是Redis默认采用的持久化方式,在redis.conf配置文件中默认配置:save9001#900秒(15分钟)后,如果至少有一个key发生变化,Redis会自动触发BGSAVE命令创建快照。save30010#300秒(5分钟)后,如果至少有10个key发生变化,Redis会自动触发BGSAVE命令创建快照。save6010000#60秒(1分钟)后,如果至少有10000个key发生变化,Redis会自动触发BGSAVE命令创建快照。与快照持久化相比,AOF(append-onlyfile)持久化具有更好的实时性,因此成为了主流的持久化方案。Redis默认不开启AOF(appendonlyfile)持久化,可以通过appendonly参数开启:appendonlyyes开启AOF持久化后,Redis会在每次有改变Redis中数据的命令时将命令写入硬盘中执行AOF文件。AOF文件的保存位置与RDB文件相同,均由dir参数设置,默认文件名为appendonly.aof。Redis配置文件中存在三种不同的AOF持久化方式,分别是:appendfsyncalways#每次发生数据修改,都会写入AOF文件,会严重拖慢Redis的速度appendfsynceverysec#每秒同步一次,显式同步multiplewritecommandstohardappendfsyncno#让操作系统决定何时进行同步为了平衡数据和写入性能,用户可以考虑appendfsynceverysec选项让Redis每秒同步一次AOF文件,Redis性能几乎不受影响影响。而这样一来,即使系统崩溃,用户最多也只会丢失一秒内产生的数据。当硬盘忙于执行写操作时,Redis也会优雅地放慢速度以适应硬盘的最大写入速度。Redis4.0对持久化机制的优化Redis4.0开始支持RDB和AOF的混合持久化(默认关闭,可通过配置项aof-use-rdb-preamble开启)。如果开启混合持久化,AOF重写时,RDB的内容会直接写入AOF文件的开头。这样做的好处是可以结合RDB和AOF的优点,加载速度快,避免丢失太多数据。当然,也有缺点。AOF中的RDB部分是压缩格式,不再是AOF格式,可读性差。
