Redis trunk版本,提供Cluster功能,下面我们来分析一下这个Cluster实现方式
这里首先执行的是 processCommand
命令,代码如下
/* If this function gets called we already read a whole
* command, argments are in the client argv/argc fields.
* processCommand() execute the command or prepare the
* server for a bulk read from the client.
*/
int processCommand(redisClient *c) {
/* If cluster is enabled, redirect here */
if (server.cluster_enabled &&
!(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0)) {
int hashslot;
if (server.cluster.state != REDIS_CLUSTER_OK) {
addReplyError(c,"The cluster is down. Check with CLUSTER INFO for more information");
return REDIS_OK;
} else {
int ask;
clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&ask);
if (n == NULL) {
addReplyError(c,"Multi keys request invalid in cluster");
return REDIS_OK;
} else if (n != server.cluster.myself) {
addReplySds(c,sdscatprintf(sdsempty(),
"-%s %d %s:%d\r\n", ask ? "ASK" : "MOVED",
hashslot,n->ip,n->port));
return REDIS_OK;
}
}
}
}
在这里我们看到,server.cluster_enabled = True
将直接跳转到,cluster处理逻辑
活动cluster node 的函数是下面这句
clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&ask);
那么redis是如何获得cluster的哪,getNoteByQuery
代码如下
/* This is the first key we see. Check what is the slot
* and node. */
firstkey = margv[keyindex[j]];
slot = keyHashSlot((char*)firstkey->ptr, sdslen(firstkey->ptr));
n = server.cluster.slots[slot];
return n
现在我们知道了是通过 keyHashSlot
获得的,那么具体实现哪?
unsigned int keyHashSlot(char *key, int keylen) {
return crc16(key,keylen) & 0x0FFF;
}
哦,原来crc16 但是请注意 &x0FFF, 其实就是 2**12 = 4096 ,将集群的范围控制在了4096个,这个大家要注意啦
那么继续,我们获得了server 节点,接下来就要执行命令了 我们看到的是 addReplySds
} else if (n != server.cluster.myself) {
addReplySds(c,sdscatprintf(sdsempty(),
"-%s %d %s:%d\r\n", ask ? "ASK" : "MOVED",
hashslot,n->ip,n->port));
return REDIS_OK;
}
下面是
addReplySds
的实现,这里大家对SDS可能有疑惑,SDSLib, A C dynamic strings library
void addReplySds(redisClient *c, sds s) {
if (_installWriteEvent(c) != REDIS_OK) {
/* The caller expects the sds to be free'd. */
sdsfree(s);
return;
}
if (_addReplyToBuffer(c,s,sdslen(s)) == REDIS_OK) {
sdsfree(s);
} else {
/* This method free's the sds when it is no longer needed. */
_addReplySdsToList(c,s);
}
}
将执行的命令放到了buffer里面,也就是放到了远程服务器去执行
/* -----------------------------------------------------------------------------
* Low level functions to add more data to output buffers.
* -------------------------------------------------------------------------- */
int _addReplyToBuffer(redisClient *c, char *s, size_t len) {
size_t available = sizeof(c->buf)-c->bufpos;
if (c->flags & REDIS_CLOSE_AFTER_REPLY) return REDIS_OK;
/* If there already are entries in the reply list, we cannot
* add anything more to the static buffer. */
if (listLength(c->reply) > 0) return REDIS_ERR;
/* Check that the buffer has enough space available for this string. */
if (len > available) return REDIS_ERR;
memcpy(c->buf+c->bufpos,s,len);
c->bufpos+=len;
return REDIS_OK;
}
远程服务器执行命令
/* Exec the command */
if (c->flags & REDIS_MULTI &&
c->cmd->proc != execCommand && c->cmd->proc != discardCommand &&
c->cmd->proc != multiCommand && c->cmd->proc != watchCommand)
{
queueMultiCommand(c);
addReply(c,shared.queued);
} else {
call(c);
}
return REDIS_OK;
当然具体执行命令的是call
方法,如下
/* Call() is the core of Redis execution of a command */
void call(redisClient *c) {
long long dirty, start = ustime(), duration;
dirty = server.dirty;
c->cmd->proc(c);
dirty = server.dirty-dirty;
duration = ustime()-start;
c->cmd->microseconds += duration;
slowlogPushEntryIfNeeded(c->argv,c->argc,duration);
c->cmd->calls++;
if (server.appendonly && dirty)
feedAppendOnlyFile(c->cmd,c->db->id,c->argv,c->argc);
if ((dirty || c->cmd->flags & REDIS_CMD_FORCE_REPLICATION) &&
listLength(server.slaves))
replicationFeedSlaves(server.slaves,c->db->id,c->argv,c->argc);
if (listLength(server.monitors))
replicationFeedMonitors(server.monitors,c->db->id,c->argv,c->argc);
server.stat_numcommands++;
}
那么到这里就查不多了,还有就是如何添加节点,和添加节点后的变化,大家请看
http://redis.io/presentation/Redis_Cluster.pdf
分享到:
相关推荐
**RedisCluster集群与Spring访问Redis详解** Redis是一个高性能的键值数据库,广泛应用于缓存、消息中间件等场景。在大型分布式系统中,为了提供高可用性和数据冗余,我们通常会采用Redis Cluster来构建集群。本文...
Redis Cluster是Redis官方提供的分布式解决方案,它允许用户在多个节点之间分发数据,从而实现高可用性和水平扩展。本文将详细介绍Redis Cluster的工作原理、配置、使用以及与MySQL数据库的配合。 **一、Redis ...
在`redisCluster-demo`这个项目中,你可以期待找到一个使用Java实现的示例,展示如何配置和使用`JedisCluster`或者`Lettuce`来连接Redis Cluster,以及如何进行基本的数据操作。这个示例可以帮助初学者理解如何在...
这个压缩包文件"rediscluster配置文件.zip"包含了一系列配置文件,用于搭建一个三主三从的Redis Cluster架构。在这个架构中,每个主节点都有一个对应的从节点,确保在主节点失效时可以从其从节点接管服务,从而保持...
**Redis Cluster简介** Redis Cluster是Redis的分布式解决方案,它提供了数据分片、故障转移和高可用性等功能。在大型系统中,单个Redis实例可能无法满足存储和性能需求,这时就需要利用Redis Cluster来扩展和分散...
Redis Cluster是Redis官方提供的分布式集群解决方案,它允许用户在多台服务器上部署Redis实例,形成一个高可用、可扩展的数据存储集群。Redis Cluster通过数据分片(Sharding)和槽分区(Slot Partitioning)策略来...
实验结果表明,在高并发访问数(例如10000以上)的场景下,RedisCluster的响应时间明显优于Codis系统,验证了RedisCluster分布式缓存系统在处理高并发访问时的高效率和优越性能。 关键词“分布式缓存”指的是分布式...
### Redis Cluster 的实现机制与原理 #### 集群的核心目标与特性 Redis Cluster 是 Redis 数据库的一个分布式版本,旨在解决单个 Redis 实例在处理大量数据和高并发请求时的局限性。其核心目标包括: 1. **高性能...
使用JFinal Redis Cluster插件时,首先需要将其引入到项目中,这里我们看到有一个名为 "jfinal-rediscluster-plugin-by-shixiaotian-0.0.1.jar" 的文件,这应该是该插件的可执行版本。通常,开发者会将这个JAR文件...
### Redis Cluster 部署与配置详解 #### 一、Redis Cluster 概述 Redis Cluster 是 Redis 3.0 版本引入的一项重要特性,它允许用户将 Redis 实例分组形成一个集群来提供高可用性和数据分区能力。通过这种方式,可以...
Redis高可用集群Redis Cluster搭建 Redis高可用集群Redis Cluster搭建是 Redis 官方推荐的高可用性解决方案,于 3.0 版本推出。Redis Cluster 的主要用途是实现数据分片(Data Sharding),同时也可以实现高可用...
**RedisCluster 概述** Redis 是一款高性能的键值存储系统,它支持丰富的数据类型,如字符串、哈希、列表、集合和有序集合。而 RedisCluster 是 Redis 的分布式解决方案,可以将数据分布在多个节点上,提供高可用性...
redis cluster配置文件,配置后的参考; 创建目录: mkdir -p /etc/redis-cluster mkdir -p /var/log/redis mkdir -p /var/redis/7001 mkdir -p /var/redis/7002 拷贝配置文件: cp /usr/local/redis-3.2.8/redis....
【标题】:“Tomcat 8+ Redis Cluster Session” 在现代Web应用开发中,session管理是不可或缺的一部分,尤其是在分布式系统中。传统的session管理方式在多台服务器之间存在数据同步问题,导致用户状态无法共享,...
RedisCluster是Redis的一种分布式集群解决方案,它允许将数据分散存储在多个节点上,以实现高可用性和可扩展性。在RedisCluster中,每个节点都存储一部分数据,并且负责处理一部分客户端请求,这样可以分摊服务器...
"Redis Cluster集群的搭建与实践" Redis Cluster集群是Redis的一个高可用性解决方案,它可以在多个Redis节点之间分配数据和状态,提供高性能和高可用性的数据存储服务。下面是Redis Cluster集群的主要知识点: 1. ...
本示例“rediscluster集群demo”旨在展示如何设置和操作一个简单的Redis Cluster实例,确保在本地环境中的正确运行。 首先,Redis Cluster采用无中心架构,每个节点都是对等的,并且负责一部分数据。它通过槽(slot...
Redis Cluster 集群模式学习 Redis Cluster 是 Redis 3.0 开始推出的无中心结构集群模式,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接,官方向要求至少 6 个节点才可以保证高可用,即 3 主 3 从...