Redis使用Lua脚本保证原子性
Redis使用同一个Lua解释器来执行所有命令,同时,Redis保证以一种原子性的方式来执行脚本:当lua脚本在执行的时候,不会有其他脚本和命令同时执行,这种语义类似于 MULTI/EXEC。从别的客户端的视角来看,一个lua脚本要么不可见,要么已经执行完。
然而这也意味着,执行一个较慢的lua脚本是不建议的,由于脚本的开销非常低,构造一个快速执行的脚本并非难事。但是你要注意到,当你正在执行一个比较慢的脚本时,所以其他的客户端都无法执行命令。
我们通过lua和java注解实现一个流量限速功能
1.创建一个limit.lua
1 | local c |
2.java代码读取lua脚本,自动注入
1 | /** |
3.创建注解LimitPoint
1 | /** |
4.aop拦截操作
1 |
|
如上操作,我们通过下方的代码实现了流量限速,并且保证了原子性
1 | Number count = redisTemplate.execute(limitScript, keys, limitCount, limitPeriod); |
下面使我们的调用代码:
1 |
|
然后使我们的效果截图:
