魔幻电脑桌面 | 魔幻电脑游戏最后
663 2023-04-03 00:38:21
Long maxAllowedTimes = 100L;Long REQUEST_EXIT_MILLISECONDS = 60*1000L;代码块二:
Jedis jedis = RedisUtils.getJedis();String requestKey = Times + ":" + ID + ":" + getId();if (jedis.exists(requestKey)) { //???jedis.incr(requestKey);String times = jedis.get(requestKey);if (StringUtil.strIsNotEmpty(times)){if (Long.parseLong(times) > maxAllowedTimes) {jedis.del(requestKey);return true;}}} else {jedis.set(requestKey, "1");jedis.pexpire(requestKey,REQUEST_EXIT_MILLISECONDS);}实际上问题来了,maxAllowedTimes给设置成1000次,而实际上每分钟没有超过1000次的去访问数也能return true。
解决方案:得对症下药啊
Jedis jedis = RedisUtils.getJedis();String requestKey = Times + ":" + ID + ":" + getId();jedis.incr(requestKey);//如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作,且将key的有效时间设置为长期有效.String times = jedis.get(requestKey);if("1".equals(times)){jedis.pexpire(requestKey,REQUEST_EXIT_MILLISECONDS);//如果是第一次访问,设置key的有效时间} else if(StringUtils.isEmpty(times)){//如果key过期了,再incr(从第1次开始记录),再设置key的有效时间jedis.incr(requestKey);jedis.pexpire(requestKey,REQUEST_EXIT_MILLISECONDS);times = jedis.get(requestKey);}if (times != null && Long.parseLong(times) > maxAllowedTimes) {jedis.del(requestKey);return true;}至此,问题解决。
另外:
Redis Incrby 命令将 key 中储存的数字加上指定的增量值,如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
Redis Hincrby 命令用于为哈希表中的字段值加上指定增量值。