Redis做限流

流量限制锁:

		我们用zset存储当前时间戳,只要总数量大于界限值就进行限流。
		假设,限流1秒100次。

具体步骤

1、 删除大于当前时间1秒的数据。
2、 判断剩下set的size是否大于100。大于就直接的返回限流。
3、 不大于就插入当前时间戳到zset 中。
如果使用的是redis集群就需要在限流前面加锁排他锁。

代码

public boolean isOverLimitRate(String key, int num, int second) {
	RedisCallback<Boolean> callback = (RedisConnection connection) -> {
		RedisSerializer<String> stringSerializer = redisTemplate.getStringSerializer();
		byte[] keyData = stringSerializer.serialize(key);
		//添加当前时间戳到redis
		connection.zAdd(keyData, System.currentTimeMillis(), stringSerializer.serialize(System.currentTimeMillis() + ""));
		//删除大于限流时效的数据
		connection.zRemRangeByScore(keyData, 0d, System.currentTimeMillis() - second * 1000d);
		Optional<Long> optional = Optional.of(connection.zCard(keyData));
		//判断数量
		boolean result = optional.map(count -> count > num).orElse(Boolean.FALSE);
		double percentage = (optional.get() == null || num == 0) ? 0 : optional.get() / (num + 0d);
		if (percentage >= 0.8d && percentage <= 1) {
			log.warn(“限流告警”);
		} else if (percentage > 1) {
			log.error("超出限流”);
		}
		return result;
	};
	return redisTemplate.execute(callback);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值