redis 在业务层的使用之分布式限频
2018-07-31 21:09
567 查看
限频一般反向代理都会有自带的一些设置参数,但是入口复杂的情况下,想做分布式限频,仅仅使用分布式反向代理的参数是完全不够用的,这里使用redis 比较好实现,为啥呢?还不是基于redis 的原子性!
使用redis 实现分布式限频,如何做呢?一个是原子计数,一个是按时间戳地板除。
下面是一个简单的python 封装,用于演示基本原理:
#encoding=utf8 import redis import time import threading host = "127.0.0.1" port = "6379" password = "123123" db = 0 pool = redis.ConnectionPool(host=host, port=port, password=password, db=db) rd = redis.StrictRedis(connection_pool=pool) class Counter(object): def __init__(self, key, delta = 1): self.redis_client = rd self.delta = delta self.key = key def increment(self): t = int(time.time()) sign = t / self.delta redis_key = self.key + '_' + str(sign) counter = self.redis_client.incr(redis_key) self.redis_client.expire(redis_key, 10 * self.delta) # 控制时间,防止爆掉内存 return counter def add_task(item): c = Counter("test", 60) # key 为test,计数周期为60s threshold = 100 for i in range(1000): time.sleep(0.2) x = c.increment() if x > threshold: print "over limit" else: print "thread:%s ,itme:%s" % (item, x) if __name__ == '__main__': t1 = threading.Thread(target=add_task, args=(1,)) t2 = threading.Thread(target=add_task, args=(2,)) t1.start() t2.start() t1.join() t2.join()
封装的要点是对当前时间地板除,参数key 为要计数的key,delta 就是计数周期,redis 只负责计数,由业务逻辑负责阈值判断。
相关文章推荐
- 分布式中使用Redis实现Session共享
- Java使用Redis实现分布式锁
- Jedis使用总结【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】
- 基于Redis实现分布式锁,Redisson使用及源码分析
- 分布式架构学习之:032--使用Redis3.0集群实现Tomcat集群的Session共享
- JEESZ-Redis分布式缓存安装和使用
- NetCore入门篇:(九)Net Core项目使用Session及用Redis做分布式
- 为什么我们做分布式使用Redis?
- 记一次线上 redis 使用分布式锁坑
- 分布式缓存Redis使用心得
- 分布式架构学习之:016--Redis的安装与使用(单节点)
- Jedis使用总结【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】(转)
- 如何使用redis实现分布式锁
- Net分布式系统之五:C#使用Redis集群缓存
- 分布式业务Redis安装与集群配置
- 为什么我们做分布式使用Redis?
- 分布式缓存技术redis学习系列----深入理解Spring Redis的使用
- 分布式缓存技术redis学习系列(五)——spring-data-redis与JedisPool的区别、使用ShardedJedisPool与spring集成的实现及一致性哈希分析
- 关于redis中使用锁机制,( 实现分布式锁和任务队列)
- JEESZ-Redis分布式缓存安装和使用