如何实现Redis数据持久化,Redis内存管理之缓存过期机制
如果我们Redis宕机内存中的数据没了,这个时候会发生什么?就会导致原来所有从Redis读的请求都去到DB了
确保我们重启完Redis还能将绝大部分的数据恢复进内存,怎么办?
是不是就要把内存 数据保存到磁盘便于恢复
就是每隔一段时间,定时保存,有点像MySQL中进程用到的mysqldump
默认redis就是开启RDB的
# 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的主进程
有点类似于mysql的binlog,他是把我们所有Redis的写操作命令记录下来了
# 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
如果线上没有开启aof,这个时候需要开启,不要进行配置修改后重启来生成aof文件
使用内部命令先开启config set appendonly yes
再去redis.conf里把appendonly 设置成yes
默认1秒巡检10次定义了expire的key,如果过期就删除
可以设置redis.conf hz 10
如果超时比较久并且不超时的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.
为什么要使用主从
建议的主从结构,最好是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”或者“分布式缓存”,看本期课程的视频+图文教程,还能收获更多哦!