侧边栏壁纸
  • 累计撰写 18 篇文章
  • 累计创建 10 个标签
  • 累计收到 1 条评论

redis删除策略和核心配置

gnng
2022-05-17 / 0 评论 / 0 点赞 / 871 阅读 / 1,807 字
温馨提示:
本文最后更新于 2022-05-17,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1. Redis删除策略

1.1 过期数据

  • redis中数据的特征
    • 具有时效性的数据(setex expire key )
    • 永久有效的数据
    • 已经过期的数据或被删除的数据或未定义的数据

1.2 删除策略

  • 目标:在内存占用和cpu占用直接找到一个平衡,不会使redis性能下降,也不会导致内存泄露。
  • 定时删除
    • 方式:创建一个定时器,当key设置有过期时间,并且过期时间已经到了,由定时器任务立即执行key的删除命令。
    • 优点:节约内存,时间到就删除,不会占用多余的内存。
    • 缺点:CPU压力大,当执行定时器时,无论CPU负载如何,都会执行。在高负载情况下会影响redis服务器响应时间和指令吞吐量。
    • 总结:用处理器性能换取内存空间(时间换空间)
  • 惰性删除
    • 方式:当数据达到过期时间,不做处理,等下次再访问该数据时,如果未过期,则返回数据;如果已过期就删除key,返回不存在。
    • 优点:节约CPU性能,发现必须删除的时候才删除。
    • 缺点:内存压力较大,会出现长期占用内存的数据。
    • 总结:用存储空间换取CPU性能(空间换时间)
  • 定期删除
    • 方式:周期性轮询redis库中的时效性数据,采用随机抽取策略,利用过期数据占比来控制删除频率。
    • 特点1:CPU性能占用设置峰值,检测频率可以自定义设置。
    • 特点2:内存定期随机清理,每秒话费固定CPU资源维护内存。
    • 总结:周期性抽查存储空间(随机抽取,重点抽取)

1.3 逐出算法

  • 问题:当新数据进来发现内存不足怎么处理?

    • Redis使用内存存储数据,在执行每一个命令前都会调用freememoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理内存空间,清理数据的策略称为逐出算法。

    • 逐出数据的过程不是100%能够清理出足够可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。

      (error)OOM command not allowed when used memory > 'maxmemory'

  • 相关配置

    • 最大可使用内存:maxmemory(占用物理内存的比例,默认值为0,表示不限制,通常设置50%以上)
    • 每次选取待删除数据的个数:maxmemory-samples(选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能,而是随机获取数据的方式作为待检测删除数据)
    • 删除策略:maxmemory-policy(达到最大内存之后,对被挑选出来的数据进行删除的策略)
  • 算法

    • 检测易失数据(可能会过期的数据集server.db[i].expires)
      1. volatile-lru:挑选最近最少使用的数据淘汰
      2. volatile-lfu:挑选最近使用次数最少的数据淘汰
      3. volatile-ttl:挑选将要过期的数据淘汰
      4. volatile-random:任意选择数据淘汰
    • 检测全库数据(所有数据集server.db[i].dict)
      1. allkeys-lru:挑选最近最少使用的数据淘汰
      2. allkeys-lfu:挑选最近使用次数最少的数据淘汰
      3. allkeys-random:任意选择数据淘汰
    • 放弃数据驱逐
      1. no-enviction(驱逐):禁止驱逐数据(redis-4.0默认策略),会引发OOM
  • 依据

    • 使用INFO命令输出监控信息,查询缓存hit和miss的次数,根据业务需求调优redis配置

2. Redis核心配置

2.1 服务端配置

  • 设置服务器以守护进程的方式运行:daemonize yes|no
  • 绑定主机地址:bind 127.0.0.1
  • 设置服务器端口:port 6379
  • 设置数据库数量:databases 16

2.2 日志配置

  • 设置服务器指定日志记录级别:loglevel debug|verbose|notice|warning

  • 日志记录文件名:logfile 端口号.log

    注意:日志级别开发期设置为verbose即可,生产环境中配置为notice,简化日志输出量,降低写IO的频率

2.3 客户端配置

  • 设置同一时间最大客户端连接数,默认无限制。当客户端连接到达上限,Redis会关闭新的连接
    • maxclients 0
  • 客户端闲置等待最大时长,达到最大值后关闭连接。如需关闭该功能,设置为0
    • timeout 300 (单位:s)

2.4 多服务器快捷配置

  • 导入并加载指定配置文件信息,用于快速创建公共配置较多的redis实例,将公共的配置抽取出来,便于维护。
    • include /path/server-端口号.conf
0

评论区