articleList

14-【高级篇】Redis6.X 服务端 info+config 实战和 key 淘汰算法

2025/03/16 posted in  Redis
Tags: 

第 1 集 Redis6.x 服务端配置 info 命令介绍-生产监控知识

简介: Redis6.x 服务端配置 info 命令介绍

  • info 命令介绍

    • 服务器的各种信息和统计数值

      Server:有关redis服务器的常规信息
        redis_mode:standalone                         # 运行模式,单机或者集群
        multiplexing_api:epoll                        # redis所使用的事件处理机制
        run_id:3abd26c33dfd059e87a0279defc4c96c13962ede # redis服务器的随机标识符(用于sentinel和集群)
        config_file:/usr/local/redis/conf/redis.conf       # 配置文件路径
      ​
      Clients:客户端连接部分
        connected_clients:10           # 已连接客户端的数量(不包括通过slave连接的客户端)
      
      Memory:内存消耗相关信息
        used_memory:874152  # 使用内存,以字节(byte)B为单位
        used_memory_human:853.66K # 以人类可读的格式返回 Redis 分配的内存总量
        used_memory_rss:2834432 # 系统给redis分配的内存即常驻内存,和top 、 ps 等命令的输出一致
        used_memory_rss_human:2.70M  # 以人类可读的格式返回系统redis分配的常驻内存top、ps等命令的输出一致
        used_memory_peak:934040  # 内存使用的峰值大小
        used_memory_peak_human:912.15K
      ​
        total_system_memory:1039048704  # 操作系统的总内存 ,以字节(byte)为单位
        total_system_memory_human:990.91M
        used_memory_lua:37888  # lua引擎使用的内存
        used_memory_lua_human:37.00K
      ​
        maxmemory:0  # 最大内存的配置值,0是不限制
        maxmemory_human:0B
        maxmemory_policy:noeviction  # 达到最大内存配置值后的策略
      
      Persistence:RDB和AOF相关信息
        rdb_bgsave_in_progress:0   # 标识rdb save是否进行中
        rdb_last_bgsave_status:ok        # 上次的save操作状态
        rdb_last_bgsave_status:ok        # 上次的save操作状态
        rdb_last_bgsave_time_sec:-1        # 上次rdb save操作使用的时间(单位s)
        rdb_current_bgsave_time_sec:-1    # 如果rdb save操作正在进行,则是所使用的时间
      ​
        aof_enabled:1                    # 是否开启aof,默认没开启
        aof_rewrite_in_progress:0        # 标识aof的rewrite操作是否在进行中
        aof_last_rewrite_time_sec:-1    # 上次rewrite操作使用的时间(单位s)
        aof_current_rewrite_time_sec:-1 # 如果rewrite操作正在进行,则记录所使用的时间
        aof_last_bgrewrite_status:ok    # 上次rewrite操作的状态
        aof_current_size:0                # aof当前大小
      ​
      ​
      Stats:一般统计
        evicted_keys:0                    # 因为内存大小限制,而被驱逐出去的键的个数
      ​
      ​
      Replication:主从同步信息
        role:master                        # 角色
        connected_slaves:1                # 连接的从库数
        master_sync_in_progress:0        # 标识主redis正在同步到从redis
      ​
      ​
      CPU:CPU消耗统计
      ​
      Cluster:集群部分
        cluster_enabled:0  # 实例是否启用集群模式
      ​
      Keyspace:数据库相关统计
        db0:keys=4,expires=0,avg_ttl=0  # db0的key的数量,带有生存期的key的数,平均存活时间
      

第 2 集 Redis6.x 服务端配置 config 命令介绍和最大内存配置

简介: Redis6.x 服务端配置 config 命令介绍

  • config 命令介绍(都有默认值)

    • 可以动态地调整 Redis 服务器的配置(configuration)而无须重启
    • config get xxx、config set xxx
  • 常用配置

    daemonize  #后端运行
    bind #ip绑定
    timeout  #客户端连接时的超时时间,单位为秒。当客户端在这段时间内没有发出任何指令,那么关闭该连接
    ​
    databases #设置数据库的个数,可以使用 SELECT 命令来切换数据库。默认使用的数据库是 0
    save  #设置 Redis 进行rdb持久化数据库镜像的频率
    rdbcompression #在进行镜像备份时,是否进行压缩
    ​
    slaveof #设置该数据库为其他数据库的从数据库
    masterauth  #当主数据库连接需要密码验证时,在这里配置
    ​
    maxclients  #限制同时连接的客户数量,当连接数超过这个值时,redis 将不再接收其他连接请求,返回error
    ​
    maxmemory  #设置 redis 能够使用的最大内存
    
  • maxmemory #设置 redis 能够使用的最大内存,

  • 备注

    • 防止所用内存超过服务器物理内存, maxmemory 限制的是 Redis 实际使用的内存量, 也就是 used_memory 统计项对应的内存
    • 由于内存碎片率的存在, 实际消耗的内存可能会比 maxmemory 设置的更大, 实际使用时要小心这部分内存溢出
    • 默认无限使用服务器内存, 为防止极端情况下导致系统内存耗尽, 建议所有的 Redis 进程都要配置 maxmemory
    • 在 64bit 系统下,maxmemory 设置为 0 表示不限制 Redis 内存使用,在 32bit 系统下,maxmemory 不能超过 3GB
  • 注意:

    • redis 在占用的内存超过指定的 maxmemory 之后,通过 maxmemory_policy 确定 redis 是否释放内存以及如何释放内存

第 3 集 【面试核心】Redis6 的 key 过期时间删除策略你知道多少

简介:Redis6 的 key 过期时间删除策略你知道多少

  • 背景

    • redis 的 key 配置了过期时间,这个是怎么被删除的
    • redis 数据明明过期了,怎么还占用着内存?
    • Redis 就只能用 10G,你要是往里面写了 20G 的数据,会发生什么?淘汰哪些数据
  • redis key 过期策略

    • 定期删除+惰性删除。
  • Redis 如何淘汰过期的 keys: set name xdclass 3600

    • 定期删除:

      • 隔一段时间,就随机抽取一些设置了过期时间的 key,检查其是否过期,如果过期就删除,
      • 定期删除可能会导致很多过期 key 到了时间并没有被删除掉,那咋整呢,所以就是惰性删除
    • 惰性删除 :

      • 概念:当一些客户端尝试访问它时,key 会被发现并主动的过期
      • 放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键
  • Redis 服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用 CPU 时间和避免浪费内存空间之间取得平衡。

  • 问题

    • 如果定期删除漏掉了很多过期 key,然后你也没及时去查,也就没走惰性删除,此时会怎么样?
    • 如果大量过期 key 堆积在内存里,导致 redis 内存块耗尽了,就需要走内存淘汰机制
  • 设计缓存中间件:可以参考 redis 的 key 过期淘汰方式和内存不足淘汰方式

第 4 集 【面试核心】内存不足时-Redis 的 Key 淘汰策略你知道多少

简介:内存不足时-Redis 的 Key 内存淘汰策略你知道多少

  • 背景

    • redis 在占用的内存超过指定的 maxmemory 之后,
    • 通过 maxmemory_policy 确定 redis 是否释放内存以及如何释放内存
    • 提供多种策略
  • 策略

    • volatile-lru(least recently used)

      • 最近最少使用算法,从设置了过期时间的键中选择空转时间最长的键值对清除掉;
    • volatile-lfu(least frequently used)

      • 最近最不经常使用算法,从设置了过期时间的键中选择某段时间之内使用频次最小的键值对清除掉;
    • volatile-ttl

      • 从设置了过期时间的键中选择过期时间最早的键值对清除 (删除即将过期的)
    • volatile-random

      • 从设置了过期时间的键中,随机选择键进行清除;
    • allkeys-lru

      • 最近最少使用算法,从所有的键中选择空转时间最长的键值对清除;
    • allkeys-lfu

      • 最近最不经常使用算法,从所有的键中选择某段时间之内使用频次最少的键值对清除;
    • allkeys-random

      • 所有的键中,随机选择键进行删除;
    • noeviction

      • 不做任何的清理工作,在 redis 的内存超过限制之后,所有的写入操作都会返回错误;但是读操作都能正常的进行;
  • config 配置的时候 下划线_的 key 需要用中横线-

    127.0.0.1:6379> config set maxmemory_policy volatile-lru
    (error) ERR Unsupported CONFIG parameter: maxmemory_policy
    ​
    127.0.0.1:6379> config set maxmemory-policy volatile-lru
    OK