zoukankan      html  css  js  c++  java
  • tendis nodejs 连接问题

    经过测试node-redis 客户端与tendis 连接是有点问题的(golang 以及java 是没有问题的)

    原因分析

    因为node-redis 支持debug模式,通过分析发现还是tendis兼容的问题与redis还是有差异的

    • 具体分析方法
      参考代码
     
    const redis = require("redis");
    const client = redis.createClient({
      port:51002,
      host:"localhost",
      password:"test"
    });
    client.on("error", function(error) {
     // console.error(error);
    });
     
    client.on("ready",function(data){
     // console.log("ready",data)
    })
     
    client.on("connect",function(data){
      console.log("connect",data)
    })
     
    client.on("warning",function(data){
      console.log("warning",data)
    })
     
     
    client.set("key2", "value", redis.print);
    client.get("key2", redis.print);

    执行分析

    NODE_DEBUG=redis node test.js

    日志信息


    通过分析日志信息,搜索相关代码:

     
    RedisClient.prototype.on_info_cmd = function (err, res) {
        if (err) {
            if (err.message === "ERR unknown command 'info'") {
                this.on_ready();
                return;
            }
            err.message = 'Ready check failed: ' + err.message;
            this.emit('error', err);
            return;
        }
     
        /* istanbul ignore if: some servers might not respond with any info data. This is just a safety check that is difficult to test */
        if (!res) {
            debug('The info command returned without any data.');
            this.on_ready();
            return;
        }
     
        if (!this.server_info.loading || this.server_info.loading === '0' ) {
            // If the master_link_status exists but the link is not up, try again after 50 ms
            if (this.server_info.master_link_status && this.server_info.master_link_status !== 'up') {
                this.server_info.loading_eta_seconds = 0.05;
            } else {
                // Eta loading should change
                debug('Redis server ready.');
                this.on_ready();
                return;
            }
        }
     
        var retry_time = +this.server_info.loading_eta_seconds * 1000;
        if (retry_time > 1000) {
            retry_time = 1000;
        }
        // 日志问题
        debug('Redis server still loading, trying again in ' + retry_time);
        setTimeout(function (self) {
            self.ready_check();
        }, retry_time, this);
    };
    • 解决
      看到错误信息,目前就可以基本确定是info 的问题了,通过登陆redis以及tendis输出info,发现差异的地方
    • 参考解决方法
      对于node-redis 的info 处理添加-1 的处理
     
     if (!this.server_info.loading || this.server_info.loading === '0' || this.server_info.loading === '-1' ) {
            // If the master_link_status exists but the link is not up, try again after 50 ms
            if (this.server_info.master_link_status && this.server_info.master_link_status !== 'up') {
                this.server_info.loading_eta_seconds = 0.05;
            } else {
                // Eta loading should change
                debug('Redis server ready.');
                this.on_ready();
                return;
            }
        }
     
     

    说明

    经过测试发现还是有一些问题的,兼容性并不是特别好(尤其在集成cube.js 的时候发现了其他问题,比如multi 的问题),所以如果redis对于业务影响是比较大的话
    还是慎重进行切换,做好完备的测试,以下是事务命令的兼容说明,可以参考

    参考资料

    https://github.com/go-redis/redis
    http://tendis.cn/#/Tendisplus/%E6%95%B4%E4%BD%93%E4%BB%8B%E7%BB%8D/redis%E5%85%BC%E5%AE%B9%E6%80%A7

  • 相关阅读:
    杜教筛
    虚树
    带修莫队
    线性基
    区间修改区间求和cdq分治
    矩阵快速幂求斐波那契数列
    点分治成品
    Codeforces Round #542 [Alex Lopashev Thanks-Round] (Div. 1) C(二分+KMP)
    线性筛
    矩阵快速幂
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/14704197.html
Copyright © 2011-2022 走看看