redis lua
redis
支持复杂数据类型 : key-value, string, list, set, hash table, sorted set,
其他有用特性: TRANSACTION, SCRIPT
TRANSACTION
WATCH 监视key; 若在事务开始之前key发生改变, 则不进行事务。
UNWATCH 解除监视
MULTI 开始事务
redis command; 注意, 这里只能是一组redis command, 不能夹杂任何数据逻辑。。。 类似于SQL事务中的一组SQL命令
EXEC 执行事务 / DISCARD 放弃事务
那么,类似需求如何满足呢? transaction是满足不了这种需求【CAS, check and save】;且这种需求是业务逻辑中非常常见的。。。
if ( db.key > 10) { ++db.key; saveTOdb(db.key); }
SCRIPT(lua)
script也能保证原子性。 为了保证原子性(同时也保证主从一致), 内嵌的lua做了修改、去掉随机函数等。
[root@mobile_dev2 src]# cat test2.lua
if redis.call("EXISTS", KEYS[1]) == 1 thenlocal cur = redis.call("GET", KEYS[1])if cur >= ARGV[1] thenreturn redis.call("INCR", KEYS[1])end return cur
elsereturn 0
end
[root@mobile_dev2 src]# ./redis-cli SET XX 5
OK
[root@mobile_dev2 src]# ./redis-cli GET XX
"5"
[root@mobile_dev2 src]# ./redis-cli EVAL "$(cat test.lua)" 1 "XX" 10 # 5>=10 failed,所以输出原值5.
"5"
[root@mobile_dev2 src]# ./redis-cli SET XX 10
OK
[root@mobile_dev2 src]# ./redis-cli GET XX
"10"
[root@mobile_dev2 src]# ./redis-cli EVAL "$(cat test.lua)" 1 "XX" 10
"11"
SCRIPT的键和参数
如上。 redis的lua函数,可以有两个表。 KEYS表 是redis中存的key; ARGV表是存放传入参数的。
命令 | lua 脚本 | KEYS表长度 | 逐个的KEYS | 逐个的ARGV | |
./redis-cli | EVAL | "$(cat test2.lua)" | 1 | "XX" | 10 |
其他
多个客户端可以并发的发送数据请求, 但redis server在处理这些请求可以看做是单线程的。
redis保证SCRIPT的原子性,处理该脚本时不会有其他command或者SCRIPT在同时被处理;
因此可以保证业务逻辑的正确性。 避免各类数据库中常见的脏数据、旧数据等问题。
如上, 同时必须保证SCRIPT的简单高效; 否则会导致其后的处理请求统统延时。。。
./redis-cli SCRIPT LOAD "$(cat test.lua)" ###LOAD之后是lua脚本源码。。。
http://www.redisdoc.com/en/latest/
http://www.redisbook.com/en/latest/index.html !!!!!!!!!!!!!!!!!!!
redis lua相关推荐
- Java并发:分布式应用限流 Redis + Lua 实践
任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶.在之前的文章中,也讲到过,但是那是基于单机场景来写. 之前文章:接口限流算法:漏桶算法&令牌桶算法 然 ...
- 秒杀(PHP,Redis,Lua)
2019独角兽企业重金招聘Python工程师标准>>> 虚拟机测试PHP+Redis与PHP+Redis+Lua性能比较 [root@bogon ~]# redis-cli --ve ...
- Redis Lua脚本中学教程(下)
在中学教程的上半部分我们介绍了Redis Lua相关的命令,没有看过或者忘记的同学可以步行前往直接使用机票Redis Lua脚本中学教程(上).今天我们来简单学习一下Lua的语法. 在介绍Lua语法之 ...
- 高并发-【抢红包案例】之四:使用Redis+Lua脚本实现抢红包并异步持久化到数据库
文章目录 导读 概述 实现步骤 注解方式配置 Redis lua脚本和异步持久化功能的开发 Service层添加Redis抢红包的逻辑 Controller层新增路由方法 构造模拟数据,测试 代码 总 ...
- Redis Lua脚本中学教程(上)
失踪人口回来啦! 有读者问我为什么这么久都没有出Redis Lua中学教程,表示村头厕所已经好久没有纸了.其实我早就要写这篇中学教程了,奈何最近太忙了,就一拖再拖,直到今天我终于又开始动笔了.忘记Lu ...
- redis lua 抽奖 PHP,通过redis+lua实现加减库存
一. 场景 下单后库存校验或者秒杀场景下,有很多利用"锁"的方案来解决问题.但是加锁其实是一件性价比很低的事,所以我们采用用redis+lua的方式来实现这个功能. 二. 思路 阶 ...
- redis+lua实现分布式限流
前言 之前我们谈到的限流解决方案中提到了在分布式环境下,可以使用redis结合lua进行限流,与网关层限流不同的是,基于Redis+Lua的分布式限流属于服务端限流 使用redis做限流原因 在前面的 ...
- Redis实现计数器---接口防刷---升级版(Redis+Lua)
[前言] Cash Loan(一):Redis实现计数器---接口防刷 中介绍了项目中应用redis来做计数器的实现过程,最近自己看了些关于Redis实现分布式锁的代码后,发现在Redis分布式锁中 ...
- Redis+Lua+Java
Java+Redis+Lua Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行.使用脚本的好处如下: 1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成 ...
- Redis ~ Lua。
Redis ~ Lua. 文章目录 Redis ~ Lua. 发现问题. Lua 解决. Lua ~ Windows. Hello World. IDE ~ ZeroBrane. 文档. Redis ...
最新文章
- c++ primer,友元函数上的一个例子(By Sybase)
- 取余运算 C和python的区别
- Eclipse 中 SDK无法更新---解决方法
- 广域网优化产品的5大应用场景—Vecloud
- 如何写一个能被手机打开的C语言小程序,如何用C语言中一些简单的语句做一个小程序,能够输入一个字符就会弹出一句话...
- java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseSelectProvider.<init>()的问题解决
- 各企业正在纷纷向“云”,背后有着哪些原因?
- 警告:ORA-00600 2252 错误正在SCN问题下不断爆发
- 【华为云•云享专家•原创分享计划上线】原创文章征集,寻找与众不同的你
- python卸载_微软再出神器,这次终于对Python下手了!
- C++ 头文件系列(iostream)
- 系统常用 Intent 合集
- 计算机考研英语资料推荐,2016考研计算机专业备考资料推荐
- 新媒体时代,内容为王已经走偏
- 魔兽世界怀旧服哪个服务器人最多,魔兽世界怀旧服8个服务器人口普查 部落/联盟阵营最新比例...
- 电商系统之延长收货与申请退款
- ORA-00001: unique constraint (...) violated解决方案
- centos linux 修改系统默认语言设置,centos怎么更改语言设置为中文
- 正在保存“index.vue”: 从 “‘Vetur‘, ‘ESLint‘“ (configure)中获取代码操作。
- 列举详细的数学相关软件:MATLAB为何可以这么强
热门文章
- Python 入门建议
- 运用神经网络方法找寻集成学习中的最优权重
- RobHess的SIFT源码分析:综述
- 条件随机场CRF简介Introduction to Conditional Random Fields
- 世界围棋人机大战、顶峰对决第一盘:围棋世界冠军Lee Sedol(李世石,围棋职业九段)对战Google DeepMind AlphaGo围棋程序,Google AlphaGo首战告捷
- 线性代数:第二章 矩阵及其运算:逆矩阵、分块矩阵
- 【python图像处理】tiff文件的保存与解析
- 智慧校园“手环考勤”已成为学校常态
- 安装好的nginx安装新的模块
- 玩转MaxCompute studio SQL编辑器