目前准备用redis实现分布式限流策略, 抛开那些redis插件,我觉得zset实现理论上可行, 具体逻辑可以是这样:
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的行为发生次数有限,例如就一次, 这个时候就会出现很大冷数据
处理该问题的方案:
想问下大家, 有没有更优的方案, 或者针对分布式限流, 有没有更好的策略
设置一个过期时间就行了。数据超过这个时间之后,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文档的旧版本中有一个带有示例: 文档中的一个更为简洁,我想它可以起到更大的作用。