redis中的单个命令是原子操作。
多条命令可以用multi,exec,discard等命令。
1.multi开始执行事务,后面的命令都会放到队列里,暂不执行
2.exec执行,会将队列的命令按顺序执行,失败不回滚
3.discard取消事务。
redis为什么事务失败不会滚:
1.redis的命令错误一般是因为错误的语法,或者用错了key,这样的错误应该在开发环境就被发现,而不应该放到生产环境当中。
2.因为不需要支持事务的回滚,redis内部可以保存简单快速。
lua脚本:将复杂的或者多步的redis操作,写为一个脚本,一次提交给redis执行,减少反复连接redis的次数。提升性能。 LUA脚本是类似redis事务,有一定的原子性,不会被其他命令插队,可以完成一些redis事务性的操作。 但是注意redis的lua脚本功能,只有在Redis 2.6 以上的版本才可以使用。 利用lua脚本淘汰用户,解决超卖问题。 redis 2.6版本以后,通过lua脚本解决争抢问题,实际上是redis 利用其单线程的特性,用任务队列的方式解决多任务并发问题。
lua脚本也不支持回滚
lua:秒杀脚本
``
local userId=KEYS[1];
local stockKey=KEYS[2];
local userIdKey=KEYS[3];
local userExists=redis.call(“sismember”,userIdKey,userId);
if tonumber(userExists)==1
then
return 2;
end
local num= redis.call(“get” ,stockKey);
if tonumber(num)<=0 then return 0;
else
redis.call(“decr”,stockKey);
redis.call(“sadd”,userIdKey,userId);
end
return 1;
https://blog.csdn.net/m0_56340064/article/details/127024948
标签:脚本,命令,redis,学习,lua,call,随笔,local From: https://www.cnblogs.com/gz-wod/p/17425883.html