Redis keys 命令问题 与 过期 key 的删除策略

1、keys 命令问题

问题描述

  • redis有一亿个 key,使用 keys 命令是否会影响线上服务?

解答

  • keys 命令时间复杂度是 O(n),n 即总的 key 数量,n 如果很大,性能非常低

  • redis 执行命令是单线程执行,一个命令执行太慢会阻塞其它命令,阻塞时间长甚至会让 redis 发生故障切换

改进方案

  • 可以使用 scan 命令替换 keys 命令,语法 scan 起始游标 match 匹配规则 count 提示数目,返回值代表下次的起点

    1. 虽然 scan 命令的时间复杂度仍是 O(n),但它是通过游标分步执行,不会导致长时间阻塞

    2. 可以用 count 参数提示返回 key 的个数

    3. 弱状态,客户端仅需维护游标

    4. scan 能保证在 rehash 也正常工作

    5. 缺点是可能会重复遍历 key(缩容时)、应用应自己处理重复 key

2、过期 key 的删除策略

记录 key 过期时间

  • 每个库中都包含了 expires 过期字典

    • hashtable结构,键为指针,指向真正 key,值为 long 类型的时间戳,毫秒精度

  • 当设置某个 key 有过期时间时,就会向过期字典中添加此 key 的指针和时间戳

过期 key 删除策略

  • 惰性删除

    • 在执行读写数据库的命令时,执行命令前会检查 key 是否过期,如果已过期,则删除 key

  • 定期删除

    • redis 有一个定时任务处理器 serverCron,负责周期性任务处理,默认 100 ms 执行一次(hz 参数控制)包括:① 处理过期 key、② hash 表 rehash、③ 更新统计结果、④ 持久化、⑤ 清理过期客户端

    • 对于处理过期 key 会:依次遍历库,在规定时间内运行如下操作

      ① 从每个库的 expires 过期字典中随机选择 20 个 key 检查,如果过期则删除

      ② 如果删除达到 5 个,重复 ① 步骤,没有达到,遍历至下一个库

      ③ 规定时间没有做完,等待下一轮 serverCron 运行

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

悠然予夏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值