事务,简单理解就是,一组动作,要么全部执行,要么就全部不执行.从而避免出现数据不一致的情况。

redis提供了简单的事务功能,将一组需要的命令放到multi和exec两个命令之间。multi代表事务开始,exec代码事务结束。

eg:


可以看到sadd命令一开始返回的结果是QUEUED,代表命令并没有真正执行,只是暂时存在redis中,只有当exec执行了,这组命令才算是完成。

如果事务中的命令出现错误:

  • 命令错误:比如说语法错误, set写成了sett,整个的事务将无法执行
  • 运行时错误:比如说应该用sadd,却误写成了zadd,从语法上讲,是没有毛病的,但是上面的写对的命令,已经执行入库了, 这种情况就需要开发人员自己修复了。

所以说redis不支持事务中的回滚特性.无法实现命令之间的逻辑关系计算。

所以在开发中,还可以采用lua脚本来实现事务的,简单理解:使用lua语言编写脚本传到redis中执行。

Lua

执行有啥好处:

  1. lua脚本是作为一个整体执行的.所以中间不会被其他命令插入;
  2. 可以把多条命令一次性打包,所以可以有效减少网络开销;
  3. lua脚本可以常驻在redis内存中,所以在使用的时候,可以直接拿来复用.也减少了代码量.

使用上举个例子

访问控制 ,10秒内最多访问3次,访问频率在10s内小于等于3次时返回1,否则返回0

local times = redis.call('incr',KEYS[1])if times == 1 thenredis.call('expire',KEYS[1], ARGV[1])
endif times > tonumber(ARGV[2]) thenreturn 0
end
return 1
redis

客户端,测试脚本:


eval命令和--eval 本质是一样的.客户端如果想要执行lua脚本,首先要在客户端编写好lua脚本代码,然后把脚本作为字符串发送给服务端,服务端把执行结果返回给客户端

--eval 是告诉redis-cli读取并运行后面的脚本, ratelimiting.lua是脚本的位置.后面是脚本的参数. 这里10 是脚本中ARGV[1] 3是 ARGV[2]

, 前的rate.limiting:127.0.0.1 是要操作的键,对应的是脚本中KEYS[1]

这个应用场景算是限速.比如说每次登陆,让用户输入手机验证码,从而确定是否是用户本人,但是如果用户疯狂的点,获取验证码,那么短信的这个接口就会一直被调用.那么咱们这边就可以进行限制. 如果不用lua脚本, 用代码也是可以实现的.这里写上伪代码

phoneNum= "1573262xxxx"
key="shortMsg:limit:"+phoneNum;
isExists=redis.set(key,1,"EX 600" "NX");
if(isExist!=null) || redis.incr(key) <=n{//通过
}else{//限速
}

转载于:https://www.cnblogs.com/amunote/p/10463445.html

redis事务和脚本相关推荐

  1. Redis : redis事务

    Redis的事务功能详解 MULTI.EXEC.DISCARD和WATCH命令是Redis事务功能的基础. Redis事务允许在一次单独的步骤中执行一组命令,并且可以保证如下两个重要事项: >R ...

  2. Redis:事务、管道、Lua脚本

    1. Redis事务定义 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行. 事务的原理是先将属于一个 ...

  3. 【Redis数据库】命令学习笔记——发布订阅、事务、脚本、连接等命令汇总

    本篇基于redis 4.0.11版本,学习发布订阅.事务.脚本.连接的相关命令. Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 序号 ...

  4. 高性能分布式缓存Redis(缓存分类 安装 数据类型选择和应用场景 发布订阅 事务 Lua脚本 慢查询日志)

    高性能分布式缓存Redis 高性能分布式缓存Redis 1. 缓存发展史&缓存分类 1.1 大型网站中缓存的使用 1.2 常见缓存的分类 1.3 分布式缓存选型方案对比 2. Redis概述& ...

  5. 【2020尚硅谷Java大厂面试题第三季 04】Redis 9种数据类型使用场景,分布式锁演变步骤,lua脚本,redis事务,Redisson,Redis内存占用,删除策略,内存淘汰策略,手写LRU

    1.安装redis6.0.8 2023 02 02 为:redis-7.0.8.tar.gz 2.redis传统五大数据类型的落地应用 3.知道分布式锁吗?有哪些实现方案?你谈谈对redis分布式锁的 ...

  6. redis 事务 多进程模拟秒杀 保证库存的正确 lua脚本和watch的方法

    三种方法来实现 lpop的 原子操作 10个商品就 lpush 10个数据 抢购开始用lpop来判断是否还存在库存 watch实现 下面有代码实现 watch库存键, multi后如果该key被其他客 ...

  7. 腾讯二面:Redis 事务支持 ACID 么?

    ❝ 腾讯面试官:「数据库事务机制了解么?」 「内心独白:小意思,不就 ACID 嘛,转眼一想,我面试的可是技术专家,不会这么简单的问题吧」 程许远:「balabala-- 极其自信且从容淡定的说了一通 ...

  8. Redis事务和watch

    redis的事务 严格意义来讲,redis的事务和我们理解的传统数据库(如mysql)的事务是不一样的. redis中的事务定义 Redis中的事务(transaction)是一组命令的集合. 事务同 ...

  9. PHP中使用redis执行lua脚本示例

    一.引言 redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运行在任何平台上,也可以嵌入到大多数语言当中,来扩展其功 ...

最新文章

  1. 为什么我电脑进入睡眠后网络就断开了?(解决打开睡眠后的笔记本无法连接校园网的问题)
  2. Qt Designer设置背景图片、颜色不影响其它组件小技巧,控件层级设置,组件的继承,styleSheet设置样式。
  3. java实现责任链模式_我的Java设计模式-责任链模式
  4. Python中json模块,字典和字符串相互转换
  5. bootstrap学习网站
  6. VC程序调试技术,一些工具上和具体的问题,包括内存检测
  7. Hibernate之悲观锁与乐观锁
  8. 从外部CorDapp扩展和覆盖流
  9. Java基础:如何读取控制台输入?如何读取字符?
  10. popupwindow使用之异常:unable to add window -- token null is not valid
  11. [Qt扒手2] PyQt5 路径绘画例子
  12. Android ViewStub动态加载View
  13. matlab 电力系统分析 毕设,基于Labview的“电力系统分析”课程仿真:电力系统分析matlab仿真实例...
  14. Mac剪切快捷键使用技巧
  15. ckplayer html5 添加广告,ewebeditor下利用ckplayer增加html5 (mp4)全平台的支持
  16. 精选20个高品质的免费素材,可以下载PSD格式
  17. 大数据毕业设计 - 选题推荐(一)
  18. 谈谈数据决策平台搭建的必要性
  19. 熊猫分发_与熊猫度假
  20. centos 释放swap_CentOS下SWAP分区建立及释放内存详解

热门文章

  1. 《新一代城市大脑建设与发展》专家研讨会在京举办
  2. 【前沿技术】严重事故!实习生删除字节跳动所有轻量级机器学习模型
  3. 人类倾向于高估人工智能的进步,低估自身智能的复杂性-读《AI 3.0》
  4. 简论重大科学发现诞生的时机
  5. 麻省理工学院的牛人解说数学体系,你到哪个层次了?
  6. 用肖像画追踪历史上的信任度变化 |《自然-通讯》论文
  7. 人工智能除了创造新材料还能预测化学反应性能
  8. 汇真科技李利鹏 :人工智能的应用边界
  9. 辞退了一名 2 年工作经验的前端工程师
  10. 为了提升续航,马斯克又引发一场“造芯”革命,华为比亚迪已进场