• Redis源码之常见数据结构--ClusterNode


    typedef struct redisDb {
        dict *dict;                 /* The keyspace for this DB */
        dict *expires;              /* Timeout of keys with a timeout set */
        dict *blocking_keys;        /* Keys with clients waiting for data (BLPOP) */
        dict *ready_keys;           /* Blocked keys that received a PUSH */
        dict *watched_keys;         /* WATCHED keys for MULTI/EXEC CAS */
        struct evictionPoolEntry *eviction_pool;    /* Eviction pool of keys */
        int id;                     /* Database ID */
        PORT_LONGLONG avg_ttl;          /* Average TTL, just for stats */
    } redisDb;

    redisDb 表示的是初始16个数据库中的一个数据库
    typedef struct redisObject {
        unsigned type:4;
        unsigned encoding:4;
        unsigned lru:REDIS_LRU_BITS; /* lru time (relative to server.lruclock) */
        int refcount;
        void *ptr;
    } robj;

    每一个redis的key和value都是一个redisObject,里面有个lru

      

      clusterNode表示Redis中的一个node以集群方式启动后,其中的一个Node,尤其要注意的是slots字段,表示它负责的槽位

    typedef struct clusterNode {
        mstime_t ctime; /* Node object creation time. */
        char name[REDIS_CLUSTER_NAMELEN]; /* Node name, hex string, sha1-size */
        int flags;      /* REDIS_NODE_... */
        uint64_t configEpoch; /* Last configEpoch observed for this node */
        unsigned char slots[REDIS_CLUSTER_SLOTS/8]; /* slots handled by this node */
        int numslots;   /* Number of slots handled by this node */
        int numslaves;  /* Number of slave nodes, if this is a master */
        struct clusterNode **slaves; /* pointers to slave nodes */
        struct clusterNode *slaveof; /* pointer to the master node */
        mstime_t ping_sent;      /* Unix time we sent latest ping */
        mstime_t pong_received;  /* Unix time we received the pong */
        mstime_t fail_time;      /* Unix time when FAIL flag was set */
        mstime_t voted_time;     /* Last time we voted for a slave of this master */
        mstime_t repl_offset_time;  /* Unix time we received offset for this node */
        PORT_LONGLONG repl_offset;      /* Last known repl offset for this node. */
        char ip[REDIS_IP_STR_LEN];  /* Latest known IP address of this node */
        int port;                   /* Latest known port of this node */
        clusterLink *link;          /* TCP/IP link with this node */
        list *fail_reports;         /* List of nodes signaling this as failing */
    } clusterNode;

      

      clusterState 

    typedef struct clusterState {
        clusterNode *myself;  /* This node */
        uint64_t currentEpoch;
        int state;            /* REDIS_CLUSTER_OK, REDIS_CLUSTER_FAIL, ... */
        int size;             /* Num of master nodes with at least one slot */
        dict *nodes;          /* Hash table of name -> clusterNode structures */
        dict *nodes_black_list; /* Nodes we don't re-add for a few seconds. */
        clusterNode *migrating_slots_to[REDIS_CLUSTER_SLOTS];
        clusterNode *importing_slots_from[REDIS_CLUSTER_SLOTS];
        clusterNode *slots[REDIS_CLUSTER_SLOTS];//保存所有槽位分配情况
        zskiplist *slots_to_keys;
        /* The following fields are used to take the slave state on elections. */
        mstime_t failover_auth_time; /* Time of previous or next election. */
        int failover_auth_count;    /* Number of votes received so far. */
        int failover_auth_sent;     /* True if we already asked for votes. */
        int failover_auth_rank;     /* This slave rank for current auth request. */
        uint64_t failover_auth_epoch; /* Epoch of the current election. */
        int cant_failover_reason;   /* Why a slave is currently not able to
                                       failover. See the CANT_FAILOVER_* macros. */
        /* Manual failover state in common. */
        mstime_t mf_end;            /* Manual failover time limit (ms unixtime).
                                       It is zero if there is no MF in progress. */
        /* Manual failover state of master. */
        clusterNode *mf_slave;      /* Slave performing the manual failover. */
        /* Manual failover state of slave. */
        PORT_LONGLONG mf_master_offset; /* Master offset the slave needs to start MF
                                       or zero if stil not received. */
        int mf_can_start;           /* If non-zero signal that the manual failover
                                       can start requesting masters vote. */
        /* The followign fields are used by masters to take state on elections. */
        uint64_t lastVoteEpoch;     /* Epoch of the last vote granted. */
        int todo_before_sleep; /* Things to do in clusterBeforeSleep(). */
        PORT_LONGLONG stats_bus_messages_sent;  /* Num of msg sent via cluster bus. */
        PORT_LONGLONG stats_bus_messages_received; /* Num of msg rcvd via cluster bus.*/
    } clusterState;
  • 相关阅读:
    安卓学习第一课——电话拨号器
    CodeForces 644B【模拟】
    hdu5861【线段树】
    CodeForces 41A+43A【课上无聊刷水题系列】
    hdoj5493【树状数组+二分】
    HDU5894【组合数学】
    Codeforces643A【一种暴力】
    CodeForces 689C【二分】
    CodeForces 665B 【水-暴力】
    CodeForces 653A【水】
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14308145.html
Copyright © 2020-2023  润新知