基于redis的分布式限频库

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 总述 这个库的目标是为了能够简单粗暴的实现分布式限频功能, 类似于ID生成器的用法, client每次从Redis拿回-批数据(在这里只是一个数值)进行消费, 只要没有消费完,就没有达到频率限制。 English README 优势 依赖少,只依赖redis,不需要专门的服务 使用的redis自己的时钟,不需要相应的服务器时钟完全一致 线程(协程)安全 系统开销小,对redis的压力很小 安装 go get github.com/vearne/ratelimit 用法 1. 创建 redis.Client 依赖 “github.com/go-redis/redis” client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "xxx", // password set DB: 0, // use default DB }) 2. 创建限频器 limiter, _ := ratelimit.NewRedisRateLimiter(client, "push", 1 * time.Second, 200, 10, ratelimit.TokenBucketAlg, ) 表示允许每秒操作200次 limiter, _ := ratelimit.NewRedisRateLimiter(client, "push", 1 * time.Minute, 200, 10, ratelimit.TokenBucketAlg, ) 表示允许每分钟操作200次 ...

August 24, 2018 · 2 min

利用redis实现分布式环境下的限频

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc redis 本身有计数器,并且可以做原子的增1操作,特别适合用来做分布式环境下的限频 # coding:utf-8 import time import threading from redis import StrictRedis class Counter(object): def __init__(self, redis_url): self.redis_client = StrictRedis.from_url(redis_url) def increment(self, key): t = int(time.time()) sign = t / 60 redis_key = key + ':' + str(sign) counter = self.redis_client.incr(redis_key) # 注:设置key的失效时间没有必要和原子增1操作包含在一个事务中。 self.redis_client.expire(redis_key, 300) # 设置key的失效时间300 seconds return counter if __name__ == '__main__': redis_url = 'redis://127.0.0.1:6379/0' c = Counter(redis_url) for i in range(100): time.sleep(0.2) x = c.increment('hello') if x > 50: print "over limit" print x 这里限频有个前提条件,就是分布式环境中时钟,必须尽量对齐。 在上面的例子中频率限制就是50次/分钟

January 1, 2018 · 1 min