KittyDaddy's blog KittyDaddy's blog
首页
  • 学习笔记

    • 《Java基础》
    • 《常用设计模式》
    • 《MYSQL》
    • 《GO语言》
    • 《Spring源码解读》
  • 微服务解决方案

    • 锁的演化
    • 简单限流方案
    • 海量数据切分
  • 中间件

    • Nginx
    • MQ
    • Redis
    • Keepalived
  • 面试记
  • 杂文
  • 开源
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

老猫

万物皆系统
首页
  • 学习笔记

    • 《Java基础》
    • 《常用设计模式》
    • 《MYSQL》
    • 《GO语言》
    • 《Spring源码解读》
  • 微服务解决方案

    • 锁的演化
    • 简单限流方案
    • 海量数据切分
  • 中间件

    • Nginx
    • MQ
    • Redis
    • Keepalived
  • 面试记
  • 杂文
  • 开源
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Redis安装教程
  • Redis操作集合
  • Redis持久方式
  • Redis进阶
    • 《Redis》
    老猫
    2020-10-20
    目录

    Redis进阶

    # Redis缓存过期处理以及内存淘汰机制

    相信大家对照着之前Redis的操作集合进行了相关的练习。大家在之前的操作集合中应该注意到了这个操作指令(expire key time:给某个key值设置过期时间)大家都知道用完这个指令之后,当前的那个key值会在规定的时间内失效。然而当其真正失效之后,这个值真的会立刻在内存中消失么?答案是否定的。

    # 内存过期处理:

    针对上述设置完过期命令的key值,其实在redis本身内部处理的时候会有两套机制:

    1. (主动)定期删除:

      定期删除主要说的是redis本身具有检测机制,在配置文件中默认为十秒进行一次扫描,如果发现相关的Key已经过期,那么程序会自动删除相关的key值已经value的信息。

      具体的配置信息我们也可以看一下,具体如下:

      定期删除配置

      这个配置表示一秒钟之内会检测10次(默认区间是1-500次),检测到之后就会被删除,当然我们也可以将相关的配置调大,但是这样的话虽然加快了删除内存值,但是同时也会比较多的占用cpu,内存释放较快。

    2. (被动)惰性删除:

      当被访问的时候如果发现相关的key已经过期,那么才会进行删除操作,优点就是可以降低cpu的损耗,但是相关的内存会随着时间而增加。

    # 内存淘汰机制:

    内存淘汰机制主要指的是linux服务器可以针对不同的应用进行相对应的内存上的管理。例如,检测到某个应用占用内存比较大的时候可以做到自动释放内存。因此redis就有一套专门配合内存淘汰机制的配置:MEMERY MANAGEMENT

    当我们去配置文件进行搜索的时候,会发现这个配置存在以下几种内存淘汰机制的算法,具体如下:

    • noeviction:旧缓存永不过期,新缓存设置不了,返回错误
    • allkeys-lru:清除最少用的旧缓存,然后保存新的缓存(推荐使用)
    • allkeys-random:在所有的缓存中随机删除(不推荐)
    • volatile-lru:在那些设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存
    • volatile-random:在那些设置了expire过期时间的缓存中,随机删除缓存
    • volatile-ttl:在那些设置了expire过期时间的缓存中,删除即将过期的

    # Redis 的哨兵模式

    Redis是存在主从同步的特性的,具体主从同步的方式也有两种,一种是基于磁盘的主从同步,主要是通过RDB的形式进行文件传输然后实现同步,还有一种是无磁盘化的同步模式,无磁盘化的同步模式主要通过网络。

    这里面问题来了,当我们的redis的Master节点发生故障的时候,我们如何来保证其高可用?

    # 什么是哨兵模式?

    Sentinel(哨兵)是用于监控Redis集群中Master状态的工具,是Redis的高可用解决方案,哨兵可以监视一个或者多个master服务以及这些master服务的所有从服务,当某个master服务宕机之后,会把这个master的某个服务升级为master来替代已经宕机的master继续工作。

    哨兵模式

    # 配置哨兵监控master

    创建并且配置sentinel.conf

    • 普通配置

      port 26379
      pidfile "/usr/local/redis/sentinel/redis-sentinel.pid"
      dir "/usr/local/redis/sentinel"
      daemonize yes
      protected-mode no
      logfile "/usr/local/redis/sentinel/redis-sentinel.log"
      
      1
      2
      3
      4
      5
      6
    • 核心配置

      # 配置哨兵
      sentinel monitor mymaster 127.0.0.1 6379 2
      # 密码
      sentinel auth-pass <master-name> <password>
      # master被sentinel认定为失效的间隔时间
      sentinel down-after-milliseconds mymaster 30000
      # 剩余的slaves重新和新的master做同步的并行个数
      sentinel parallel-syncs mymaster 1
      # 主备切换的超时时间,哨兵要去做故障转移,这个时候哨兵也是一个进程,如果他没有去执行,超过这个时间后,会由其他的哨兵来处理
      sentinel failover-timeout mymaster 180000
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
    • 启动

        redis-sentinel sentinel.conf
      
      1

      测试方法:当master挂了,观察slave是否成为master,当master重新恢复之后,slave的状态。

    #Redis#Redis进阶
    上次更新: 2022/11/30, 00:06:25
    Redis持久方式

    ← Redis持久方式

    最近更新
    01
    让大龄程序员欲罢不能的事儿
    09-23
    02
    运营明明设置了活动开始时间,为什么到点没生效?聊聊动态定时任务
    07-30
    03
    不是,大哥,咱这小门小户的,别搞我CDN流量啊
    07-25
    更多文章>
    Theme by Vdoing | Copyright © 2020-2024 Kitty Daddy | License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式