当前位置: 首页 > news >正文

redis事务和脚本

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

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

eg:

0
可以看到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 then
    redis.call('expire',KEYS[1], ARGV[1])
end
 
if times > tonumber(ARGV[2]) then
    return 0
end
return 1
redis

客户端,测试脚本:

02
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

相关文章:

  • Spring源码分析(六)SpringAOP实例及标签的解析
  • Nodejs教程11:assert(断言)
  • use Google search engine
  • 【zookeeper源码】启动流程详解
  • Linux 搭建 Jenkins
  • 新技术到底靠不靠谱?在中国用一下就知道了
  • 设计模式 —— 建造者模式
  • OpenAI发布大型强化深度学习模拟器Neural MMO,AI适者生存择最优
  • 新手站长们看过来:白话ID
  • 华山模拟器安装
  • SQL查询数据时报错
  • yarn的常用命令
  • 三步搞定js类型转换
  • 深入数组切片
  • Spring入门(一):创建Spring项目
  • (三)从jvm层面了解线程的启动和停止
  • canvas 五子棋游戏
  • exports和module.exports
  • JS笔记四:作用域、变量(函数)提升
  • leetcode386. Lexicographical Numbers
  • ng6--错误信息小结(持续更新)
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • React组件设计模式(一)
  • Service Worker
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • tensorflow学习笔记3——MNIST应用篇
  • Vue UI框架库开发介绍
  • vue-router的history模式发布配置
  • 从setTimeout-setInterval看JS线程
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 微信开放平台全网发布【失败】的几点排查方法
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 一天一个设计模式之JS实现——适配器模式
  • 异步
  • 《天龙八部3D》Unity技术方案揭秘
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • (2)Java 简介
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (MATLAB)第五章-矩阵运算
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (五)IO流之ByteArrayInput/OutputStream
  • (已解决)什么是vue导航守卫
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .net 7 上传文件踩坑
  • .NET 8.0 中有哪些新的变化?
  • .net MVC中使用angularJs刷新页面数据列表
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .Net各种迷惑命名解释
  • .php结尾的域名,【php】php正则截取url中域名后的内容