Redis 计数器
Posted 楼兰胡杨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis 计数器相关的知识,希望对你有一定的参考价值。
业务需求中经常有需要用到计数器的场景:为了防止恶意刷接口,需要设置一个接口每个IP一分钟、一天等的调用次数阈值;为了降低费用,限制发送短信的次数等。使用Redis的Incr自增命令可以轻松实现以上需求,而且避免验证码带来的弊端,如不够人性化,用户操作时间长、体验差等。以一个接口每个IP每分钟限制调用100次为例:
private boolean isDenied(String ip){
SimpleDateFormat sdf = new SimpleDateFormat("YYYYMMDDHHmm");
String time = sdf.format(Calendar.getInstance().getTime());
long count=JedisUtil.setIncr(time +"_"+ip+"_IP", 86400);
if(count<=100){ return false; } return true; }
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 (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; } }
参考文献:https://blog.csdn.net/qq_33556185/article/details/79427271
以上是关于Redis 计数器的主要内容,如果未能解决你的问题,请参考以下文章