openresty 中使用lua 的类库 lua-resty-lock,来实现异步非阻塞锁

LuaRestyLock:缓存失效风暴

看下下面的伪代码:

看上去没有什么问题,但是在进行压力测试的时候,会发现,每隔100秒,数据库的查询就会出现一次峰值。如果你的cache失效时间设置的过长,那么这个问题就会发现的概率比较小。

想象下,在cache失效的瞬间,如果并发请求10000条同时到了query_db(sql)回源到后端数据库中,如果数据库扛不住的话,那就会出现数据库死掉现象,导致不可用,这就是缓存失效瞬间引起的风暴。

解决方案:自然的想法是发现缓存失效后,加一把锁来控制数据库d的请求,这就要使用到lua_resty_lock类库了。

应对高并发系统,缓存是必不可少的利器,巧妙的使用缓存会使系统的性能有质的飞跃,下面就介绍一下本系统使用缓存的几种方式。

使用Redis缓存

首先看一下使用Redis缓存的简单数据流向图:

很典型的使用缓存的一种方式,这里先重点介绍一下在缓存命中与不命中时都做了哪些事。

当用户发起请求后,首先在Nginx这一层直接从Redis获取数据, 这个过程中Nginx使用lua-resty-redis操作Redis,该模块支持网络Socket和unix domain socket。如果命中缓存,则直接返回客户端。如果没有则回源请求数据,这里要记住另一个原则,不可『随意回源』(为了保护后端应用)。为了解决高并发下缓存失效后引发的雪崩效应,我们使用lua-resty-lock(异步非阻塞锁)来解决这个问题。</

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值