博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
redis事务和脚本
阅读量:6234 次
发布时间:2019-06-22

本文共 1310 字,大约阅读时间需要 4 分钟。

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

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

客户端,测试脚本:

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

你可能感兴趣的文章
excel 两列数据怎么把组合的可能全部做出来?
查看>>
Java学习基本步骤
查看>>
一个杀不死的小强,kill进程无效的原因
查看>>
迎娶大数据-【软件和信息服务】2013.2
查看>>
关于面向对象编程
查看>>
NFS详解
查看>>
如何清理 C 盘空间
查看>>
Redis的复制
查看>>
Nagios整合pnp绘制性能分析图表
查看>>
用word-wrap来解决固定大小ul下的每条li中内容太多时不自动换行问题
查看>>
学生QQ群发展壮大了
查看>>
使用 CXF 做 webservice 简单例子
查看>>
PHP搭建
查看>>
我的友情链接
查看>>
appium自动化测试搭建
查看>>
我的友情链接
查看>>
安装IIS时出现The specified module could not be found图示解决方法
查看>>
python 杂
查看>>
关于内存条故障引发的系统故障
查看>>
BIGIP-LTM中的NAT和SNAT
查看>>