java基于redis实现分布式应用限流(代码片段)

author author     2022-12-22     211

关键词:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
import redis.clients.jedis.ZParams;

import java.util.List;
import java.util.UUID;

/**
 * @email wangiegie@gmail.com
 * @data 2017-08
 */
public class RedisRateLimiter 
    private static final String BUCKET = "BUCKET";
    private static final String BUCKET_COUNT = "BUCKET_COUNT";
    private static final String BUCKET_MONITOR = "BUCKET_MONITOR";

    static String acquireTokenFromBucket(
            Jedis jedis, int limit, long timeout) 
        String identifier = UUID.randomUUID().toString();
        long now = System.currentTimeMillis();
        Transaction transaction = jedis.multi();

        //删除信号量
        transaction.zremrangeByScore(BUCKET_MONITOR.getBytes(), "-inf".getBytes(), String.valueOf(now - timeout).getBytes());
        ZParams params = new ZParams();
        params.weightsByDouble(1.0,0.0);
        transaction.zinterstore(BUCKET, params, BUCKET, BUCKET_MONITOR);

        //计数器自增
        transaction.incr(BUCKET_COUNT);
        List<Object> results = transaction.exec();
        long counter = (Long) results.get(results.size() - 1);

        transaction = jedis.multi();
        transaction.zadd(BUCKET_MONITOR, now, identifier);
        transaction.zadd(BUCKET, counter, identifier);
        transaction.zrank(BUCKET, identifier);
        results = transaction.exec();
        //获取排名,判断请求是否取得了信号量
        long rank = (Long) results.get(results.size() - 1);
        if (rank < limit) 
            return identifier;
         else //没有获取到信号量,清理之前放入redis 中垃圾数据
            transaction = jedis.multi();
            transaction.zrem(BUCKET_MONITOR, identifier);
            transaction.zrem(BUCKET, identifier);
            transaction.exec();
        
        return null;
    

使用redis+lua脚本实现分布式限流(代码片段)

...(enhance-boot-limiting)主要是基于Redis+lua实现了分布式限流功能项目中提供两种分布式限流算法(一种是滑动时间窗口算法、一种是令牌桶算法)项目中提供了方便使用的注解形式来直接对接口进行限流,详... 查看详情

使用redis+lua脚本实现分布式限流(代码片段)

...(enhance-boot-limiting)主要是基于Redis+lua实现了分布式限流功能项目中提供两种分布式限流算法(一种是滑动时间窗口算法、一种是令牌 查看详情

一个轻量级的基于ratelimiter的分布式限流实现(代码片段)

...。RateLimiter通过线程锁控制同步,只适用于单机应用,在分布式环境下,虽然有像阿里Sentinel的限流开源框架,但对于一些小型应用来说未免过重,但限流的需求在小型项目中也是存在的,比如获取手机验证码的控制,对资源消... 查看详情

redis应用场景中布隆过滤及高并发限流及分布式锁等应用(代码片段)

...;以及令牌桶、漏斗算法原理如何做到限流的;分布式锁,如何利用redis实现一个分布式锁,通过这几种应用场景去了解redis的应用Redis实现去幂等性例如在租房时,有一张房屋信息表& 查看详情

(十七)atp应用测试平台——redis实现api接口访问限流(固定窗口限流算法)(代码片段)

...的存储,一些热点数据的存储。再高大上一点,分布式锁。面试官:还有呢?心中顿时一万只草泥马奔过,这还不够吗?还能干什么?不好意思,实在是想不出了。面试官,好了,回去等通... 查看详情

基于redis的incr实现一个限流器(代码片段)

模式:计数器计数器是Redis的原子性自增操作可实现的最直观的模式了,它的想法相当简单:每当某个操作发生时,向Redis发送一个 INCR 命令。比如在一个web应用程序中,如果想知道用户在一年中每天的点击量,那么只要... 查看详情

接口限流算法(代码片段)

...在业务方实现一套限流策略的话,可以考虑基于Redis实现分布式限流策略。并且在实际应用中,可能还会基于不同的维度进行限流,如用户id,请求IP等,实际应用需要考虑的东西更多。 计数器计数器法是限流算法里最简单也... 查看详情

(十七)atp应用测试平台——redis实现api接口访问限流(固定窗口限流算法)(代码片段)

...的存储,一些热点数据的存储。再高大上一点,分布式锁。面试官:还有呢? 查看详情

优雅解决分布式限流(代码片段)

...型和策略,本篇从 SpringBoot、Redis 应用层面来实现分布式的限流….分布式限流单机版中我们了解到 AtomicInteger、RateLimiter、Semaphore 这几种解决方案,但它们也仅仅是单机的解决手段,在集群环境下就透心凉了,... 查看详情

java并发:分布式应用限流redis+lua实践

任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶。在之前的文章中,也讲到过,但是那是基于单机场景来写。之前文章:接口限流算法:漏桶算法&令牌桶算法然而再牛逼的... 查看详情

springboot如何进行限流,老鸟们还可以这样玩!(代码片段)

...具类实现了接口限流。但是这种方式有个问题,无法实现分布式限流。那今天我们来利用Redis+Lua来实现分布式限流。Lua脚本和MySQL数据库的存储过程比较相似,他们执行一组命令,所有命令的执行要么全部成功或者失败,以此达... 查看详情

微服务架构分布式限流策略(代码片段)

...程内限流单机限流依赖配置中心go-zero基于redis设计的两款分布式限流器kubernetes怎么实现分布式限流istioingressratelimitingk8s获取pod副本数做限流限流方式集中式(全局)限流网关层限流服务网关,作为整个分布式链路中... 查看详情

随笔java基于redis分布式锁(代码片段)

定义接口publicinterfaceIDistributedLockbooleantryLock(Stringvar1,Objectvar2);booleantryLock(Stringvar1,Objectvar2,intvar3);booleanunLock(Stringvar1,Objectvar2);实现类publicclassDistributedLockImplprivatestat 查看详情

我司用了6年的redis分布式限流器,可以说是非常厉害了!(代码片段)

...的功能,可以使用它实现复杂的令牌桶或漏桶算法,也是分布式系统中实现限流的主要方式之一。相比Redis事务,Lua脚本的优点:减少网络开销:使用Lua脚本,无需向Redis发送多次请求,执行一次即可,减少网络传输原子操作:Re... 查看详情

springboot如何进行限流?老鸟们还可以这样玩!(代码片段)

...实现了接口限流。但是这种方式有个问题,无法实现分布式限流。那今天我们来利用Redis+Lua来实现分布式限流。Lua脚本和MySQL数据库的存储过程比较相似,他们执行一组命令,所有命令 查看详情

springboot如何进行限流?老鸟们还可以这样玩!(代码片段)

...实现了接口限流。但是这种方式有个问题,无法实现分布式限流。那今天我们来利用Redis+Lua来实现分布式限流。Lua脚本和MySQL数据库的存储过程比较相似,他们执行一组命令,所有命令 查看详情

基于redis实现的四种常见的限流策略(代码片段)

引言在web开发中功能是基石,除了功能以外运维和防护就是重头菜了。因为在网站运行期间可能会因为突然的访问量导致业务异常、也有可能遭受别人恶意攻击所以我们的接口需要对流量进行限制。俗称的QPS也是对流量的一... 查看详情

基于redis实现的四种常见的限流策略(代码片段)

引言在web开发中功能是基石,除了功能以外运维和防护就是重头菜了。因为在网站运行期间可能会因为突然的访问量导致业务异常、也有可能遭受别人恶意攻击所以我们的接口需要对流量进行限制。俗称的QPS也是对流量的一... 查看详情