Java 杂谈

redis 与 lua 的结合

2019-04-08  本文已影响6人  fkxuexi

一、前言:

redis 为我们提供了很多的命令,但是很多时候我们需要组合这些命令,但是有设计到一个问题:命令组合起来之后,在高并发的情况下,怎么保证原子性呢?此时lua为我们提供了解决的方案。lua 还是比较好入门的,但是我今天在玩这个玩意儿的时候还是遇到了很多问题,因为分享出来希望大家不会遇到这个问题。

二、还是言明环境:

三、lua 与 reids 的简单入门:

这里只是做一个简单的介绍,因为在这里详细的介绍一门语言不现实,还是以使用为主,

3.1 实现一个简单的需求:

3.2 lua 的简单入门:

if    true then
  todo
end
for i=0,len do
  todo
end

3.3 开始实战:

新建文件以 .lua 结尾

-- 接受key
local key = KEYS[1]
-- 接受过期时间
local ttl = ARGV[1]
-- 需要生成的个数
local len = ARGV[2] 
-- 定义一个接受的数组,来接受批量生成的序列号
local codeArr = {}
-- 判断,如果key不存在,则先初始化key,且设置过期时间
if redis.call('EXISTS',key) == 0 then 
-- 插入一条记录
    redis.call('SET',key,0)
-- 设置过期时间
    redis.call('EXPIRE',key,ttl)
end
for i = 0 , len do
-- 循环产生序列号,并放置到数组当中,
    codeArr[i] = redis.call('INCR',key)
end 
-- 返回给客户端
return codeArr  

3.4 redis 客户端调用 lua 脚本

ps:注意下面演示的是在 windows 的环境下

redis-cli.exe --eval ExistAndIncre.lua RESERVE_CODE , 100000 10

需要注意的是:

四、lua 的好处:

lua 主要是类似于批处理的功能,把众多的命令组合起来进行执行,但是这些在 lua 脚本中组合的命令是原子的,在高并发的情况下很多时候判断和执行如果不是原子的话,由于先后顺序的原因很有可能发生数据不一致的情况,所以我们要避免在判断和执行之间不能有时间窗口,lua就是为了解决这个问题的

很多复杂的场景中,需要组合众多的 redis 的命令的时候就可以考虑 lua ,在 redisson 的框架中的实现也是大量的采用了lua脚本的

由于工作需要来学习的,所以不是很深入,以后有机会再使用到在慢慢的补。

博客首发地址csdn:https://blog.csdn.net/weixin_42849915
简书地址:https://www.jianshu.com/u/4b48be4cf59f
希望结识更多的乐于分享的伙伴一起前行

上一篇下一篇

猜你喜欢

热点阅读