mirror of
https://github.com/predis/predis.git
synced 2026-08-24 20:59:37 +00:00
4e6ed3f26d
This is a starting point to add a documentation of the whole set of APIs and classes of Predis. The next step will be to actually improve and extend it.
70 lines
1.7 KiB
PHP
70 lines
1.7 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Predis package.
|
|
*
|
|
* (c) Daniele Alessandri <suppakilla@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Predis\Distribution;
|
|
|
|
/**
|
|
* This class implements an hashring-based distributor that uses the same
|
|
* algorithm of libketama to distribute keys in a cluster using client-side
|
|
* sharding.
|
|
*
|
|
* @author Daniele Alessandri <suppakilla@gmail.com>
|
|
* @author Lorenzo Castelli <lcastelli@gmail.com>
|
|
*/
|
|
class KetamaPureRing extends HashRing
|
|
{
|
|
const DEFAULT_REPLICAS = 160;
|
|
|
|
/**
|
|
*
|
|
*/
|
|
public function __construct()
|
|
{
|
|
parent::__construct($this::DEFAULT_REPLICAS);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function addNodeToRing(&$ring, $node, $totalNodes, $replicas, $weightRatio)
|
|
{
|
|
$nodeObject = $node['object'];
|
|
$nodeHash = $this->getNodeHash($nodeObject);
|
|
$replicas = (int) floor($weightRatio * $totalNodes * ($replicas / 4));
|
|
|
|
for ($i = 0; $i < $replicas; $i++) {
|
|
$unpackedDigest = unpack('V4', md5("$nodeHash-$i", true));
|
|
foreach ($unpackedDigest as $key) {
|
|
$ring[$key] = $nodeObject;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function generateKey($value)
|
|
{
|
|
$hash = unpack('V', md5($value, true));
|
|
return $hash[1];
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function wrapAroundStrategy($upper, $lower, $ringKeysCount)
|
|
{
|
|
// Binary search for the first item in _ringkeys with a value greater
|
|
// or equal to the key. If no such item exists, return the first item.
|
|
return $lower < $ringKeysCount ? $lower : 0;
|
|
}
|
|
}
|