在线看片18_亚洲性吧_在线污_神马午夜达达兔_奇米色网_在线免费看污

redis集群使用

請(qǐng)查看安裝章節(jié)的redis集群相關(guān)配置使用

集群兼容方法

在正常情況下,有些方法是不能直接被集群客戶端調(diào)用成功的,比如mSet方法,它涉及了多個(gè)鍵名的操作,而多個(gè)鍵名是會(huì)分配給其他節(jié)點(diǎn)的
目前redis集群客戶端,實(shí)現(xiàn)了部分多鍵名操作方法的兼容,實(shí)現(xiàn)原理如下:
對(duì)多鍵名操作方法,進(jìn)行拆分成單鍵名,然后通過(guò)鍵名去獲取槽節(jié)點(diǎn),再通過(guò)槽節(jié)點(diǎn)分配的client去執(zhí)行,每次只會(huì)執(zhí)行一個(gè)鍵名

已經(jīng)實(shí)現(xiàn)了兼容的方法:

方法名稱 參數(shù) 說(shuō)明 備注
mSet $data 設(shè)置多個(gè)鍵值對(duì)
mGet $keys 獲取多個(gè)鍵名的值
mSetNx $data 設(shè)置多個(gè)鍵值對(duì) 該方法將不能準(zhǔn)確的判斷"當(dāng)所有key不存在時(shí),設(shè)置多個(gè)key值"

集群禁用方法

由于集群的特性,不同的key分配到了不同的槽位,當(dāng)你調(diào)用sUnion,sUnIonStore等涉及多個(gè)key操作的命令時(shí),將會(huì)返回false,同時(shí)錯(cuò)誤信息會(huì)在$redis->getErrorMsg()中顯示:

$redis = new \EasySwoole\Redis\RedisCluster(new \EasySwoole\Redis\Config\RedisClusterConfig([
    ['172.16.253.156', 9001],
    ['172.16.253.156', 9002],
    ['172.16.253.156', 9003],
    ['172.16.253.156', 9004],
], [
    'auth'      => '',
    'serialize' => \EasySwoole\Redis\Config\RedisConfig::SERIALIZE_PHP
]));

$data = $redis->sUnIonStore('a','v','c');
var_dump($data,$redis->getErrorMsg());

將輸出:

bool(false)
string(53) "CROSSSLOT Keys in request don't hash to the same slot"

集群客戶端調(diào)度邏輯

客戶端默認(rèn)調(diào)度

集群客戶端在調(diào)用redis方法的時(shí)候,自動(dòng)默認(rèn)一個(gè)客戶端進(jìn)行發(fā)送接收命令:

function sendCommand(array $com, ?ClusterClient $client = null): bool
{
    $client = $client ?? $this->getDefaultClient();
    $this->setDefaultClient($client);
    return $this->sendCommandByClient($com, $client);
}

function recv($timeout = null, ?ClusterClient $client = null): ?Response
{
    $client = $client ?? $this->getDefaultClient();
    $this->setDefaultClient($client);
    return $this->recvByClient($client, $timeout);
}

當(dāng)get,或者set的key值槽位不一致時(shí),會(huì)自動(dòng)切換客戶端進(jìn)行發(fā)送接收命令:

 //節(jié)點(diǎn)轉(zhuǎn)移客戶端處理
if ($result->getErrorType() == 'MOVED') {
    $nodeId = $this->getMoveNodeId($result);
    $client = $this->getClient($nodeId);
    $this->clientConnect($client);
    //只處理一次moved,如果出錯(cuò)則不再處理
    $client->sendCommand($command);
    $result = $client->recv($timeout ?? $this->config->getTimeout());
}

切換完成之后,下一次命令,依舊是默認(rèn)客戶端.

獲取集群的客戶端

集群操作方法列表:

方法名稱 參數(shù) 說(shuō)明 備注
getNodeClientList 獲取集群客戶端列表
getNodeList 獲取集群節(jié)點(diǎn)信息數(shù)組
clientAuth ClusterClient $client, $password 集群客戶端auth驗(yàn)證
setDefaultClient ClusterClient $defaultClient 設(shè)置一個(gè)默認(rèn)的客戶端
getDefaultClient 獲取一個(gè)默認(rèn)的客戶端(初始化會(huì)自動(dòng)默認(rèn)一個(gè))
tryConnectServerList 嘗試重新獲取客戶端列表 當(dāng)調(diào)用命令返回false,可嘗試重新獲取
getClient $nodeKey = null 根據(jù)nodeKey獲取一個(gè)客戶端
getMoveNodeId Response $response 根據(jù)recv返回的Move消息獲取一個(gè)nodeKey
getSlotNodeId $slotId 根據(jù)槽id獲取 nodeKey

這些方法用于用戶自定義發(fā)送命令給redis服務(wù)端,或者是自己定義默認(rèn)客戶端進(jìn)行發(fā)送

集群兼容管道方法

由于管道的特性,開(kāi)啟管道后,之后執(zhí)行的命令將會(huì)保存不會(huì)直接發(fā)送,直到最后執(zhí)行execPipe才會(huì)一次性發(fā)送
在集群中,只能選擇一個(gè)客戶端,進(jìn)行一次性發(fā)送命令:

方法名稱 參數(shù) 說(shuō)明 備注
execPipe ?ClusterClient $client = null 一次性執(zhí)行管道中保存的方法 可通過(guò)獲取客戶端列表,自定義選擇一個(gè)客戶端進(jìn)行發(fā)送
discardPipe 取消管道
startPipe 管道開(kāi)始記錄
主站蜘蛛池模板: 国产黄视频在线观看 | 亚洲成人免费 | 国产精品第一页在线观看 | 一级片久久久 | 日本黄a三级三级三级 | 麻豆亚洲一区 | 国产精选在线 | 精品一区二区三区四区 | a在线免费观看 | 男人久久 | 久久99精品久久久久久 | 深夜福利成人 | 久久精品伦理 | 国产精品www| 国产在线观看av | 欧美性高潮视频 | 欧美一区二区三区婷婷月色 | 亚洲色欲色欲www | 国产麻豆精品久久一二三 | 国产成人av在线 | 91美女高潮出水 | 五月在线视频 | 国产精品呻吟久久 | 全国男人的天堂网 | 亚洲一区二区三区精品视频 | 亚洲一二三视频 | 天天色综合av | 亚洲天堂色图 | 高清视频一区二区 | 国产精品理论在线 | 欧美一级黄 | 五月天三级 | 悠悠色综合 | 日本美女黄色一级片 | 亚洲欧洲在线观看 | 福利视频午夜 | 国产成人av在线 | av天天干 | 成人av免费网站 | 日本道不卡 | 国产91在线视频 |