前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何实现Redis数据持久化以及内存管理之缓存过期机制

如何实现Redis数据持久化以及内存管理之缓存过期机制

作者头像
艾编程
发布2020-06-10 09:51:20
8830
发布2020-06-10 09:51:20
举报
文章被收录于专栏:艾编程艾编程

如何实现Redis数据持久化,Redis内存管理之缓存过期机制

如何实现Redis数据持久化

如果我们Redis宕机内存中的数据没了,这个时候会发生什么?就会导致原来所有从Redis读的请求都去到DB了

确保我们重启完Redis还能将绝大部分的数据恢复进内存,怎么办?

是不是就要把内存 数据保存到磁盘便于恢复

1. RDB模式

就是每隔一段时间,定时保存,有点像MySQL中进程用到的mysqldump

默认redis就是开启RDB的

优 势

  1. 每隔一段时间,全量备份
  2. 灾备简单,dump.rdb文件拷走就完了
  3. 在RDB备份的时候会fork一个新进程来操作,这就不影响提供读写进程的效率了

劣 势

  1. 当备份后和故障间这段时间的数据无法保存
  2. 新fork的子进程会从父进程copy全部的内存数据(这个时候内存会瞬间膨胀两倍),会造成CPU和内存负担
  3. 由于是定时的备份,所以时效差
#   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的特点

  1. 以日志的形式来记录用于的写操作
  2. 文件是以追加的方式而不是修改的方式
  3. 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”或者“分布式缓存”,看本期课程的视频+图文教程,还能收获更多哦! 
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何实现Redis数据持久化
    • 1. RDB模式
      • 优 势
      • 劣 势
    • 2. AOF模式
      • AOF的特点
      • 优势
      • 劣势
    • 3. 持久化化文件是如何恢复的
    • Redis内存管理之缓存过期机制
      • 主动删除
        • 惰性删除
          • Redis高可用模型主从架构搭建
          相关产品与服务
          云数据库 Redis
          腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档