class TokenBucketRateLimiter def initialize(user_id,rate, capacity) @rate = rate # 令牌发放速率(每秒发放的令牌数) @capacity = capacity # 令牌桶容量 @redis = $redis_cache @key = "#{user_id}:TokenBucket" end def refill now = Time.now.to_f * 1000 tokens = $redis_cache.hget(@key, 'tokens') timestamp = $redis_cache.hget(@key, 'timestamp') if tokens.nil? tokens = @capacity timestamp = now else tokens = [@capacity, tokens.to_i + (now - timestamp.to_f) * @rate / 1000].min timestamp = now end $redis_cache.hset(@key, 'tokens', tokens) $redis_cache.hset(@key, 'timestamp', timestamp) end def allow_request refill tokens = @redis.hget(@key, 'tokens') if !tokens.nil? && tokens.to_i >= 1 @redis.hset(@key, 'tokens', tokens.to_i - 1) return true end false end end =begin #测试通过 limiter = TokenBucketRateLimiter.new(user_id,10, 40) # 设置令牌发放速率为10,令牌桶容量为40 30.times do if limiter.allow_request puts "Allow" else puts "Reject" end end =end