首先,需要在项目中引入 Redis 客户端库,比如 Jedis。

其次,可以使用 Redis 的 incr 命令来实现限流。incr 命令将存储在键上的数字值加一,如果该键不存在,则在执行 incr 命令之前将其设置为 0。因此,我们可以设置一个计数器,并在每次请求时对其进行递增。如果计数器的值超过了我们设定的阈值,则表示超过了限流限制,可以拒绝该请求。

下面是一个简单的示例代码,展示了如何使用 Redis 实现限流:

import redis.clients.jedis.Jedis;

public class RedisRateLimiter {
  private Jedis jedis;

  public RedisRateLimiter(Jedis jedis) {
    this.jedis = jedis;
  }

  public boolean isActionAllowed(String userId, String actionKey, int period, int maxCount) {
    String key = String.format("hist:%s:%s", userId, actionKey);
    long nowTs = System.currentTimeMillis();
    jedis.zadd(key, nowTs, ""+nowTs);
    jedis.zremrangeByScore(key, 0, nowTs - period * 1000);
    long count = jedis.zcard(key);
    return count <= maxCount;
  }
}

上述代码中,isActionAllowed 方法接收四个参数:

  • userId:用户的唯一标识符
  • actionKey:行为的唯一标识符,比如发布评论、发送私信等
  • period:时间窗口,单位为秒
  • maxCount:在时间窗口内允许的最大操作次数

更多推荐