Redis 实现单位时间内限制频率功能
1.使用场景
1.重要日志每小时触发次数。 2.限制登录次数。 3.分布式部署情况下的上述情况...
2.代码
示例中为限制1小时内15次
。
/** * 每个人每小时限制触发次数 */ private final int LOCK_TIMES = 15; // 自定义Key String key = "Ltz:" + sid; // 获取已触发次数 String sendUser = redisTemplate.opsForValue().get(key); // 为空,说明之前没有触发过 if (ObjectUtil.isEmpty(sendUser)) { // 空,说明是第一次,写入1,并且设置过期时间(1小时) redisTemplate.opsForValue().set(key, "1", 1, TimeUnit.HOURS); } else { // 后续发送 if (Integer.parseInt(sendUser) >= LOCK_TIMES) { // 超过限制次数 // TODO } redisTemplate.opsForValue().increment(key); } 复制代码
3.一个坑
使用redisTemplate
时,需要在使用时,注入RedisTemplate<String, String> redisTemplate
。
如果使用RedisTemplate<String, Object>
会报如下错。
ERR value is not an integer or out of range
作者:LitongZero
链接:https://juejin.cn/post/7025887047055310856