Redis限流失去作用(redis限流无效)
Redis限流是利用Redis服务在一定时间内限制客户端访问频率的一种有效解决方案。它通过在Redis中存储一些限流规则,使客户端在访问某个服务时,自动做出合理的限流处理,以达到保护服务质量的作用。
Redis限流也经常被用来应对攻击,通过限制过快的访问请求,同时通过令牌柜/令牌桶算法等来实现准入控制,可以有效避免攻击者对服务的高频攻击。
然而在有些情况下,Redis限流依然会失去作用,而原因也很简单明了:
1. 如果准入控制策略有缺陷,攻击可能会事半功倍,Redis限流可能看来像孩子一样把门给推开了。
2. 如果Redis服务出现雪崩效应,将导致限流无效,客户端得不到稳定的限流服务,很容易发生集中访问和高频攻击。
因此,对于Redis限流,要想有效发挥它的作用,既要及时补充准入控制策略,避免攻击者高频率攻击;也要及时完善Redis数据库的可用性,保证其较高的稳定性,从而能够给客户端提供稳定的服务质量。
Redis限流是一种有效的服务限流能力,也是一种可以有效保护服务质量的相对可靠的技术。 但是它在某些情况下,依然可能失去作用,主要原因在于准入策略上的缺陷,以及Redis服务的可用性上的差异。 因此,要想有效的发挥Redis限流的作用,我们要及时补充准入控制策略,及时完善Redis数据库的可用性。
//Redis限流示例
local ip = KEYS[1]local limitCount = tonumber(ARGV[1])
local currentTime = ARGV[2]
if redis.call('get',ip) then --检查是否超过限制
if tonumber(redis.call('get',ip)) >= limitCount then return 0
else --没有超过限流
redis.call('INCRBY', ip, 1) redis.call('EXPIRE',ip, currentTime+60)
return 1 end
else --没有这个IP就设置
redis.call("SET",ip,1) redis.call('EXPIRE',ip, currentTime+60)
return 1end