Class KetamaNodeLocator

  • All Implemented Interfaces:
    NodeLocator

    public final class KetamaNodeLocator
    extends SpyObject
    implements NodeLocator
    This is an implementation of the Ketama consistent hash strategy from last.fm. This implementation may not be compatible with libketama as hashing is considered separate from node location. Note that this implementation does not currently supported weighted nodes.
    See Also:
    RJ's blog post
    • Field Detail

      • ketamaNodes

        private volatile java.util.TreeMap<java.lang.Long,​MemcachedNode> ketamaNodes
      • allNodes

        private volatile java.util.Collection<MemcachedNode> allNodes
      • weights

        private final java.util.Map<java.net.InetSocketAddress,​java.lang.Integer> weights
      • isWeightedKetama

        private final boolean isWeightedKetama
    • Constructor Detail

      • KetamaNodeLocator

        public KetamaNodeLocator​(java.util.List<MemcachedNode> nodes,
                                 HashAlgorithm alg)
        Create a new KetamaNodeLocator using specified nodes and the specifed hash algorithm.
        Parameters:
        nodes - The List of nodes to use in the Ketama consistent hash continuum
        alg - The hash algorithm to use when choosing a node in the Ketama consistent hash continuum
      • KetamaNodeLocator

        public KetamaNodeLocator​(java.util.List<MemcachedNode> nodes,
                                 HashAlgorithm alg,
                                 KetamaNodeKeyFormatter.Format nodeKeyFormat,
                                 java.util.Map<java.net.InetSocketAddress,​java.lang.Integer> weights)
        Create a new KetamaNodeLocator with specific nodes, hash, node key format, and weight
        Parameters:
        nodes - The List of nodes to use in the Ketama consistent hash continuum
        alg - The hash algorithm to use when choosing a node in the Ketama consistent hash continuum
        nodeKeyFormat - the format used to name the nodes in Ketama, either SPYMEMCACHED or LIBMEMCACHED
        weights - node weights for ketama, a map from InetSocketAddress to weight as Integer
      • KetamaNodeLocator

        public KetamaNodeLocator​(java.util.List<MemcachedNode> nodes,
                                 HashAlgorithm alg,
                                 KetamaNodeLocatorConfiguration conf)
        Create a new KetamaNodeLocator using specified nodes and the specifed hash algorithm and configuration.
        Parameters:
        nodes - The List of nodes to use in the Ketama consistent hash continuum
        alg - The hash algorithm to use when choosing a node in the Ketama consistent hash continuum
        conf -
      • KetamaNodeLocator

        public KetamaNodeLocator​(java.util.List<MemcachedNode> nodes,
                                 HashAlgorithm alg,
                                 java.util.Map<java.net.InetSocketAddress,​java.lang.Integer> nodeWeights,
                                 KetamaNodeLocatorConfiguration configuration)
        Create a new KetamaNodeLocator with specific nodes, hash, node key format, and weight
        Parameters:
        nodes - The List of nodes to use in the Ketama consistent hash continuum
        alg - The hash algorithm to use when choosing a node in the Ketama consistent hash continuum
        weights - node weights for ketama, a map from InetSocketAddress to weight as Integer
        configuration - node locator configuration
    • Method Detail

      • getAll

        public java.util.Collection<MemcachedNode> getAll()
        Description copied from interface: NodeLocator
        Get all memcached nodes. This is useful for broadcasting messages.
        Specified by:
        getAll in interface NodeLocator
      • getPrimary

        public MemcachedNode getPrimary​(java.lang.String k)
        Description copied from interface: NodeLocator
        Get the primary location for the given key.
        Specified by:
        getPrimary in interface NodeLocator
        Parameters:
        k - the object key
        Returns:
        the QueueAttachment containing the primary storage for a key
      • getMaxKey

        long getMaxKey()
      • getSequence

        public java.util.Iterator<MemcachedNode> getSequence​(java.lang.String k)
        Description copied from interface: NodeLocator
        Get an iterator over the sequence of nodes that make up the backup locations for a given key.
        Specified by:
        getSequence in interface NodeLocator
        Parameters:
        k - the object key
        Returns:
        the sequence of backup nodes.
      • updateLocator

        public void updateLocator​(java.util.List<MemcachedNode> nodes)
        Description copied from interface: NodeLocator
        Update locator status.
        Specified by:
        updateLocator in interface NodeLocator
        Parameters:
        nodes - New locator nodes.
      • getKetamaNodes

        protected java.util.TreeMap<java.lang.Long,​MemcachedNode> getKetamaNodes()
        Returns:
        the ketamaNodes
      • setKetamaNodes

        protected void setKetamaNodes​(java.util.List<MemcachedNode> nodes)
        Setup the KetamaNodeLocator with the list of nodes it should use.
        Parameters:
        nodes - a List of MemcachedNodes for this KetamaNodeLocator to use in its continuum
      • ketamaNodePositionsAtIteration

        private java.util.List<java.lang.Long> ketamaNodePositionsAtIteration​(MemcachedNode node,
                                                                              int iteration)