美文网首页aardio
aardio redis客户端

aardio redis客户端

作者: LCSan | 来源:发表于2023-10-24 15:39 被阅读0次

    插件参考: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*****/
    
    

    相关文章

      网友评论

        本文标题:aardio redis客户端

        本文链接:https://www.haomeiwen.com/subject/njesidtx.html