RedisTemplate实现令牌桶限流

ops/2024/9/22 19:13:19/

令牌桶

Redisson可以实现很多东西,在Redis的基础上,Redisson做了超多的封装,不仅可以用来实现分布式锁,还可以帮助我们实现令牌桶限流


Ratelimter主要作用就是可以限制调用接口的次数。主要原理就是调用接口之前,需要拥有指定个令牌,限流器每秒会产生X个令牌放入令牌桶,调用接口需要去令牌桶里面拿令牌。如果令牌被其它请求拿完了,那么自然而然,当前请求就调用不到指定的接口。

RateLimter实现限流

java">@RestController@RequestMapping("/redisTest")public class RedisTestController {@Autowiredprivate Redisson redisson;@GetMapping("/Token")public String testTokenBucket() {RRateLimiter rateLimiter = redisson.getRateLimiter("myRatelimiter");//最大流速 =每10秒钟产生1个令牌rateLimiter.trySetRate(RateType.OVERALL, 1, 10, RateIntervalUnit.SECONDS);//需要1个令牌if (rateLimiter.tryAcquire(1)) {return "令牌桶里面有可使用的令牌";}return "不好意思,请过十秒钟再来~~~~~~~";}}

RedisTemplate实现方式:

话不多说直接上代码,如下:

java">package com.shop.cyshop.commons.service;/*** 限流器** @date 2024年04月28日 15:02*/import com.shop.cyshop.commons.locker.LockService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;import java.util.concurrent.TimeUnit;@Service
@Slf4j
public class RequestLimitService {private static final String REQUEST_LIMIT_KEY = "request_limit";private static final int WINDOW_SIZE_SECONDS = 6; //每六秒一次请求限制private static final int MAX_REQUESTS = 1;@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Autowiredprivate LockService lockService;public boolean isAllowed() {return lockService.lock(REQUEST_LIMIT_KEY + "::glock", "sys", () -> {long currentTime = System.currentTimeMillis() / 1000; //10long windowStart = currentTime - WINDOW_SIZE_SECONDS;//4// 删除过期的记录redisTemplate.opsForZSet().removeRangeByScore(REQUEST_LIMIT_KEY, 0, windowStart);// 获取当前窗口内的请求数量Long currentRequests = redisTemplate.opsForZSet().count(REQUEST_LIMIT_KEY, windowStart, currentTime);if (currentRequests != null && currentRequests < MAX_REQUESTS) {// 增加请求记录redisTemplate.opsForZSet().add(REQUEST_LIMIT_KEY, String.valueOf(currentTime), currentTime);// 设置过期时间redisTemplate.expire(REQUEST_LIMIT_KEY, WINDOW_SIZE_SECONDS, TimeUnit.SECONDS);return true;}return false;});}
}


http://www.ppmy.cn/ops/35170.html

相关文章

MySQL基础_5.多表查询

文章目录 一、多表连接1.1、笛卡尔积&#xff08;或交叉连接&#xff09; 二、多表查询&#xff08;SQL99语法&#xff09;2.1、内连接(INNER JOIN)2.2、内连接(INNER JOIN) 一、多表连接 多表查询&#xff0c;也称为关联查询&#xff0c;指两个或更多个表一起完成查询操作。 …

数据结构十一:数组相关经典面试题

本篇博客详细介绍分析数组/顺序表常见的面试题&#xff0c;对于前面所学知识进行一个巩固&#xff0c;同时介绍一些力扣刷题中的一些概念&#xff1a;如&#xff1a;输出型参数等&#xff0c;在刷题中培养自己的编程思维&#xff0c;掌握常见的编程套路&#xff0c;形成题感&am…

在图像识别中的“long-rang”理解

在图像识别中&#xff0c;“long-range” 通常指的是模型在处理图像时能够捕捉到图像中远距离相关性或模式的能力。这意味着模型能够在图像的不同区域之间建立连接&#xff0c;并利用这些连接来理解图像的整体结构和内容。 在传统的图像识别模型中&#xff0c;如卷积神经网络 …

页面多开、谷歌浏览器解决不能批量打开问题、批量打开被限制

目录 问题原因谷歌浏览器解决办法来看效果 问题 我们使用批量打开页面的时候 只能打开第一个页面 原因 这种问题是因为 浏览器限制了浏览器的弹出 并不是人家页面功能不能用 谷歌浏览器解决办法 在浏览器输入这个路径 chrome://settings/content/popups?search%E9%87%…

零基础入门学习Python第二阶01生成式(推导式),数据结构

Python语言进阶 重要知识点 生成式&#xff08;推导式&#xff09;的用法 prices {AAPL: 191.88,GOOG: 1186.96,IBM: 149.24,ORCL: 48.44,ACN: 166.89,FB: 208.09,SYMC: 21.29}# 用股票价格大于100元的股票构造一个新的字典prices2 {key: value for key, value in prices.i…

Llama3-Tutorial之XTuner微调Llama3个人小助手

Llama3-Tutorial之XTuner微调Llama3个人小助手 使用XTuner微调llama3模型。 参考&#xff1a; https://github.com/SmartFlowAI/Llama3-Tutorial 1. web demo部署 参考上一节内容已经完成web demo部署&#xff0c;进行对话测试, 当前回答基于llama3官方发布的模型进行推理生成&…

【跟马少平老师学AI】-【神经网络是怎么实现的】(六)过拟合问题

一句话归纳&#xff1a; 1&#xff09;过拟合问题&#xff1a; 图中的点为样本直线欠拟合曲线2过拟合 2&#xff09;迭代次数与拟合情况&#xff1a; 训练次数过多可能导致过拟合。 3&#xff09;正则化项法弱化过拟后问题&#xff1a; 加正则项&#xff0c;在最小化损失函数时…

中国南玻集团(三面)

这次面试去到了线下&#xff0c;这也是我第一次线下面试&#xff0c;面试我的是信息管理部的总监李总。 我记得我刚进门看到李总的时候&#xff0c;第一印象就感觉李总就有点严肃。后来我发现&#xff0c;我的第一印象没有错&#xff0c;他确实很严肃&#xff0c;我印象中他好…