文档:云数据库 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作为条件来用自定义命令操作。