Redis实现接口防抖的示例代码

 更新时间:2024年10月14日 11:32:21   作者:何中应  
本文介绍了一种通过AOP、自定义注解和Redis实现的接口防抖技术,这种方法能有效避免因网络波动等原因短时间内发送多个请求导致的数据重复添加问题,感兴趣的可以了解一下

说明:实际开发中,我们在前端页面上点击了一个按钮,访问了一个接口,这时因为网络波动或者其他原因,页面上没有反应,用户可能会在短时间内再次点击一次或者用户以为没有点到,很快的又点了一次。导致短时间内发送了两个请求到后台,可能会导致数据重复添加。

为了避免短时间内对一个接口访问,我们可以通过AOP+自定义注解+Redis的方式,在接口上加一个自定义注解,然后通过AOP的前置通知,在Redis中存入一个有效期的值,当访问接口时这个值还未过期,则抛出异常,以此来避免短时间内对接口的方法。

实现

第一步:创建一个自定义注解,设置两个属性,一个是key,一个是这个key在Redis中的有效时间;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 自定义注解
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LimitAccess {

    /**
     * 限制访问的key
     * @return
     */
    String key();

    /**
     * 限制访问时间
     * @return
     */
    int times();
}

第二步:创建对应的Aspect;

import com.hezy.annotation.LimitAccess;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

/**
 * AOP类(通知类)
 */
@Component
@Aspect
public class LimitAspect {

    @Autowired
    private RedisTemplate redisTemplate;

    @Pointcut("@annotation(com.hezy.annotation.LimitAccess)")
    public void pt(){};

    @Around("pt()")
    public Object aopAround(ProceedingJoinPoint pjp) throws Throwable {
        // 获取切入点上面的自定义注解
        Signature signature = pjp.getSignature();

        MethodSignature methodSignature = (MethodSignature) signature;

        // 获取方法上面的注解
        LimitAccess limitAccess = methodSignature.getMethod().getAnnotation(LimitAccess.class);

        // 获取注解上面的属性
        int limit = limitAccess.times();
        String key = limitAccess.key();

        // 根据key去找Redis中的值
        Object o = redisTemplate.opsForValue().get(key);

        // 如果不存在,说明是首次访问,存入Redis,过期时间为limitAccess中的time
        if (o == null) {
            redisTemplate.opsForValue().set(key, "", limit, TimeUnit.SECONDS);
            // 执行切入点的方法
            return pjp.proceed();
        } else {
            // 如果存在,说明不是首次访问,抛出异常
            throw new RuntimeException("访问过于频繁");
        }
    }
}

第三步:在需要限制的接口上,加上这个注解,并设置key和限制访问时间,如下这个这个接口,设置key为limit,实际开发中可以设置一个随机值,或者按照规则自定义设置,times为限制访问时间;

    @GetMapping("/limit")
    @LimitAccess(key = "limit", times = 10)
    public String limit() {
        return "success";
    }

演示

启动项目,访问该接口;

(首次访问,没得问题,同时在Redis中存入值)

在这里插入图片描述

(短时间内,连续访问,因为Redis中值未过期)

在这里插入图片描述

在这里插入图片描述

(10秒之后再访问,又可以了,Redis中的值过期了)

在这里插入图片描述

以上就是使用Redis实现接口防抖,避免短时间内连续访问接口。实际开发中,可以将异常设置为自定义异常。

到此这篇关于Redis实现接口防抖的示例代码的文章就介绍到这了,更多相关Redis 接口防抖内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Redis性能大幅提升之Batch批量读写详解

    Redis性能大幅提升之Batch批量读写详解

    这篇文章主要给大家介绍了关于Redis性能大幅提升之Batch批量读写的相关资料,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来跟着小编一起来学习学习吧。
    2017-06-06
  • 详解Redis中的BigKey如何发现和处理

    详解Redis中的BigKey如何发现和处理

    这篇文章主要为大家详细介绍了Redis中的BigKey如何发现和处理,文中给大家详细讲解了BigKey危害和如何解决这些问题,文章通过代码示例和图文介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Redis常见分布锁的原理和实现

    Redis常见分布锁的原理和实现

    这篇文章主要介绍了Redis常见分布锁的原理和实现,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Redis Desktop Manager(Redis可视化工具)安装及使用图文教程

    Redis Desktop Manager(Redis可视化工具)安装及使用图文教程

    这篇文章主要介绍了Redis Desktop Manager(Redis可视化工具)安装及使用图文教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • redis如何实现清空缓存

    redis如何实现清空缓存

    这篇文章主要介绍了redis如何实现清空缓存,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • redis zrange 与 zrangebyscore的区别解析

    redis zrange 与 zrangebyscore的区别解析

    这篇文章主要介绍了redis zrange与zrangebyscore的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Redis 操作多个数据库的配置的方法实现

    Redis 操作多个数据库的配置的方法实现

    本文主要介绍了Redis 操作多个数据库的配置的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • Redis中big keys发现与解决过程

    Redis中big keys发现与解决过程

    文章从bigkeys的定义、产生原因、危害、如何发现以及处理方法等方面详细介绍了Redis中bigkeys的问题,bigkeys会导致请求响应慢、网络卡顿、数据丢失等问题,需要通过异步删除、拆分key等方法进行处理
    2026-04-04
  • 一文浅析如何在Redis中实现缓存功能

    一文浅析如何在Redis中实现缓存功能

    Redis 是一种高性能的键值存储系统,广泛用于实现缓存功能,这篇文章主要为大家详细介绍了如何在Redis中实现缓存功能,需要的小伙伴可以了解下
    2025-06-06
  • Redis中一些最常见的面试问题总结

    Redis中一些最常见的面试问题总结

    Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行各种刁难。下面这篇文章主要给大家总结介绍了关于Redis中一些最常见的面试问题,需要的朋友可以参考下
    2018-09-09

最新评论