aardio redis客户端

插件参考:aaz.redis
协议参考:http://doc.redisfans.com/topic/protocol.html

改进:
1、按参考协议实现传输内容编解码;
2、增加subscribe实现,通过拉起异步套接字,实现event事件。
3、函数通过元方法统一访问。

参考代码:

//redis客户端
import myplu.redis.protocol;
import wsock.tcp.client;
import wsock.tcp.asynClient;

namespace myplu

class redis{
    ctor(){
        ..table.gc(this, "close")
    };
    close = function(){
        if(this.tcpClient){
            this.tcpClient.close();
            this.tcpClient = null;
        }
    };
    connect = function(ip="127.0.0.1", port=6379, timeout=3){
        this.ip = ip;
        this.port = port;
        this.timeout = timeout;
        this.tcpClient := ..wsock.tcp.client();
        if(!this.tcpClient.connectTimeout(ip, port, timeout)){
            return false, "连接服务器失败"; 
        }
        return true;
    };
    setTimeouts = function(send=5000,receive=5000){
        if(this.tcpClient){
            return this.tcpClient.setTimeouts(send, receive); 
        }
    };  
    subscribe = function(callback, ...){
        if(!this.tcpClient1){
            //import wsock.tcp.asynClient;
            
            this.tcpClient1 = ..wsock.tcp.asynClient();             
            
            this.tcpClient1.connect(this.ip,this.port); 
            //因为是异步套接字,这里不需要检查返回值 
        }
        if(callback && type(callback) == "function"){
            this.tcpClient1.onReceive = function(err){              
                var buffer = ..raw.buffer(0x100000);
                var readSize = this.tcpClient1.recvBuffer(buffer);
                
                if( readSize ) {
                    buffer = ..string.str(buffer);
                    buffer = this.decode(buffer);                   
                    callback(buffer);
                }       
            }   
        }
        var msg = this.encode("SUBSCRIBE", ...);
        this.tcpClient1.send(msg);
    };  
    scanHandle = function(str,reg,pos=1){   
        var data = ..string.match(str,reg,pos);
        var index,last = ..string.find(str,reg,pos);
        return data,last+1; 
    };  
    scanString = function(str,pos=1){
        var res = ..string.match(str,"\$(\d+)\r\n",pos);
        return this.scanHandle(str,"\$\d+\r\n([\w\W]{"+res+"})<\r\n>?",pos);
    };  
    scanNumber = function(str,pos=1){
        var data,index = this.scanHandle(str,"\:(\d+)<\r\n>?",pos);
        return tonumber(data),index; 
    };  
    scanArray = function(str,pos=1){
        var res = ..string.match(str,"\*(\d+)<\r\n>?",pos);
        res = tonumber(res);
        var index,last = ..string.find(str,"\*(\d+)<\r\n>?",pos);
        pos = last + 1;
        var data = {};
        var dt; 
        for(i=1;res;1){
            dt,pos = this.scanAny(str,pos);
            ..table.push(data,dt);
        }
        return data,pos;
    };  
    scanStatus  = function(str,pos=1){
        return this.scanHandle(str,"\+([\w\W]+)<\r\n>?",pos);
    };  
    scanError  = function(str,pos=1){
        return this.scanHandle(str,"-([\w\W]+)<\r\n>?",pos);
    };  
    scanAny = function(str,pos=1){
        var prefix = str[[pos]];
        select(prefix) {
            case "+" {
                return this.scanStatus(str,pos); 
            }
            case "-" {
                return this.scanError(str,pos); 
            }
            case ":" {
                return this.scanNumber(str,pos); 
            }
            case "$" {
                return this.scanString(str,pos); 
            }
            case "*" {
                return this.scanArray(str,pos); 
            }else {
                return null,#str; 
            }
        } 
    };  
    decode = function (str){
        var pos = 1;
        var data;
        var res = {}; 
        do{
            data,pos = this.scanAny(str,pos);
            ..table.push(res,data);
        }while(pos<#str)
        if(#res==1){
            return res[1]; 
        }
        return res; 
    };  
    encode = function (...){
        var args = {...}; 
        var data = ..string.format('*%i\r\n', #args);
        for(k,v in args){
            v = tostring(v);
            data += ..string.format('$%i\r\n%s\r\n', #v, v);
        }
        return data; 
    };
    @_meta;
}


namespace redis

_meta = {
    _get = function(k,ownerCall){
        //console.log("*********************");
        if(ownerCall){
            return function(...){
                var msg = owner.encode(..string.upper(k), ...);                 
                var data,err = owner.tcpClient.send(msg);
                if(data){
                    var buffer = ..raw.buffer(0x100000);
                    var readSize = owner.tcpClient.recvBuffer(buffer);
                    if( readSize ) {
                        buffer = ..string.str(buffer);
                        return owner.decode(buffer);                        
                    } 
                    return null; 
                }else {
                    error(err,2);
                }
            }
        }
    }
}

/*****intellisense()
myplu.redis = 导入redis库
myplu.redis() = 创建redis实例\n!redis_client.
end intellisense*****/

/*****intellisense(!redis_client)
connect(.(ip,6379,3) = 创建redis链接,所有参数都可选
close() = 关闭redis链接
setTimeouts(.(超时时间,响应超时时间) = 设置超时时间
subscribe(__) = 订阅通知
del(.(__) = 执行del命令
dump(.(__) = 执行dump命令
exists(.(__) = 执行exists命令
expire(.(__) = 执行expire命令
expireat(.(__) = 执行expireat命令
keys(.(__) = 执行keys命令
migrate(.(__) = 执行migrate命令
move(.(__) = 执行move命令
object(.(__) = 执行object命令
persist(.(__) = 执行persist命令
pexpire(.(__) = 执行pexpire命令
pexpireat(.(__) = 执行pexpireat命令
pttl(.(__) = 执行pttl命令
randomkey(.(__) = 执行randomkey命令
rename(.(__) = 执行rename命令
renamenx(.(__) = 执行renamenx命令
restore(.(__) = 执行restore命令
sort(.(__) = 执行sort命令
ttl(.(__) = 执行ttl命令
type(.(__) = 执行type命令
scan(.(__) = 执行scan命令
append(.(__) = 执行append命令
bitcount(.(__) = 执行bitcount命令
bitop(.(__) = 执行bitop命令
decr(.(__) = 执行decr命令
decrby(.(__) = 执行decrby命令
get(.(__) = 执行get命令
getbit(.(__) = 执行getbit命令
getrange(.(__) = 执行getrange命令
getset(.(__) = 执行getset命令
incr(.(__) = 执行incr命令
incrby(.(__) = 执行incrby命令
incrbyfloat(.(__) = 执行incrbyfloat命令
mget(.(__) = 执行mget命令
mset(.(__) = 执行mset命令
msetnx(.(__) = 执行msetnx命令
psetex(.(__) = 执行psetex命令
set(.(__) = 执行set命令
setbit(.(__) = 执行setbit命令
setex(.(__) = 执行setex命令
setnx(.(__) = 执行setnx命令
setrange(.(__) = 执行setrange命令
strlen(.(__) = 执行strlen命令
hdel(.(__) = 执行hdel命令
hexists(.(__) = 执行hexists命令
hget(.(__) = 执行hget命令
hgetall(.(__) = 执行hgetall命令
hincrby(.(__) = 执行hincrby命令
hincrbyfloat(.(__) = 执行hincrbyfloat命令
hkeys(.(__) = 执行hkeys命令
hlen(.(__) = 执行hlen命令
hmget(.(__) = 执行hmget命令
hmset(.(__) = 执行hmset命令
hset(.(__) = 执行hset命令
hsetnx(.(__) = 执行hsetnx命令
hvals(.(__) = 执行hvals命令
hscan(.(__) = 执行hscan命令
blpop(.(__) = 执行blpop命令
brpop(.(__) = 执行brpop命令
brpoplpush(.(__) = 执行brpoplpush命令
lindex(.(__) = 执行lindex命令
linsert(.(__) = 执行linsert命令
llen(.(__) = 执行llen命令
lpop(.(__) = 执行lpop命令
lpush(.(__) = 执行lpush命令
lpushx(.(__) = 执行lpushx命令
lrange(.(__) = 执行lrange命令
lrem(.(__) = 执行lrem命令
lset(.(__) = 执行lset命令
ltrim(.(__) = 执行ltrim命令
rpop(.(__) = 执行rpop命令
rpoplpush(.(__) = 执行rpoplpush命令
rpush(.(__) = 执行rpush命令
rpushx(.(__) = 执行rpushx命令
sadd(.(__) = 执行sadd命令
scard(.(__) = 执行scard命令
sdiff(.(__) = 执行sdiff命令
sdiffstore(.(__) = 执行sdiffstore命令
sinter(.(__) = 执行sinter命令
sinterstore(.(__) = 执行sinterstore命令
sismember(.(__) = 执行sismember命令
smembers(.(__) = 执行smembers命令
smove(.(__) = 执行smove命令
spop(.(__) = 执行spop命令
srandmember(.(__) = 执行srandmember命令
srem(.(__) = 执行srem命令
sunion(.(__) = 执行sunion命令
sunionstore(.(__) = 执行sunionstore命令
sscan(.(__) = 执行sscan命令
zadd(.(__) = 执行zadd命令
zcard(.(__) = 执行zcard命令
zcount(.(__) = 执行zcount命令
zincrby(.(__) = 执行zincrby命令
zrange(.(__) = 执行zrange命令
zrangebyscore(.(__) = 执行zrangebyscore命令
zrank(.(__) = 执行zrank命令
zrem(.(__) = 执行zrem命令
zremrangebyrank(.(__) = 执行zremrangebyrank命令
zremrangebyscore(.(__) = 执行zremrangebyscore命令
zrevrange(.(__) = 执行zrevrange命令
zrevrangebyscore(.(__) = 执行zrevrangebyscore命令
zrevrank(.(__) = 执行zrevrank命令
zscore(.(__) = 执行zscore命令
zunionstore(.(__) = 执行zunionstore命令
zinterstore(.(__) = 执行zinterstore命令
zscan(.(__) = 执行zscan命令
psubscribe(.(__) = 执行psubscribe命令
publish(.(__) = 执行publish命令
pubsub(.(__) = 执行pubsub命令
punsubscribe(.(__) = 执行punsubscribe命令
subscribe(.(__) = 执行subscribe命令
unsubscribe(.(__) = 执行unsubscribe命令
discard(.(__) = 执行discard命令
exec(.(__) = 执行exec命令
multi(.(__) = 执行multi命令
unwatch(.(__) = 执行unwatch命令
watch(.(__) = 执行watch命令
eval(.(__) = 执行eval命令
evalsha(.(__) = 执行evalsha命令
script_exists(.(__) = 执行script_exists命令
script_flush(.(__) = 执行script_flush命令
script_kill(.(__) = 执行script_kill命令
script_load(.(__) = 执行script_load命令
auth(.(__) = 执行auth命令
echo(.(__) = 执行echo命令
ping(.(__) = 执行ping命令
quit(.(__) = 执行quit命令
select(.(__) = 执行select命令
bgrewriteaof(.(__) = 执行bgrewriteaof命令
bgsave(.(__) = 执行bgsave命令
client_getname(.(__) = 执行client_getname命令
client_kill(.(__) = 执行client_kill命令
client_list(.(__) = 执行client_list命令
client_setname(.(__) = 执行client_setname命令
config_get(.(__) = 执行config_get命令
config_resetstat(.(__) = 执行config_resetstat命令
config_rewrite(.(__) = 执行config_rewrite命令
config_set(.(__) = 执行config_set命令
dbsize(.(__) = 执行dbsize命令
debug_object(.(__) = 执行debug_object命令
debug_segfault(.(__) = 执行debug_segfault命令
flushall(.(__) = 执行flushall命令
flushdb(.(__) = 执行flushdb命令
info(.(__) = 执行info命令
lastsave(.(__) = 执行lastsave命令
monitor(.(__) = 执行monitor命令
psync(.(__) = 执行psync命令
save(.(__) = 执行save命令
shutdown(.(__) = 执行shutdown命令
slaveof(.(__) = 执行slaveof命令
slowlog(.(__) = 执行slowlog命令
sync(.(__) = 执行sync命令
time(.(__) = 执行time命令
end intellisense*****/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容