springboot高级教程基于 redis 通过注解实现限流

这篇具有很好参考价值的文章主要介绍了springboot高级教程基于 redis 通过注解实现限流。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Boot整合Redis有一种方便的方式是使用注解方式实现限流。

可以通过自定义注解的方式来标注需要限流的方法,在方法执行前进行限流的检查。

以下是具体实现方式:

1. 自定义注解`@RedisLimit`,并定义注解元素,如限流的时间、限流的次数等。
2. 编写切面类`RedisLimitAspect`,在方法执行前调用`RedisLimit`组件实现限流。
3. 将`RedisLimitAspect`类加入Spring容器中,以便进行注入。
4. 在需要进行限流的方法上添加`@RedisLimit`注解。

以下是示例代码:

`@RedisLimit`注解:

 

@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface RedisLimit {
    int limit() default 10;
    int timeout() default 60;
    String key() default "";}



切面类`RedisLimitAspect`:
 

@Aspect@Componentpublic class RedisLimitAspect {
    @Autowired    private RedisTemplate<String, String> redisTemplate;
    @Pointcut("@annotation(redisLimit)")    public void pointcut(RedisLimit redisLimit) {}
    @Before("pointcut(redisLimit)")    public void before(JoinPoint joinPoint, RedisLimit redisLimit) throws Throwable {        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())                .getRequest();        String ip = IpUtils.getRequestIp(request);        String key = redisLimit.key().equals("") ? ip : redisLimit.key();        int limit = redisLimit.limit();        int timeout = redisLimit.timeout();        if (!redisLimit(redisTemplate, key, limit, timeout)) {            throw new RuntimeException("限流了");        }    }
    /**     * 判断Redis中的key对应的值,是否满足小于limit     *     * @param redisTemplate RedisTemplate     * @param key           键     * @param limit         限流次数     * @param timeout       超时时间(秒)     * @return 是否限流     */    private boolean redisLimit(RedisTemplate<String, String> redisTemplate, String key, int limit, int timeout) {        String value = String.valueOf(System.currentTimeMillis() / 1000);        try {            redisTemplate.watch(key);            List<String> list = redisTemplate.opsForList().range(key, 0, -1);            int count = 0;            if (list != null && !list.isEmpty()) {                for (String time : list) {                    if (Long.parseLong(time) >= (System.currentTimeMillis() / 1000 - timeout)) {                        count++;                    } else {                        redisTemplate.opsForList().trim(key, count, -1);                        break;                    }                }            }            if ((count + 1) > limit) {                return false;            }            redisTemplate.multi();            redisTemplate.opsForList().rightPush(key, value);            redisTemplate.expire(key, timeout, TimeUnit.SECONDS);            redisTemplate.exec();        } catch (Exception e) {            e.printStackTrace();            return false;        } finally {            redisTemplate.unwatch();        }        return true;    }
}



在需要进行限流的方法上添加`@RedisLimit`注解:
 

@RestControllerpublic class TestController {
    @GetMapping("/test")    @RedisLimit(key = "testKey", limit = 5, timeout = 60)    public String test() {        return "success";    }
}



注意:在使用`@RedisLimit`注解时,每个方法对应的key不应该相同,否则会出现相互干扰的情况。

推荐阅读

springboot 高级教程 如何优雅使用redission分布式锁

springboot 高级教程 全局异常处理

springboot mysql读写分离

什么是缓存穿透,如何避免

MySQL 百万级数据分页查询及优化

nginx配置负载均衡的服务宕机了,怎么配置高可用

加群交流文章来源地址https://www.toymoban.com/news/detail-497787.html

到了这里,关于springboot高级教程基于 redis 通过注解实现限流的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot 3自定义注解+拦截器+Redis实现高并发接口限流

    在当今互联网应用开发中,高并发访问是一个常见的挑战。为了保障系统的稳定性和可靠性,我们需要对接口进行限流,防止因过多的请求导致系统崩溃。 本文将介绍如何利用Spring Boot 3中的自定义注解、拦截器和Redis实现高并发接口限流,帮助程序员解决这一挑战。 1. 自定

    2024年04月28日
    浏览(36)
  • Springboot 中使用 Redisson+AOP+自定义注解 实现访问限流与黑名单拦截

    🏷️ 个人主页 :牵着猫散步的鼠鼠  🏷️ 系列专栏 :Java全栈-专栏 🏷️ 个人学习笔记,若有缺误,欢迎评论区指正   前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 1.导入Redisson 引入依

    2024年02月21日
    浏览(42)
  • 【Spring】SpringBoot整合Redis,用Redis实现限流(附Redis解压包)

       📝个人主页:哈__ 期待您的关注  本文介绍SpringBoot整合Redis并且进行接口的限流,文章主要介绍的是一种思想,具体代码还要结合实际。 Redis的解压包我放在了百度网盘上,有需要的可以下载。 Redis-x64-3.0.504 解压码:uhwj 我们在本地解压下载的Redis压缩包,打开解压后的

    2024年04月09日
    浏览(37)
  • 基于 Redis 实现分布式限流

    分布式限流是指通过将限流策略嵌入到分布式系统中,以控制流量或保护服务,保证系统在高并发访问情况下不被过载。 分布式限流可以防止系统因大量请求同时到达导致压力过大而崩溃,从而提高系统的稳定性和可靠性。同时,它可以使得业务资源能够更好地分配,提高系

    2024年02月12日
    浏览(31)
  • 【springboot】spring的Aop结合Redis实现对短信接口的限流

    场景: 为了限制短信验证码接口的访问次数,防止被刷,结合Aop和redis根据用户ip对用户限流 首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而注解是通过 AOP 来解析的,所以我们还需要加上 AOP 的依赖,最终的依赖如下:

    2024年02月05日
    浏览(39)
  • JAVA:基于Redis 实现计数器限流

    1、简述 在现实世界中可能会出现服务器被虚假请求轰炸的情况,因此您可能希望控制这种虚假的请求。 一些实际使用情形可能如下所示: API配额管理-作为提供者,您可能希望根据用户的付款情况限制向服务器发出API请求的速率。这可以在客户端或服务端实现。 安全性-防止

    2024年02月02日
    浏览(27)
  • SpringBoot通过@Cacheable注解实现缓存功能

    Spring 从 3.1 开始就引入了对 Cache 的支持。定义了 org.springframework.cache.Cache 和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术。并支持使用 JCache(JSR-107) 注解简化我们的开发。 其使用方法和原理都类似于 Spring 对事务管理的支持,Spring Cache 是作用在方法上的,其核

    2024年02月10日
    浏览(30)
  • SpringBoot通过自定义注解实现多数据源

    ✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot通过自定义注解实现多数据源 📚个人知识库: Leo知识库,欢迎大家访问 大家好

    2024年02月03日
    浏览(37)
  • springboot自定义注解+aop+redis实现延时双删

    redis作为用的非常多的缓存数据库,在多线程场景下,可能会出现数据库与redis数据不一致的现象 数据不一致的现象:https://blog.csdn.net/m0_73700925/article/details/133447466 这里采用aop+redis来解决这个方法: 删除缓存 更新数据库 延时一定时间,比如500ms 删除缓存 这里之所以要延时一

    2024年01月17日
    浏览(32)
  • redis高级篇 springboot+redis+bloomfilter实现过滤案例

    Bloomfilter:默认是有0组成bit数组和hash函数构成的数据结构,用来判断在海量数据中是否存在某个元素。 应用案例:解决缓存穿透。Bloomfilter放在redis前面,如果查询bf中没有则直接返回,如果存在则查询redis,如果redis不存在,则查询mysql数据库。bf拦截一些不必要的请求。 1

    2024年02月15日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包