Node操作腾讯云Redis集群版 自定义命令

文档:https://cloud.tencent.com/document/product/239/18336    

  • Redis 集群模式数据将会自动分片,系统将提供数据均衡,数据迁移功能。
  • 集群模式的命令相对与非集群模式有一定的兼容性,主要体现在跨 Slot(槽位)数据访问。
  • set key时用CRC16算法取模得到slot,默认16384 个槽位置。集群会分片覆盖这些槽位。

注意:命令使用限制 https://cloud.tencent.com/document/product/239/18336#.E4.BD.BF.E7.94.A8.E9.99.90.E5.88.B6

避免全扫命令,因为不能跨片扫描。

自定义命令:
Redis 集群版通过 VIP 封装,在集群模式下提供了单机版的使用体验,对业务的使用带来的极大的便利,但是对运维不够透明,因此通过自定义命令来弥补这块空缺,支持集群中每个节点的访问,支持方式为在原有命令的参数列表最右边新增一个参数【节点ID】,COMMAND arg1 arg2 ... [节点ID],节点 ID 可通过cluster nodes命令,或者在控制台中获取:

  • nodes查出来的是字符串
10.1.1.1:2000> cluster nodes
    25b21f1836026bd49c52b2d10e09fbf8c6aa1fdc 10.0.0.15:6379@11896 slave 36034e645951464098f40d339386e9d51a9d7e77 0 1531471918205 1 connected
    da6041781b5d7fe21404811d430cdffea2bf84de 10.0.0.15:6379@11170 master - 0 1531471916000 2 connected 10923-16383
    36034e645951464098f40d339386e9d51a9d7e77 10.0.0.15:6379@11541 myself,master - 0 1531471915000 1 connected 0-5460
    53f552fd8e43112ae68b10dada69d3af77c33649 10.0.0.15:6379@11681 slave da6041781b5d7fe21404811d430cdffea2bf84de 0 1531471917204 3 connected
    18090a0e57cf359f9f8c8c516aa62a811c0f0f0a 10.0.0.15:6379@11428 slave ef3cf5e20e1a7cf5f9cc259ed488c82c4aa17171 0 1531471917000 2 connected
    ef3cf5e20e1a7cf5f9cc259ed488c82c4aa17171 10.0.0.15:6379@11324 master - 0 1531471916204 0 connected 5461-10922

    原生命令:
    info server
    自定义命令:
    info server ef3cf5e20e1a7cf5f9cc259ed488c82c4aa17171

    SCAN 命令示例:
    scan 0 238b45926a528c85f40ae89d6779c802eaa394a2
    scan 0 match a* 238b45926a528c85f40ae89d6779c802eaa394a2

    KEYS 命令示例:
    keys a* 238b45926a528c85f40ae89d6779c802eaa394a2

 

Node操作:连接;scan;(scan属于自定义命令)

const redis = require('redis');//引包 也可以引ioredis


function clusterScan(cbreturn){

    let masterNodes = [];//记录master节点
    client.cluster('nodes',(err,nodesStr) => { //'nodes'查出来的是集群节点信息的字符串 参照上面的示例 注意用的是cluster 如果是redis集群会有cluster实例
    const nodesArr = nodesStr.split("connected"); //通过connected拆成数组
        async.waterfall([
            ()=>{ 
                nodesArr.forEach(node =>{ 
                    const index = node.indexOf("master");//scan需要master节点的id
                    if(index != -1){//如果包含master
                        if(node.indexOf("myself")==-1){
                            nodeStr = node.substring(index-23,index-63);
                            masterNodes.push(nodeStr);
                        }else{//如果包含myself(主节点)
                            nodeStr = node.substring(index-30,index-70);
                            masterNodes.push(nodeStr);
                        }   
                    }   
                })  
                    cb(null,masterNodes);
                },  
        ],(err,masterNodes)=>{
              let keys= [];
		      i = 0;//控制forEach return 伪回调 (node回调到天荒地老,受不了了)
		      nodes.forEach(nodeid=>{		             
          client.SCAN(0,'MATCH','这里写key的匹配条件','COUNT','1000',nodeid, 
            (err,arr)=>{
			    i += 1;
				if(arr[1].length > 0){
                    keys = keys.concat(arr[1]);
				}
				if(i == nodes.length){//遍历完回调
					cbreturn(null,keys);
				}
			})						
		})  
        })  
    })
}

总结:区分好集群支持的命令和不支持的,还有自定义命令,三者之间的不同用法。单key的操作可以指定到槽,所以单key的操作大部分兼容,跨片扫描的操作是不支持的,需要节点id作为条件来用自定义命令操作。

你可能感兴趣的:(node)