php zscan,PHP redis SCAN、SSCAN、ZSCAN、HSCAN 的使用, pipe 快速redis插入数据
SCAN cursor [MATCH pattern] [COUNT count]
作用:迭代當前數據庫中的數據庫鍵
SCAN 使用 demo connect('127.0.0.1', 6379);
/* Options for the SCAN family of commands, indicating whether to abstract
empty results from the user. If set to SCAN_NORETRY (the default), phpredis
will just issue one SCAN command at a time, sometimes returning an empty
array of results. If set to SCAN_RETRY, phpredis will retry the scan command
until keys come back OR Redis returns an iterator of zero */
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$iterator = null;
$count = 1000; // 測試時redis中大概有20w個key,用時約2s,當count為500時用時約4s,count越大時掃描用時越短(當然需要根據你的業務需要來定)
$prefix = date('Ymd');
$time1 = msectime();
$total = [];
while ($arrKeys = $redis->scan($iterator, $prefix . '*', $count)) {
$arrValues = $redis->mget($arrKeys);
$ret = array_combine($arrKeys, $arrValues);
$total = array_merge($total, $ret);
}
$time2 = msectime();
$time = $time2 - $time1;
echo 'time : ' . $time . ' ms; total keys : ' . count($total) . PHP_EOL;
// time : 2009 ms; total keys : 129798 (用時2009 ms,20w中共有129798個前綴為$prefix的key)
function msectime() {
list($msec, $sec) = explode(' ', microtime());
$msectime = (float)sprintf('%.0f', (floatval($msec) + floatval($sec)) * 1000);
return $msectime;
}
SSCAN
SCAN cursor [MATCH pattern] [COUNT count]
作用:用于迭代集合鍵中的元素
SSCAN使用demo connect('127.0.0.1', 6379);
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$time1 = msectime();
while ($arrKeys = $redis->sscan($mainKey, $iterator, $prefix . '*', $count)) { // 匹配前綴為當前日期的key
$total += $arrKeys;
}
$time2 = msectime();
$time = $time2 - $time1;
echo 'use time : ' . $time . ' ms; total keys : ' . count($total) . PHP_EOL;
// use time : 649 ms; total keys : 90010 (這個集合中有20w個元素)
....... other code ......
ZSCAN
ZSCAN cursor [MATCH pattern] [COUNT count]
作用:用于迭代有序集合中的元素
ZSCAN使用demo connect('127.0.0.1', 6379);
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$time1 = msectime();
while ($arrKeys = $redis->zscan($mainKey, $iterator, $prefix . '*', $count)) { // 匹配key前綴是 10 的所有key
var_dump($arrKeys);
$total += $arrKeys;
}
$time2 = msectime();
$time = $time2 - $time1;
echo 'use time : ' . $time . ' ms; total keys : ' . count($total) . PHP_EOL;
// use time : 317 ms; total keys : 1111 (這個集合中有10w個元素)
...... other code ......
HSCAN
HSCAN cursor [MATCH pattern] [COUNT count]
作用:用于迭代哈希中的元素
HSACN 使用demo connect('127.0.0.1', 6379);
$redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
$time1 = msectime();
while ($arrKeys = $redis->hscan($mainKey, $iterator, $match, $count)) { // 匹配含有'key'的鍵
var_dump($arrKeys);
$total += $arrKeys;
}
$time2 = msectime();
$time = $time2 - $time1;
echo 'use time : ' . $time . ' ms; total keys : ' . count($total) . PHP_EOL;
// use time : 1484 ms; total keys : 100000
...... other code ......
redis pipe 代碼demo (快速向有序集合添加100000個key, 其他操作類似, 只要修改for中的操作即可)
$pipe = $redis->multi(Redis::PIPELINE);
for ($i = 0; $i < 100000; $i++) {
$redis->zAdd($key, $i, $i);
}
$curValues = $pipe->exec();
$val = $redis->zRange($key, 0, -1, true);
var_dump($val);
總結
以上是生活随笔為你收集整理的php zscan,PHP redis SCAN、SSCAN、ZSCAN、HSCAN 的使用, pipe 快速redis插入数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何解决All flavors must
- 下一篇: PHP中文手册1