xiejun
2024-11-01 80b6cbfc9c861469146318d0b3dd5f8b8b525b8a
Source/BladeX-Tool/blade-starter-redis/src/main/java/org/springblade/core/redis/ratelimiter/RateLimiterClient.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,91 @@
/*
 *      Copyright (c) 2018-2028, DreamLu All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *  Redistributions of source code must retain the above copyright notice,
 *  this list of conditions and the following disclaimer.
 *  Redistributions in binary form must reproduce the above copyright
 *  notice, this list of conditions and the following disclaimer in the
 *  documentation and/or other materials provided with the distribution.
 *  Neither the name of the dreamlu.net developer nor the names of its
 *  contributors may be used to endorse or promote products derived from
 *  this software without specific prior written permission.
 *  Author: DreamLu å¢æ˜¥æ¢¦ (596392912@qq.com)
 */
package org.springblade.core.redis.ratelimiter;
import org.springblade.core.tool.function.CheckedSupplier;
import org.springblade.core.tool.utils.Exceptions;
import java.util.concurrent.TimeUnit;
/**
 * RateLimiter é™æµ Client
 *
 * @author L.cm
 */
public interface RateLimiterClient {
   /**
    * æœåŠ¡æ˜¯å¦è¢«é™æµ
    *
    * @param key è‡ªå®šä¹‰çš„key,请保证唯一
    * @param max æ”¯æŒçš„æœ€å¤§è¯·æ±‚
    * @param ttl æ—¶é—´,单位默认为秒(seconds)
    * @return æ˜¯å¦å…è®¸
    */
   default boolean isAllowed(String key, long max, long ttl) {
      return this.isAllowed(key, max, ttl, TimeUnit.SECONDS);
   }
   /**
    * æœåŠ¡æ˜¯å¦è¢«é™æµ
    *
    * @param key      è‡ªå®šä¹‰çš„key,请保证唯一
    * @param max      æ”¯æŒçš„æœ€å¤§è¯·æ±‚
    * @param ttl      æ—¶é—´
    * @param timeUnit æ—¶é—´å•位
    * @return æ˜¯å¦å…è®¸
    */
   boolean isAllowed(String key, long max, long ttl, TimeUnit timeUnit);
   /**
    * æœåŠ¡é™æµï¼Œè¢«é™åˆ¶æ—¶æŠ›å‡º RateLimiterException å¼‚常,需要自行处理异常
    *
    * @param key      è‡ªå®šä¹‰çš„key,请保证唯一
    * @param max      æ”¯æŒçš„æœ€å¤§è¯·æ±‚
    * @param ttl      æ—¶é—´
    * @param supplier Supplier å‡½æ•°å¼
    * @return å‡½æ•°æ‰§è¡Œç»“æžœ
    */
   default <T> T allow(String key, long max, long ttl, CheckedSupplier<T> supplier) {
      return allow(key, max, ttl, TimeUnit.SECONDS, supplier);
   }
   /**
    * æœåŠ¡é™æµï¼Œè¢«é™åˆ¶æ—¶æŠ›å‡º RateLimiterException å¼‚常,需要自行处理异常
    *
    * @param key      è‡ªå®šä¹‰çš„key,请保证唯一
    * @param max      æ”¯æŒçš„æœ€å¤§è¯·æ±‚
    * @param ttl      æ—¶é—´
    * @param timeUnit æ—¶é—´å•位
    * @param supplier Supplier å‡½æ•°å¼
    * @param <T>
    * @return å‡½æ•°æ‰§è¡Œç»“æžœ
    */
   default <T> T allow(String key, long max, long ttl, TimeUnit timeUnit, CheckedSupplier<T> supplier) {
      boolean isAllowed = this.isAllowed(key, max, ttl, timeUnit);
      if (isAllowed) {
         try {
            return supplier.get();
         } catch (Throwable e) {
            throw Exceptions.unchecked(e);
         }
      }
      throw new RateLimiterException(key, max, ttl, timeUnit);
   }
}