本文摘自PHP中文网,作者尚,侵删。
业务需求中经常有需要用到计数器的场景:譬如一个手机号一天限制发送5条短信、一个接口一分钟限制多少请求、一个接口一天限制调用多少次等等。使用Redis的Incr自增命令可以轻松实现以上需求。以一个接口一天限制调用次数为例:
1 2 3 4 5 6 7 8 9 10 11 |
private boolean denialOfService(String userId){
long count =JedisUtil.setIncr(DateUtil. getDate ()+ "&" +userId+ "&" + "queryCarViolation" , 86400);
if ( count <=10){
return false;
}
return true;
}
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
@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工具类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | 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;
}
public static long setIncr(String key, int cacheSeconds) {
long result = 0;
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
result =jedis.incr(key);
if (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;
}
}
|
更多redis知识请关注redis入门教程栏目。
以上就是redis实现高并发计数的详细内容,更多文章请关注木庄网络博客!
相关阅读 >>
Redis列表类型介绍
Redis为什么那么快
Redis整数集不能降级?为什么?
windows下搭建Redis集群示例
使用Redis数据库存储用户信息
如何配置Redis外网可访问并只允许指定的ip可访问Redis
设置Redis开机启动的方法
2个Redis怎么配
Redis是线程安全的吗
Redis压缩列表的详细介绍(示例讲解)
更多相关阅读请进入《Redis》频道 >>
机械工业出版社
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。
转载请注明出处:木庄网络博客 » redis实现高并发计数