zoukankan      html  css  js  c++  java
  • 如何实现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”或者“分布式缓存”,看本期课程的视频+图文教程,还能收获更多哦! 
  • 相关阅读:
    bootstrap 菜鸟笔记
    OOCSS待解疑惑
    sass 菜鸟笔记
    WOW.js – 让页面滚动更有趣 初学者使用教程
    JAVA8 十大新特性详解
    数据库事务的四大特性以及事务的隔离级别
    java基础--泛型
    java基础之 泛型
    springboot的文件路径,配置文件
    maven使用心得
  • 原文地址:https://www.cnblogs.com/icodingedu/p/12895232.html
Copyright © 2011-2022 走看看