Qless 相关知识
Qless是一个基于redis的分布式任务架构。相关代码在
https://github.com/seomoz/qless
它是完全有lua实现的,依靠 redis 对lua的支持,http://www.cnblogs.com/ghj1976/p/4298206.html 它实现了对redis的功能扩展。
有关lua的一些语法基础知识可以参考:http://www.cnblogs.com/ghj1976/p/4298178.html
https://github.com/seomoz/qless 这里我们可以看到下面文件,它们分别是下面功能:
base.lua -- 提前声明的部分和一些未分类的功能
config.lua -- 所有配置
job.lua -- 定时job类
recurring.lua -- 重复的job类
queue.lua -- 队列类
api.lua -- 客户端调用封装,这里做了一个非常轻量的封装
我们用的时候其实用的是 qless.lua 文件, 要用这个文件,需要用 make qless.lua 命令才产生:

在 qless.lua 的最后,我们可以看到下面一段代码,对这部分代码的解释如下:
if #KEYS > 0 then error('No Keys should be provided') end
local command_name = assert(table.remove(ARGV, 1), 'Must provide a command')
local command = assert(
QlessAPI[command_name], 'Unknown command ' .. command_name)
local now = tonumber(table.remove(ARGV, 1))
local now = assert(
now, 'Arg "now" missing or not a number: ' .. (now or 'nil'))
return command(now, unpack(ARGV))
来自外部的调用,其实都被执行到 QlessAPI下的对应方法了, 外部调用传递进来的第1个参数是 QlessAPI 下对应的命令名字, 第二个是 这个命令的 now 参数,其他是其他参数。
在Redis中执行Lua的参数说明
在Redis中执行lua,我们最常用下面三个命令:EVAL、EVALSHA、SCRIPT LOAD
参考:http://www.cnblogs.com/ghj1976/p/4298206.html
以 eval 为例,它的参数如下,其他几个参数也类似:
EVAL script numkeys key [key ...] arg [arg ...]
script 参数是一段 Lua 5.1 脚本程序,它会被运行在 Redis 服务器上下文中,这段脚本不必(也不应该)定义为一个 Lua 函数。
numkeys 参数用于指定键名参数的个数。
键名参数 key [key ...] 从 EVAL 的第三个参数开始算起,表示在脚本中所用到的那些 Redis 键(key),这些键名参数可以在 Lua 中通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
在命令的最后,那些不是键名参数的附加参数 arg [arg ...] ,可以在 Lua 中通过全局变量 ARGV 数组访问,访问的形式和 KEYS 变量类似( ARGV[1] 、 ARGV[2] ,诸如此类)。
上面这几段长长的说明可以用一个简单的例子来概括:
> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
其中 "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 是被求值的 Lua 脚本,数字 2 指定了键名参数的数量, key1 和 key2 是键名参数,分别使用 KEYS[1] 和 KEYS[2] 访问,而最后的 first 和 second 则是附加参数,可以通过 ARGV[1] 和 ARGV[2] 访问它们。
参考: http://redis.readthedocs.org/en/latest/script/eval.html#eval
table.remove
table 的默认初始索引一般以 1 开始
table.remove(table, pos)
table.remove()函数删除并返回table数组部分位于pos位置的元素. 其后的元素会被前移. pos参数可选, 默认为table长度, 即从最后一个元素删起.
参考:http://dhq.me/lua-learning-notes-table
assert (v [, message])
功能:相当于C的断言,
参数:
v:当表达式v为nil或false将触发错误,
message:发生错误时返回的信息,默认为"assertion failed!"
unpack
函数unpack可以返回多个值,它传入一个array,然后返回array中的每一个值
参考:http://blog.csdn.net/wzzfeitian/article/details/8653101
Golang 这个的实现版本在: https://github.com/kdar/goqless
其中的调用逻辑被封装在下面代码:
github.com\kdar\goqless\client.go
func (c *Client) Do(name string, keysAndArgs ...interface{}) (interface{}, error) {
return c.lua.Do(name, keysAndArgs...)
}
这里的 name 是 qless的命令, 类似下面的 get, 其他是这里的参数。
-- Return json for the job identified by the provided jid. If the job is not
-- present, then `nil` is returned
function QlessAPI.get(now, jid)
local data = Qless.job(jid):data()
if not data then
return nil
end
return cjson.encode(data)
end
Qless 相关知识的更多相关文章
- 【Python五篇慢慢弹(5)】类的继承案例解析,python相关知识延伸
类的继承案例解析,python相关知识延伸 作者:白宁超 2016年10月10日22:36:57 摘要:继<快速上手学python>一文之后,笔者又将python官方文档认真学习下.官方给 ...
- 移动WEB像素相关知识
了解移动web像素的知识,主要是为了切图时心中有数.本文主要围绕一个问题:怎样根据设备厂商提供的屏幕尺寸和物理像素得到我们切图需要的逻辑像素?围绕这个问题以iphone5为例讲解涉及到的web像素相关 ...
- listener监听器的相关知识
从别人的博客上我学习了listener的相关知识现在分享给大家 1.概念: 监听器就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上 ...
- UIViewController相关知识
title: UIViewController 相关知识date: 2015-12-13 11:50categories: IOS tags: UIViewController 小小程序猿我的博客:h ...
- 【转】java NIO 相关知识
原文地址:http://www.iteye.com/magazines/132-Java-NIO Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的 ...
- NSString使用stringWithFormat拼接的相关知识
NSString使用stringWithFormat拼接的相关知识 保留2位小数点 1 2 3 4 //.2代表小数点后面保留2位(2代表保留的数量) NSString *string = [NSSt ...
- iOS网络相关知识总结
iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...
- 电路相关知识--读<<继电器是如何成为CPU的>>
电路相关知识–读<<继电器是如何成为CPU的>> */--> *///--> *///--> 电路相关知识–读<<继电器是如何成为CPU的> ...
- 地址标记,SpringMVC转发与调用相关知识存档
1.mytest_mavenprj1中,index的 <a href="login/login.html">点击登录</a> 与 <a href=&q ...
随机推荐
- scrapy 资料整合
先看看scrapy的框架流程, 1,安装 scrapy 链接 查看即可. 2,新建scrapy项目 scrapy startproject 项目名 目录结构图 3,cd到项目名下,创建任务. scra ...
- elasticsearch5.2.1使用logstash同步mysql
centos 本人亲测可以 首先安装好mysql,elasticsearch 不懂的请参考另一篇文章 安装logstash官方:https://www.elastic.co/guide/en/l ...
- [CSS3] 二级下拉导航
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...
- Springboot接口简单实现生成MySQL插入语句
Springboot接口简单实现调用接口生成MySQL插入语句 在实际测试中,有这样一个需求场景,比如:在性能压力测试中,可能需要我们事先插入数据库中一些相关联的数据. 我们在实际测试中,遇到问题,需 ...
- day4. python学习之字典
字典和列表是最常用的数据类型,字典是一种key-value的数据类型,用{ }表示 1.字典的特性:无序的,没有下标 2.字典的使用:增删改查 info = { '20181101':"zh ...
- 编辑距离 区间dp
题目描述 设A和B是两个字符串.我们要用最少的字符操作次数,将字符串A转换为字符串B.这里所说的字符操作共有三种: 1.删除一个字符: 2.插入一个字符: 3.将一个字符改为另一个字符: !皆为小写字 ...
- [BZOJ 5323][Jxoi2018]游戏
传送门 \(\color{green}{solution}\) 它每次感染的人是它的倍数,那么我们只需要找出那些除了自己以外在\(l\), \(r\)内没有别的数是 它的约数的数,在这里称其为关键数. ...
- rbac - 介绍
找到了上学期末压箱底的rbac组件,这里总结下. 介绍: rbac组件:一个基于角色的权限访问控制系统的组件. 目录:
- SqlServer子查询、高级
子查询:把一个结果集让别人继续分析查询的就叫子查询 子查询如果定义了别名,在查询引用时,必须使用别名 --子查询定义了别名,引用就必须用别名 select id,n from Person,(sele ...
- C基础《一》
puts("第一个C语言程序输出了") C语言的编译和链接过程 C语言写的代码必须经过编译生成可执行文件才可以用, 编译就是把C语言写的代码进行识别,转换成计算机能够识别的二进制形 ...