<?phprequire_once("SSDB.php");$ssdb = new SimpleSSDB('127.0.0.1', 8888);生成測試數據
$zname = 'test';for($i=0; $i<1000; $i++){ $key = "k$i"; $score = mt_rand(0, 100); $ssdb->zset($zname, $key, $score);}$size = $ssdb->zsize($zname);echo "total $size items/n";
這段代碼生成了一個名為 zname
的 zset 集合, 里面有 1000 個元素, 某些元素的權重(score)是相同的.
$num = 1;$key_start = '';$score_start = '';while(1){ $items = $ssdb->zscan($zname, $key_start, $score_start, '', 10); if(!$items){ break; } foreach($items as $key=>$score){ printf("%5d: %-5s = %5d/n", $num, $key, $score); // 記住最大的元素和它的權重 $key_start = $key; $score_start = $score; $num += 1; } echo "---/n";}
雖然已經知道集合中有 1000 個元素, 但大多數情況 zset 集合中可能存儲幾百萬個或者更多的元素(SSDB的集合大小只受限于硬盤空間), 所以不能一次把獲取所有的元素, 必須分批遍歷.
作為示例, 這里一次只遍歷 10 個元素, 然后再遍歷后 10 個, 走到所有的元素都遍歷完畢.
zscan 函數為什么需要 key_start 參數?zset 的遍歷是基于 score 的, 也就是按 score 值從小到大遍歷. 那么, zscan() 函數應該只需要 score_start 和 score_end 參數就可以了, 為什么還需要 key_start 呢?
其實, 這個問題很好解答. 設想有 11 個元素都有共同的 score=1, 第一次遍歷時返回了 10 個, 還剩 1 個. 那么, 下一次再遍歷時, 如果 score_start 還是 1, 那么剩下的那個元素將被跳過, 因為 zscan 只返回權重大于 score_start 的元素.
所以, 必須加上 key_start 參數, 讓 zscan 返回權重大于 score_start 且大于 key_start 的元素.
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。
新聞熱點
疑難解答