当前位置: 首页 > 知识库问答 >
问题:

redis滑动窗口如何清理冷数据?

陶飞鸿
2023-08-22

目前准备用redis实现分布式限流策略, 抛开那些redis插件,我觉得zset实现理论上可行, 具体逻辑可以是这样:

  1. 抽象限流逻辑: 针对某个action,需要在一段时间(即为窗口),只能容许N个操作
  2. redis伪代码
func increment(key, windowInSecond) {    Long 当时时间 = System.currentTimeMillis();    long maxScoreMs = 当时时间 - windowInSecond * 1000;    // 只留下滑动窗口的数据    redis.zremrangeByScore(key, 0, maxScoreMs);    // incre这一次的操作    redis.zadd(key, 当时时间, 当前时间 + 随机值);}func getCount(key) {    return redis.acard(key);}

问题:
假设某个行为有大量的不同样本或者不同实例在调用, 也就是key不一样, 假设有百万以上,但是每个key的行为发生次数有限,例如就一次, 这个时候就会出现很大冷数据

处理该问题的方案:

  1. 窗口设置expire, 但是这个时候窗口策略就不是100%准确, 例如: 窗口即将过期发生操作行为N-1次, 窗口过期立刻新建又发生N-1次,这时候策略没有限流?
  2. 限流冷key被动删除, 但是我觉得这个策略太low了, 我为了限流还得写被动删除脚本.

想问下大家, 有没有更优的方案, 或者针对分布式限流, 有没有更好的策略

共有1个答案

谷飞星
2023-08-22

设置一个过期时间就行了。数据超过这个时间之后,Redis就会自动删除这些数据。或者弄一个定时任务,定一个时间清理窗口里的冷数据
可以看看 redis设计与实现这本书
思否往期相关回答:redis 遇到冷数据过多怎么办,怎么处理?

 类似资料:
  • 假设我有一个每1分钟开始的2小时窗口。下一步是应用GroupBy转换。 如果能解释这一点,我将不胜感激。无法真正找到相关信息

  • 介绍 将TCP与UDP这样的简单传输协议区分开来的是它传输数据的质量。TCP对于发送数据进行跟踪,这种数据管理需要协议有以下两大关键功能: 可靠性:保证数据确实到达目的地。如果未到达,能够发现并重传。 数据流控:管理数据的发送速率,以使接收设备不致于过载。 要完成这些任务,整个协议操作是围绕滑动窗口确认机制来进行的。因此,理解了滑动窗口,也就是理解了TCP。 更多信息 TCP面向流的滑动窗口确认机

  • 我最初的想法是简单地迭代,如果我们想要平均每X天,X次,每次只需按日期分组元素,并有一个偏移量。 所以如果我们有这样的场景: 天数:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 第2组:(6,F)(7,G)(8,H)(9,I)(10,J) 第3组:(11,K)(12,L)(13,M)(14,N)(15,O) 第二次迭代:

  • 在第一个窗口row_number1到4中,新的秩(新列)将是 在第一个窗口row_number5到8中,新的秩(新列)将是 在第一个窗口中,Row_Number9要Rest,新的秩(新列)将是 但这给了我: 此外,尝试了。rowsbetween(-3,0)但这也给我带来了错误:

  • NowCoder 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。 例如,如果输入数组 {2, 3, 4, 2, 6, 2, 5, 1} 及滑动窗口的大小 3,那么一共存在 6 个滑动窗口,他们的最大值分别为 {4, 4, 6, 6, 6, 5}。 解题思路 // java public ArrayList maxInWindows(int[] num, int size)

  • 问题内容: 我需要一个滚动窗口(也称为滑动窗口)可在序列/迭代器/生成器上使用。默认的Python迭代可视为一种特殊情况,其中窗口长度为1。我目前正在使用以下代码。有没有人有一个更蟒蛇,更少冗长,或更有效的方法来做这件事? 问题答案: 117 Python文档的旧版本中有一个带有示例: 文档中的一个更为简洁,我想它可以起到更大的作用。