019 redis场景应用-分布式限流

1,限流概念:在开发高并发系统时,有很多种方法可用来保护系统,提升系统应用性能:缓存、降级、限流等。

缓存:提升系统访问速度,增大系统处理能力;
降级:服务出现问题或影响核心流程的性能时,需要暂时屏蔽,待高峰过去或问题解决后再打开,(某些场景下未不紧急或不关键的服务做优雅的降级处理,保障关键服务运行);
限流:部分场景比如:稀缺资源(秒杀,抢购)、写服务(评论、下单)、频繁复杂查询(评论最后几页)等,需要限制这些场景的并发/请求量;

        限流就是通过对并发访问/请求进行限速或一个时间窗口内的请求进行限速,从而达到保护系统的目的。一般系统可以通过压测来预估能处理的峰值,一旦达到设定的峰值阀值,则可以拒绝服务(定向错误页或告知资源没有了)、排队或等待(例如:秒杀、评论、下单)、降级(返回默认数据)

【限流不能乱用,否则正常流量会出现一些奇怪的问题,从而导致用户抱怨。】

2,限流算法:(常用令牌桶和漏桶算法)

漏桶

漏桶作为计量工具时,可用于流量整形和流量控制,漏桶的主要概念如下:

一个固定容量的漏桶,按照常量固定速率流出水滴(流出请求),如果桶是空的,则不需流出水滴可以以任意速率流入水滴到漏桶(流入请求),如果流入水滴超出了桶的容量,则流入的水滴溢出了(新流入的请求被拒绝),则漏桶容量是不变的,漏桶可以看做固定容量、固定流出速率的队列,漏桶限制的是请求的流出速率,漏桶中装的是请求;

令牌桶

令牌桶算法是一个存放固定容量令牌(token)的桶,按照固定速率往桶里添加令牌。令牌桶的主要概念如下:

令牌按固定的速率被放入令牌桶中,例如:r tokens/秒桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝
当一个n字节大小的数据包到达,将从桶中删除n个令牌,接着数据包被发送到网络上,如果桶中的令牌不足n个,则不会删除令牌,且数据包将被限流(丢弃或在缓冲区等待)令牌桶根据放令牌的速率(r tokens/s)去控制输出的速率(to network);

【信号量概念:在多线程环境下使用的一种设施或者一个类,可以保障两个或多个的关键代码不会被并发的调用,可以看做是一种锁的行为,即进入一段代码之前,线程必须获取信号量,处理完成释放信号量,其他要处理的线程必须等待执行代码的线程释放才能执行】
 

【具体代码实现过程中一直存在问题,参考以下代码】

https://blog.csdn.net/minicto/article/details/78779402

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值