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

文档:云数据库 Redis 内存版(集群架构)-产品简介-文档中心-腾讯云    

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

注意:命令使用限制 云数据库 Redis 内存版(集群架构)-产品简介-文档中心-腾讯云

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

自定义命令:
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作为条件来用自定义命令操作。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值