redis 在业务层的使用之分布式限频

本文介绍了一种使用Redis实现的分布式限频策略,通过原子计数和时间戳地板除的方法,有效地控制了高并发场景下的请求频率,防止系统过载。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    限频一般反向代理都会有自带的一些设置参数,但是入口复杂的情况下,想做分布式限频,仅仅使用分布式反向代理的参数是完全不够用的,这里使用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 只负责计数,由业务逻辑负责阈值判断。

转载于:https://my.oschina.net/u/2950272/blog/1920480

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值