美文网首页
Redis中使用Lua控制事务

Redis中使用Lua控制事务

作者: Zhang小二 | 来源:发表于2019-04-04 17:38 被阅读0次

业务场景

说明:object1对象存在很多key,如k1、k2...kn,且对象存在ttl时间,到期会被自动删除
1、判断object1 hash对象是否存在
2、若对象存在,则只更新k1字段
3、若对象不存在,则需要将其他字段同时写入
4、重新更新object1的ttl时间
以上操作需要在同一个事务中操作,若进行第2步操作时,ttl刚好到期,则会出现只有k1字段的object1。

在这里,使用watch+multi做不到监控对象到期,考虑了一下,决定使用lua进行原子操作。
当然,不需要所有的逻辑都放到lua脚本里,只需要实现判断object1对象是否存在,若存在则暂时清理ttl时间。

Lua脚本

local key = KEYS[1]
local isexist = redis.call("exists",key)
if(isexist == 1) then
    redis.call("persist",key)
end
return isexist

验证

127.0.0.1:6379> expire bbb 100
(integer) 1
127.0.0.1:6379> ttl bbb
(integer) 98

执行lua查询
$redis-cli --eval t.lua bbb
(integer) 1

127.0.0.1:6379> ttl bbb
(integer) -1
127.0.0.1:6379> 

注册脚本

$redis-cli script load "`cat t.lua`"
"c1540490eb505d23336f03189c9dd2876578b0bc"

使用SHA-1标识符查询
$redis-cli evalsha c1540490eb505d23336f03189c9dd2876578b0bc 1 bbb
(integer) 1

判断SHA-1是否存在
$redis-cli script exists c1540490eb505d23336f03189c9dd2876578b0bc
1) (integer) 1

调试脚本

$redis-cli --ldb --eval t.lua bbb
Lua debugging session started, please use:
quit    -- End the session.
restart -- Restart the script in debug mode again.
help    -- Show Lua script debugging commands.

* Stopped at 1, stop reason = step over
-> 1   local key = KEYS[1]
lua debugger> s
* Stopped at 2, stop reason = step over
-> 2   local isexist = redis.call("exists",key)
lua debugger> s
<redis> exists bbb
<reply> 1
* Stopped at 3, stop reason = step over
-> 3   if(isexist == 1) then
lua debugger> p isexist
<value> 1
lua debugger> s
* Stopped at 4, stop reason = step over
-> 4       redis.call("persist",key)
lua debugger> s
<redis> persist bbb
<reply> 0
* Stopped at 6, stop reason = step over
-> 6   return isexist
lua debugger> s

(integer) 1

(Lua debugging session ended -- dataset changes rolled back)

127.0.0.1:6379> 

使用逻辑

Lua脚本在Redis重启后会自动消失,程序的处理流程为:
1、首次启用时,若没有Lua SHA-1,则将脚本注册到Redis
由于脚本内容相同时,重复注册获取到大SHA也是唯一的,可暂不考虑保存SHA-1
2、Redis重连时,将SHA置空,下次访问时,重新注册。
3、若Redis重连在公共包中,程序不知道是否重连的情况下,可在运行过程中判断是否出现
“(error) NOSCRIPT No matching script. Please use EVAL.”报错信息,出现时,重新注册。

程序实现逻辑不在此文实现。
说明:由于Lua中没有sleep功能,不易呈现key到期时的查询,只能简单测试,只能通过业务场景中出现的几率判断。

相关文章

  • Redis中使用Lua控制事务

    业务场景 说明:object1对象存在很多key,如k1、k2...kn,且对象存在ttl时间,到期会被自动删除1...

  • Redis中调用Lua脚本阻塞

    在高并发系统中,redis的使用会比较频繁,lua脚本让redis的使用更加灵活。redis中使用lua脚本的好处...

  • 像调试java一样来调试Redis lua

    高并发的系统中,redis的使用是非常频繁的,而lua脚本则更是锦上添花。因为lua脚本本身执行的时候是一个事务性...

  • Redis学习笔记-Lua脚本

    前言 Redis在2.6版推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。 在Lua脚本中可...

  • springboot中redis的使用(三)

    接上一次springboot中redis的使用(二) Redis脚本的使用步骤 写Lua脚本, 放在Resourc...

  • Redis 脚本

    Redis 脚本 Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua ...

  • 《redis学习》之lua

    Redis+Lua的好处 redis在2.6开始加入了lua脚本,使用lua脚本有如下好处: 减少网络开销。复合操...

  • redis lua脚本redis事务实现 商品秒杀活动案例

    redis lua脚本redis事务实现 商品秒杀活动案例 1. 前言 redis 利用单线程 IO多路复用 实现...

  • lua与redis pipeline

    lua Redis在2.6版引入了对Lua的支持 使用Lua可以非常明显的提升Redis的效率。 只要脚本所对应的...

  • 分布式锁之redis-lua脚本

    目录 redis分布式锁,Lua,Lua脚本,lua redis,redis lua 分布式锁,redis set...

网友评论

      本文标题:Redis中使用Lua控制事务

      本文链接:https://www.haomeiwen.com/subject/fcpqiqtx.html