`

使用redis实现分布式环境下的流量控制

 
阅读更多
public class FlowControl {
	private static Logger logger = LoggerFactory.getLogger(FlowControl.class);

	/**
	 * @Title: allow @Description: 进行流量控制,允许访问返回true 不允许访问返回false 
	 * @param: @param key 放入redis的key,放入前要在key之前添加前缀 前缀配置在eds.properties中的 redis.prefix
	 * @param: @param timeOut 超时时间单位秒
	 * @param: @param count 超时时间内允许访问的次数
	 * @param: @return
	 * @param: @throws
	 *             Exception @return: boolean @throws
	 */
	public static boolean allow(String key, int timeOut, int count) {

		Boolean useFc = Boolean.valueOf(EdsPropertiesUtil.getInstance().getProperty("flowControl.use"));
		// 若不使用流量控制直接返回true
		if (!useFc) {
			return true;
		}

		boolean result = false;
		Jedis jedis = null;
		String prefix = EdsPropertiesUtil.getInstance().getProperty("redis.prefix");
		key = prefix + key;
		try {
			jedis = RedisUtil.getJedis();
			Long newTimes = null;
			Long pttl = jedis.pttl(key);

			if (pttl > 0) {
				newTimes = jedis.incr(key);
				if (newTimes > count) {
					logger.info("key:{},超出{}秒内允许访问{}次的限制,这是第{}次访问", new Object[] { key, timeOut, count, newTimes });
				} else {
					result = true;
				}
			} else if (pttl == -1 || pttl == -2 || pttl == 0) {

				Transaction tx = jedis.multi();
				Response<Long> rsp1 = tx.incr(key);
				tx.expire(key, timeOut);
				tx.exec();
				newTimes = rsp1.get();
				if (newTimes > count) {
					logger.info("key:{},{}秒内允许访问{}次,第{}次访问", new Object[] { key, timeOut, count, newTimes });
				} else {

					result = true;
				}

			}
			if (result) {
				logger.debug("key:{},访问次数{}", new Object[] { key, newTimes });
			}

		} catch (Exception e) {
			logger.error("流量控制发生异常", e);
			e.printStackTrace();
			// 当发生异常时 允许访问
			result = true;
		} finally {
			jedis.close();
		}

		return result;

	}

}

 

分享到:
评论

相关推荐

    基于Redis实现分布式应用限流的方法

    Redis,作为一款高效且广泛使用的内存数据存储系统,常被用于实现分布式环境下的限流解决方案。 在实际的限流策略中,有多种方法可以实施。一种是在Nginx等负载均衡器层面进行限流,根据账号、IP地址或系统调用逻辑...

    php 基于redis使用令牌桶算法实现流量控制

    系统在运行过程中,如遇上某些活动,访问的人数会在...使用流量控制可以减轻服务器压力,避免服务器挂掉。本文介绍php基于redis,使用令牌桶算法,实现访问流量的控制,提供完整算法说明及演示实例,方便大家学习使用。

    Go-利用Redis和Golang实现分布式令牌桶算法

    综上所述,这个项目涉及使用Go语言和Redis实现分布式令牌桶算法,目的是实现速率限制和网络拥塞控制。通过在Go中设计相应的数据结构和算法,并利用Redis的分布式特性,可以构建出一个健壮且高效的系统,适用于大型...

    Redis 分布式锁使用

    - **分布式信号量**:用于限制同时访问资源的线程数量,实现流量控制。 ### 注意事项与最佳实践 - **锁的释放**:确保在finally块中释放锁,以防止异常导致的未解锁。 - **避免死锁**:合理设置锁超时时间,使用...

    redis-demo:用redis实现分布式锁、限流

    **Redis 分布式锁** Redis 是一款非常流行的内存数据存储系统,常被用于实现高性能的缓存...通过学习和分析项目源码,可以加深对 Redis 和 Java 客户端库 lettuce 的使用,以及分布式系统中并发控制和流量控制的理解。

    基于RateLimiter和Lua脚本限量控制实现分布式限流.docx

    ### 基于RateLimiter和Lua脚本的分布式限流技术详解 #### 一、引言 在高并发场景下,为了保护后端服务不被...同时,通过Redis作为分布式环境下的中间件,实现了跨服务器的限流控制,确保了高并发场景下的服务稳定性。

    15.精确掌控并发:滑动时间窗口算法在分布式环境下并发流量控制的设计与实现_V20240116.pdf

    - **基本概念**:滑动时间窗口算法是一种流量控制机制,适用于分布式系统环境下的并发流量管理。相较于传统的固定时间窗口方法,滑动窗口算法能够更加平滑且精细地控制流量。 - **工作流程**: 1. **窗口定义**:...

    17.精确掌控并发:令牌桶算法在分布式环境下并发流量控制的设计与实现_V20240116.pdf

    下面是一个简单的Java代码示例,展示了如何使用Redis实现令牌桶算法: ```java @Component public class TokenBucket { @Autowired private RedisTemplate, Object&gt; redisTemplate; // 滑动时间窗口大小 ...

    Redis和Lua实现分布式限流器的方法详解

    总的来说,Redis 和 Lua 的结合使用为分布式限流器提供了高效且灵活的解决方案,能够帮助系统在高并发环境下保持稳定,防止因过量请求导致的服务崩溃。通过选择合适的限流策略并调整参数,可以有效地控制服务的负载...

    基于mq和redis实现的秒杀系统

    4. **限流控制**:通过设置Redis计数器,限制单位时间内处理的请求数量,防止流量过大。 5. **库存扣减**:使用原子操作如`INCRBY`进行库存扣减,保证操作的原子性,避免并发问题。 6. **结果缓存**:秒杀成功的结果...

    网关 gateway 动态路由 及 redis 集成限流

    为了实现动态限流,我们可以结合Redis的分布式锁或者原子操作来控制并发请求的数量。 集成Redis实现限流,可以创建一个限流策略,例如基于每个服务实例的QPS(每秒请求数)。当请求到达时,网关会检查Redis中的...

    商城秒杀项目,基于springboot开发,使用redis和rocketmq技术增加高并发能力

    《基于SpringBoot的商城秒杀系统:Redis与RocketMQ在高并发下的应用》 商城秒杀项目是一项技术挑战性极高的任务,它需要系统具备处理大量并发请求的能力,以确保在短时间内顺利完成用户的秒杀操作。在这个项目中,...

    nginx-lua-redis-rate-measuring:一个lua库,可使用nginx + redis提供分布式速率测量,您可以使用它来在许多节点内进行节流系统

    `nginx-lua-redis-rate-measuring` 是一个基于 Lua 编写的库,专为使用 Nginx 和 Redis 的分布式系统设计,用于实现高效、精确的速率测量和限流功能。这个库的核心功能是允许您在多节点环境中监控和控制系统的请求...

    百度分布式redis集群平台开发与运维.docx

    百度分布式Redis集群平台开发与运维 Redis 基本概念 Redis 是一种开源、基于内存的数据存储系统,由 Salvatore Sanfilippo 设计开发。Redis 的名称来源于 Remote Dictionary Server,意为远程字典服务器。Redis 是...

    spring cloud sentinel dashboard redis实现网关修改

    Spring Cloud Sentinel 是一款由 Alibaba 开源的流量控制、熔断降级组件,它为分布式系统提供了微服务治理的解决方案。Sentinel Dashboard 是 Sentinel 的可视化控制台,用于实时监控服务的流量情况并进行动态规则...

    springboot+redis实现网站限流和接口防刷功能.zip

    - **分布式限流**:在多实例环境下,需要考虑分布式限流,例如使用Redis的分布式锁或者基于Guava的RateLimiter实现分布式限流。 - **自定义限流策略**:根据业务需求,可以扩展限流策略,比如基于IP、用户、会话等...

    Springboot使用redis进行api防刷限流过程详解

    - **滑动窗口算法**:使用滑动窗口而非简单计数,可以更好地控制瞬时流量。 - **分布式限流**:如果应用部署在多台服务器上,需要使用分布式限流策略,如使用 Redis 的分布式锁。 - **动态调整限流策略**:根据系统...

    springmvc+spring+mybatis+redis是实现秒杀

    其次,Redis的原子操作(如INCR)可以用来实现分布式锁,防止同一商品在同一时间被多个用户秒杀。此外,Redis还可以用作消息队列,当用户请求过多时,可以先将请求放入队列,然后按顺序处理,避免服务器因瞬间高流量...

    Redis使用实例

    - **限流**:通过限制某个键的请求频率,实现流量控制,防止DDoS攻击。 解压后的"Redis实例"文件应包含示例代码,你可以参考这些代码了解如何在实际项目中使用Redis。学习和理解这些实例,将有助于你更高效地利用...

    基于redis实现昨日今日浏览量统计-案例源码

    这时可以考虑使用Redis Cluster进行分布式部署,分片存储浏览量,以保证系统的可扩展性和高可用性。 7. **安全与优化**:确保Redis配置了适当的访问控制,并定期进行性能优化,如调整内存大小、监控CPU和内存使用...

Global site tag (gtag.js) - Google Analytics