当前位置: 首页 > 网络应用技术

Redis电流的三种方式,还有谁不会!

时间:2023-03-05 17:19:49 网络应用技术

  面对越来越高的现场场景,当前的限制显示特别重要。

  当然,有很多方法可以实施电流。Redis具有非常强大的功能。我使用Redis练习三种方法来实施它,这可以更简单。REDIS不仅可以进行流媒体,而且可以进行数据统计信息,附近的人等。这些都可以在以下内容中写下。

  当我们使用Redis的分布式锁定时,每个人都知道它依赖于SETNX的说明。当CAS的操作(比较和互换)时,我们在同一时间为指定的密钥设置了扩展的练习(到期)。主要目的是在单位时间内访问我的代码程序,并在单位时间内使用许多n个数量。在setnx上可以轻松实现此功能。

  例如,我们需要在10秒内限制20个请求,因此我们可以在设置NEDNX时设置10个过期时间。当请求的SETNX数量达到20时,它将达到当前限制效果。代码相对简单显示。

  当然,这种方法有许多缺点。例如,当统计数据为1-10秒时,不可能在2-11秒内进行计数。如果需要在n秒内进行m请求,则我们需要将n键保留在重新任务中。

  实际上,当前涉及的最重要的是滑动窗口,它也提到了1-10如何变为2-11。实际上,起始值和最终值可以为+1。

  而且,如果我们使用Redis的列表数据结构,我们可以轻松地实现此功能。

  我们可以将请求放入ZSET数组中。当每个请求进来时,该值保持唯一并可以在UUID中生成,并且分数可以由当前时间戳表示,因为得分可用于计算当前时间戳中的多少是请求的数量。结构还为我们提供了轻松在2个时间戳中获得2个时间戳的范围方法

  代码显示如下

  通过上面的代码,可以实现滑动窗口的效果,并且可以确保每秒最多请求。缺点是ZSET的数据结构将增加。实现方法相对简单。

  当涉及当前限制时,必须提及令牌讨价还价算法。

  令牌枪管算法提到,当提到输入率和输出率时,当输出速率大于输入率时,它就会超出交通限制。

  换句话说,每次访问请求时,我们都可以从Redis获得令牌。如果获得令牌,则意味着限制没有限制,如果无法获得,则结果是相反的。

  依靠上述想法,我们可以很容易地将REDIS的列表数据结构结合在一起,以实现此代码,但仅实现了

  依靠ListPop获得令牌

  当然,依靠Java的定时任务定期来列表中的rightpush令牌,当然也需要唯一性,因此我仍然使用UUID来生成

  总而言之,启动代码并不难。对于这些当前的限制方法,我们可以将上述代码添加到AOP或过滤器中以实现接口的当前限制并最终保护您的网站。

  Redis实际上还有许多其他用途。他的角色不仅是缓存,而且是分布式锁。他的数据结构不仅是字符串,哈希,列表,set,zset。如果您有兴趣,您可以了解他的GeoHash算法;位图,HLL和BLOOM过滤器数据(Redis4.0,您可以使用Docker安装Redislabs/重新启动)结构。

  如果您有任何疑问,请留言进行讨论。

  原始链接:https://blog.csdn.net/lmx125254/article/details/90700118