如何实现Redis数据持久化以及内存管理之缓存过期机制
如何实现Redis数据持久化,Redis内存管理之缓存过期机制
如何实现Redis数据持久化
如果我们Redis宕机内存中的数据没了,这个时候会发生什么?就会导致原来所有从Redis读的请求都去到DB了
确保我们重启完Redis还能将绝大部分的数据恢复进内存,怎么办?
是不是就要把内存 数据保存到磁盘便于恢复
1. RDB模式
就是每隔一段时间,定时保存,有点像MySQL中进程用到的mysqldump
默认redis就是开启RDB的
优 势
-
每隔一段时间,全量备份
-
灾备简单,dump.rdb文件拷走就完了
-
在RDB备份的时候会fork一个新进程来操作,这就不影响提供读写进程的效率了
劣 势
-
当备份后和故障间这段时间的数据无法保存
-
新fork的子进程会从父进程copy全部的内存数据(这个时候内存会瞬间膨胀两倍),会造成CPU和内存负担
-
由于是定时的备份,所以时效差
# after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed save 900 1 # 在900秒内1个key被更新,就触发一次RDB备份 save 300 10 save 60 10000 # 那这个rdb文件放在哪呢? dir /usr/local/redis-6379 #可以通过 config get dir dbfilename dump.rdb #rdb的文件名 # yes : 如果save过程中出错,则停止redis服务的写操作 stop-writes-on-bgsave-error yes
注意的点:执行的备份命令是bgsave / 如果是使用save会阻塞redis的主进程
2. AOF模式
有点类似于mysql的binlog,他是把我们所有Redis的写操作命令记录下来了
AOF的特点
-
以日志的形式来记录用于的写操作
-
文件是以追加的方式而不是修改的方式
-
redis的aof的恢复其实就是把文件从头到位执行一遍
优势
-
每秒数据的记录和操作
-
aof的文件也是一个,所以当文件比较大的时候会触发aof文件重写机制进行文件压缩
劣势
-
同样的数据,AOF比RDB大的多
-
aof同步的时候比rdb慢的多
-
AOF重写的时候也会fork一个进程来操作
# AOF默认是关闭的,需要手工启用 appendonly yes # AOF文件名 appendfilename "appendonly.aof" # 这就是AOF的持久化频率 # everysec:每秒备份一次,推荐使用 # always:每次操作都备份 appendfsync everysec # 触发重写的两个条件 # 当现有aof文件比上次大了100%,就触发重写 auto-aof-rewrite-percentage 100 # 当现有文件大于64mb的时候,就触发重写 # 这两个条件同时满足才会触发重写 auto-aof-rewrite-min-size 64mb #变成100mb,要等到200mb才触发重写
重启redis不要使用kill进程的方法,这样会导致redis当前数据无法写入aof或rdb
使用客户端的shutdown来安全关闭redis
3. 持久化化文件是如何恢复的
-
RDB文件只需要放在dir目录下我们的Redis会在重启后自动加载
-
AOF文件也是只需要放在dir目录下我们的Redis会在重启后自动加载
-
RDB和AOF不互相通信的
-
AOF启用后,Redis优先选择AOF
如果线上没有开启aof,这个时候需要开启,不要进行配置修改后重启来生成aof文件
使用内部命令先开启config set appendonly yes
再去redis.conf里把appendonly 设置成yes
Redis内存管理之缓存过期机制
-
主动删除
-
默认1秒巡检10次定义了expire的key,如果过期就删除
-
可以设置redis.conf hz 10
-
惰性删除
-
如果你在访问的时候Redis发现这个key过期,就会返回nil并删除
-
是调用内部的expireIfNeeded()这个方法
如果超时比较久并且不超时的key比较多,redis内存满的怎么办?
这就Redis内存缓存的管理机制
# maxmemory <bytes> 限定主机的可写入最大内存阀值,还要给系统留一点 # redis可写内存逻辑上是决定于主从结构中最小主机的内存 master 8g,slave 4g # 内存淘汰的策略 # maxmemory-policy noeviction //这是默认,旧缓存用不过期,如果写满,新的缓存则无法写入 # volatile-lru -> Evict using approximated LRU among the keys with an expire set. # allkeys-lru //建议设置这个,如果内存满了,清除最旧最少用的缓存 # volatile-lfu -> Evict using approximated LFU among the keys with an expire set. # allkeys-lfu -> Evict any key using approximated LFU. # volatile-random -> Remove a random key among the ones with an expire set. # allkeys-random -> Remove a random key, any key. # volatile-ttl -> Remove the key with the nearest expire time (minor TTL) # noeviction -> Don't evict anything, just return an error on write operations.
Redis高可用模型主从架构搭建
为什么要使用主从
-
HA:高可用
-
高并发:读写分离
建议的主从结构,最好是1 master,2 slave
# 单机安装参考前面 # slave的配置 # master的配置 replicaof 127.0.0.1 6379 masterauth icoding 127.0.0.1:6379>info replication
但现在如何主机宕机了,redis是不会自动将master切换大其中一台slave上的
如果需要本期图文教程的视频教程,请关注“艾编程”公众号,回复关键词“Redis”或者“分布式缓存”,看本期课程的视频+图文教程,还能收获更多哦!