千家信息网

java中如何实现redis限流操作

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章给大家分享的是有关java中如何实现redis限流操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体操作如下。导入所需依赖 UTF-8
千家信息网最后更新 2025年01月16日java中如何实现redis限流操作

这篇文章给大家分享的是有关java中如何实现redis限流操作的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

具体操作如下。

导入所需依赖

    UTF-8    1.8    1.8    5.0.2.RELEASE    1.6.6    1.2.12    5.1.6    3.4.5              org.aspectj      aspectjweaver      1.6.8              org.springframework      spring-aop      ${spring.version}              org.springframework      spring-context      ${spring.version}              org.springframework      spring-web      ${spring.version}              org.springframework      spring-webmvc      ${spring.version}              org.springframework      spring-test      ${spring.version}              org.springframework      spring-tx      ${spring.version}              org.springframework      spring-jdbc      ${spring.version}              junit      junit      4.12      compile              mysql      mysql-connector-java      ${mysql.version}              javax.servlet      servlet-api      2.5      provided              javax.servlet.jsp      jsp-api      2.0      provided              jstl      jstl      1.2                  log4j      log4j      ${log4j.version}              org.slf4j      slf4j-api      ${slf4j.version}              org.slf4j      slf4j-log4j12      ${slf4j.version}                  org.mybatis      mybatis      ${mybatis.version}              org.mybatis      mybatis-spring      1.3.0              c3p0      c3p0      0.9.1.2      jar      compile              org.springframework.data      spring-data-redis      1.7.2.RELEASE              redis.clients      jedis      2.8.1    

编写注解

@Retention(RUNTIME)//运行时有效@Target(ElementType.METHOD)//用在方法上 public @interface AccessLimit {     int seconds();//时间范围(单位:秒)     int maxCount();//在这个时间范围内最大访问次数 }

编写拦截器

public class AcessLimiitInterceptor implements HandlerInterceptor { //注入redisTemplate    @Autowired    private RedisTemplate redisTemplate;    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {     //设置redisTemplate的序列化方式(必须设置为这种方式,因为要用到incr)        redisTemplate.setKeySerializer(new StringRedisSerializer());        redisTemplate.setValueSerializer(new StringRedisSerializer());               if(handler instanceof HandlerMethod){         //查看该方法上是否有@AcessLimit注解            HandlerMethod hm= (HandlerMethod) handler;            AccessLimit accessLimit=hm.getMethodAnnotation(AccessLimit.class);            //没有@AcessLimit注解,证明无限流操作,直接放行            if(accessLimit==null){                return true;            }             //获取注解的参数值            int seconds=accessLimit.seconds();//时间范围            int maxCount=accessLimit.maxCount();//时间范围内的最大访问次数            //该请求的路径            String key=request.getRequestURI();            //在该时间范围内已经访问的次数            String countStr=redisTemplate.opsForValue().get(key);            Integer count=null;            //如果不是第一次访问,则把访问次数转换为integer类型            if(countStr!=null){                count= Integer.valueOf(redisTemplate.opsForValue().get(key));            }   //拿到访问次数的过期时间            Long keySeconds=redisTemplate.getExpire(key);            //该时间范围内没有访问            if(count==null){             //第一次访问,设置key为访问路径,值为访问次数1                redisTemplate.opsForValue().set(key,1+"");                //设置过期时间                redisTemplate.expire(key,600, TimeUnit.SECONDS);            }else if(count

编写application.xml

                                                                                                                                                                                                                                                                                            

配置web.xml

  Archetype Created Web Application        org.springframework.web.context.ContextLoaderListener          contextConfigLocation    classpath:applicationContext.xml          dispatcherServlet    org.springframework.web.servlet.DispatcherServlet              contextConfigLocation      classpath:springmvc.xml            1        dispatcherServlet    /          characterEncodingFilter    org.springframework.web.filter.CharacterEncodingFilter          encoding      UTF-8            characterEncodingFilter    /*    

注解应用

@AccessLimit(seconds = 500,maxCount = 3)    @RequestMapping(value = "/findAll")    public String findAll(Model model){        System.out.println("csl");        return "list";    }

感谢各位的阅读!关于"java中如何实现redis限流操作"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

0