首页 > 编程知识 正文

粒子群算法和蚁群算法,redis漏斗算法原理

时间:2023-05-06 15:51:19 阅读:61713 作者:4179

目录

有什么用?

什么是漏斗算法

令牌桶算法

使用令牌锁

有什么用?

这两个算法来源于计算机网络。在网络传输数据时,为了防止网络拥塞,需要限制网络中的流量,即限流

什么是漏斗算法

水(大量并发的用户请求)进入漏斗里,漏斗以一定的速度出水。当水流入的速度过大也就是漏斗满了的话,直接进行溢出。

漏斗算法被认为是一种粗暴的限流算法,因为并不是所有情况下当前没抢到商品的请求都要被抛弃,因此这种强制性过滤算法并不具备灵活性

令牌桶算法

令牌桶算法原理如下:水(用户请求)必须拿到令牌才代表消费成功。而“令牌数”有一个初始值,令牌桶也有一个令牌存储上限,当桶中的令牌耗光后,令牌桶会以自定义的速度生产令牌,此时所有的水(用户请求)会进入阻塞状态,阻塞时间内如果得到了令牌就会消费成功,如果阻塞时间过了还没有得到令牌,请求会被抛弃。

注意,当用户请求没有经过时,令牌桶本身会不断生产令牌,直到令牌达到上限为止。这样做的好处是,面对瞬时大流量,该算法可以在短时间内请求拿到大量令牌,支持了突发请求。

使用令牌锁

在java项目中使用令牌锁需要导入谷歌的令牌桶工具依赖

ependencygroupidcom.Google.guava/groupidartifactidguava/artifactidversion 28.2-JRE/version/dependency 3358 www.eppacy

publicclasstokenbulkcontroller (/最多20个令牌privateratelimiterratelimiter=rate limiter.create (20 ) ),用于创建令牌桶实例列表@getmapping(sale ) (publicstringsale ) integerid ) /情况1 .未获取令牌的请求()在此方法中很少使用)//log.info )进行等待ratelimiter.tryacquire(2,TimeUnit.SECONDS ) ({ System.out.println ) )当前请求受限制,可以直接丢弃,并调用随后的秒杀逻辑return '这次没有抢劫这个商品'; } System.out.println (后续业务处理); return“祝贺收购成功”}} 对于这个Controller,可以使用Jmeter模拟1000个并发测试,感受下令牌桶的使用

这个例子中没有设置令牌的生产时间,令牌的生产时间当然也可以自定义~

注意,我们设定的是如果2s内,请求没拿到令牌就会被限流,也就是说使用令牌桶后卖出去的商品并不一定是100个。3s内有多少个请求能拿到令牌,就能卖出多少个请求。想想这样合不合理?

这种方式有其合理性。原因在于你卖了所有的库存,如果用户收到后换货和退货怎么办?因此即使是秒杀也不应该卖出全部的商品。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。