linux怎么查看本机内存大小
278
2022-11-20
java秒杀之redis限流操作详解
最近写到了一个秒杀的功能模块,为了保证高并发情况下不会宕机,要从多方面去考虑,当前的限流操作只是其中的一个方面,具体操作如下。
导入所需依赖
编写注解
@Retention(RUNTIME)//运行时有效
@Target(ElementType.METHOD)//用在方法上
public @interface AccessLimit {
int seconds();//时间范围(单位:秒)
int maxCount();//在这个时间范围内最大访问次数
}
编写拦截器
public class AcessLimiitInterceptor implements HandlerInterceptor {
//注入redisTemplate
@Autowired
private 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 //访问次数+1 redisTemplate.opsForValue().increment(key,1); //设置剩余过期时间(修改完该key的value值后,对应的过期时间会失效,需重新设置) redisTemplate.expire(key,keySeconds, TimeUnit.SECONDS); }else{//在该时间范围内已经超过最大的访问次数 return false; } } //放行 return true; } } 编写application.xml xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:context="http://springframework.org/schema/context" xmlns:aop="http://springframework.org/schema/aop" xmlns:tx="http://springframework.org/schema/tx" xmlns:p="http://springframework.org/schema/p" xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd http://springframework.org/schema/context http://springframework.org/schema/context/spring-context.xsd http://springframework.org/schema/aop http://springframework.org/schema/aop/spring-aop.xsd http://springframework.org/schema/tx http://springframework.org/schema/tx/spring-tx.xsd"> p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/> 配置web.xml 注解应用 @AccessLimit(seconds = 500,maxCount = 3) @RequestMapping(value = "/findAll") public String findAll(Model model){ System.out.println("csl"); return "list"; } 总 结 以上操作就完成了java后台使用redisTemplate的限流操作,这里还需各位自己开启一个redis服务端并且把配置文件中的地址改成对应的ip,希望以上内容对大家有帮助,多提宝贵意见。
//访问次数+1
redisTemplate.opsForValue().increment(key,1);
//设置剩余过期时间(修改完该key的value值后,对应的过期时间会失效,需重新设置)
redisTemplate.expire(key,keySeconds, TimeUnit.SECONDS);
}else{//在该时间范围内已经超过最大的访问次数
return false;
}
}
//放行
return true;
}
}
编写application.xml
xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:context="http://springframework.org/schema/context" xmlns:aop="http://springframework.org/schema/aop" xmlns:tx="http://springframework.org/schema/tx" xmlns:p="http://springframework.org/schema/p" xsi:schemaLocation="http://springframework.org/schema/beans http://springframework.org/schema/beans/spring-beans.xsd http://springframework.org/schema/context http://springframework.org/schema/context/spring-context.xsd http://springframework.org/schema/aop http://springframework.org/schema/aop/spring-aop.xsd http://springframework.org/schema/tx http://springframework.org/schema/tx/spring-tx.xsd"> p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>
xmlns:xsi="http://w3.org/2001/XMLSchema-instance"
xmlns:context="http://springframework.org/schema/context"
xmlns:aop="http://springframework.org/schema/aop"
xmlns:tx="http://springframework.org/schema/tx"
xmlns:p="http://springframework.org/schema/p"
xsi:schemaLocation="http://springframework.org/schema/beans
http://springframework.org/schema/beans/spring-beans.xsd
http://springframework.org/schema/context
http://springframework.org/schema/context/spring-context.xsd
http://springframework.org/schema/aop
http://springframework.org/schema/aop/spring-aop.xsd
http://springframework.org/schema/tx
http://springframework.org/schema/tx/spring-tx.xsd">
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>
p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}" p:pool-config-ref="poolConfig"/>
配置web.xml
注解应用
@AccessLimit(seconds = 500,maxCount = 3)
@RequestMapping(value = "/findAll")
public String findAll(Model model){
System.out.println("csl");
return "list";
}
总 结
以上操作就完成了java后台使用redisTemplate的限流操作,这里还需各位自己开启一个redis服务端并且把配置文件中的地址改成对应的ip,希望以上内容对大家有帮助,多提宝贵意见。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~