如何实现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”或者“分布式缓存”,看本期课程的视频+图文教程,还能收获更多哦! 
posted @ 2020-05-15 15:29  艾编程前端技术  阅读(482)  评论(0编辑  收藏  举报
友情链接: arry老师博客 艾编程教育 艾编程教育 关于我们 web前端学习路线 vscode视频教程全集