java redis并发案例_Java利用Redis实现高并发计数器的示例代码

a87d8a8c6576a46fa3d9cb13e1b828eb.png

业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。使用Redis的Incr自增命令可以轻松实现以上需求。以一个接口一天限制调用次数为例:

/**

* 是否拒绝服务

* @return

*/

private boolean denialOfService(String userId){

long count=JedisUtil.setIncr(DateUtil.getDate()+"&"+userId+"&"+"queryCarViolation", 86400);

if(count<=10){

return false;

}

return true;

}

/**

* 查询违章

* @param plateNumber车牌

* @param vin 车架号

* @param engineNo发动机

* @param request

* @param response

* @throws Exception

*/

@RequestMapping("/queryCarViolationList.json")

@AuthorizationApi

public void queryCarViolationList(@CurrentToken Token token,String plateNumber,String vin,

String engineNo,HttpServletRequest request,HttpServletResponse response) throws Exception {

String userId=token.getUserId();

//超过限制,拦截请求

if(denialOfService(userId)){

apiData(request, response, ReqJson.error(CarError.ONLY_5_TIMES_A_DAY_CAN_BE_FOUND));

return;

}

//没超过限制,业务逻辑……

}

每次调用接口之前,先获得下计数器自增后的值,如果小于限制,放行,执行后面的代码。如果大于限制,则拦截掉。

JedisUtil工具类:

public class JedisUtil {

protected final static Logger logger = Logger.getLogger(JedisUtil.class);

private static JedisPool jedisPool;

@Autowired(required = true)

public void setJedisPool(JedisPool jedisPool) {

JedisUtil.jedisPool = jedisPool;

}

/**

* 对某个键的值自增

* @author liboyi

* @param key 键

* @param cacheSeconds 超时时间,0为不超时

* @return

*/

public static long setIncr(String key, int cacheSeconds) {

long result = 0;

Jedis jedis = null;

try {

jedis = jedisPool.getResource();

result =jedis.incr(key);

if (result<=1 && cacheSeconds != 0) {

jedis.expire(key, cacheSeconds);

}

logger.debug("set "+ key + " = " + result);

} catch (Exception e) {

logger.warn("set "+ key + " = " + result);

} finally {

jedisPool.returnResource(jedis);

}

return result;

}

}

到此这篇关于Java利用Redis实现高并发计数器的示例代码的文章就介绍到这了,更多相关Java Redis 高并发计数器内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值