前言:Redis的持久化机制和缓存淘汰策略在各大厂面试题中经常有出现,除此之外在一些场景下,了解Reids的持久化机制和缓存淘汰策略可以帮助我们更好的设计技术方案,以及解决一些实际问题,所以本篇再深入聊一聊这些不常用的知识点,以此温故知新.
目录
1.Redis的持久化机制
1.1Redis有哪些持久化机制
1.2RDB的优缺点
1.3AOF的优缺点
1.4如何选择
1.5如何操作
1.5.1RDB
1.5.2AOF
2.Redis的缓存淘汰策略
1.1Redis的缓存淘汰策略有哪些?
1.2适用场景
1.3如何开启指定的缓存淘汰策略
我们知道,Redis的数据是存储在内存中的,以此来保证极高的IO性能,但内存与磁盘相比最大的不足就是内存中的数据无法持久化,一旦系统断电,故障,重启...内存中的数据就丢失了,在一些数据安全要求较高的场景下,就需要提供一些持久化机制来保证数据安全.
Reids目前提供了两种持久化方式,分别是RDB和AOF.
RDB:是Redis默认的持久化方式,是一种内存快照的方式,每隔一段时间会进行一次数据备份,备份时Reids主进程会fork一个子进程,然后由子进程负责将内存中的数据副本写入.rdb文件中,恢复时可以将.rdb文件中的内容导入内存中.
AOF:AOF是以记录日志的方式实现数据备份,类似于Myslq的binlog,把每次对redis的操作关键信息追加到.aof文件中,恢复时可以通过该文件进行数据恢复.
优点:RDB采取内存快照的方式,生成内存快照的间隔时间也可以配置,所以比较适合数据备份和灾难恢复,比如我可以按天生成备份文件,然后可以指定恢复到某一天的数据.而且采用快照进行恢复数据时,速度比较AOF快.
缺点:如果在间隔时间段内,内存中数据太多,生成快照时需要占用较多内存,会导致备份期间系统内存占用飙升,影响性能,除此之外RDB的持久化不适合强数据安全要求的场景,如果在生成快照之前系统宕机,就会丢失最后一次快照修改中的所有内容.
优点:AOF的数据持久化更可靠,如果采用同步方式,可以保证数据无丢失.
缺点:AOF的日志文件是采用追加的方式,所以日积月累之后AOF文件会很大,占用较多磁盘文件,另外AOF的数据恢复速度要比RDB慢,特别是在数据量较大时.
如何选择还是要结合业务场景,如果对数据可靠性要求不高,建议采用默认的RDB方式持久化,好处多多,大部分场景适用.如果对数据可靠性有硬性要求,建议采用AOF进行数据持久化.当然也可以采用两者相结合的方式,扬长避短,这点有点类似于Mysql的热备和冷备.
RDB的开启可以通过自动触发和手动触发来实现,一般会采用自动触发.
#save s n
save 100 10
其中save表示开启rdb持久化,s为生成快照的时间间隔,单位是秒,n是key发生改变的次数.
上面这段配置表示:每100秒内,如果有10个及以上key发生改变,则生成一次快照.
如果不想开启RDB 则可以把配置改为 save "" ,用空字符串来表示.
sava:直接执行,会触发Redis执行RDB持久化,过程阻塞,直到持久化完成才可以正常对外提供服务,所以Redis提供了另外一种方式.
bgsave:通过主进程fork子进程,由子进程进行持久化,这样可以一边对外提供服务,一边持久化数据.
AOF的开启可以修改redis.conf中的appendonly参数为yes,即可.长期开启AOF可能会使AOF持久化文件过大,此时可以手动执行命令bgrewriteaof,来压缩.当然也可以采用配置的方式(推荐)
auto-aof-rewrite-percentage 100 (一倍)
auto-aof-rewrite-min-size 64mb
表示当aof文件的大小增加一倍时,触发一次aof重写,当aof文件的大小超过64m时触发aof重写.
提到淘汰策略,先来看一下常见的淘汰算法
Redis提供的淘汰策略:
在不清楚热点key以怎样的规律分布,且数据访问频率有明显区分,一部分数据访问频率高,一部分数据访问频率低,建议采用allkeys-lru淘汰策略;
如果对应用的Key访问毫无规律,则采用allkeys-random;
在redis安装目录下的conf目录找到redis.conf,在里面设置最大内存限制,当存储数据总量达到该限制大小后就会开始淘汰数据
#maxmemory xxx bytes 最大内存数 单位是字节
maxmemory 102400
淘汰机制的设置同样也是修改redis.conf,将maxmemory-policy 根据业务场景指定为上面介绍的6种方式之一即可。
maxmemory-policy noeviction
关于redis的持久化机制和缓存淘汰策略就聊这么多,如有漏掉或者不正之处恳请留言指正。