最近写Redis,需要给集合批量插入数据,用循环肯定是不正常的人干的,这里记录下方法,以便日后使用
无序集合
使用sAddArray方法
例子:
/**
* @param $r_key
* @param string $type
* @param int $expire : 默认过期时间
* @param null $r_prefix:自定义生成slot的前缀,默认前缀将设置为 {QQSTORE}
* @return mixed
* 将不在同一slot的key 【备份至】 同一个 slot
*/
public function RKeyClassify($r_key,$type='SSCAN',$r_prefix=null,$expire=300) {
$r_prefix = is_null($r_prefix) ? AppCRedisKeys::$prefix : $r_prefix;
$new_key = str_replace($r_prefix,"{{$r_prefix}}",$r_key);
$iterator = NULL;
while ($sortKvs = by::redis('core')->$type($r_key,$iterator,NULL,100)) {
switch ($type) {
case "SSCAN" :
by::redis('core')->sAddArray($new_key,$sortKvs);
break;
default :
break;
}
}
//默认设置过期时间,防止开发者忘记删除
by::redis('core')->expire($new_key,$expire);
return $new_key;
}
使用redis的{}功能,将key设置在一个slot内,主要是集群情况下如果想使用ZUNIONSTORE会遇到相关的问题
有序集合
使用php自带的call_user_func_array方法
例子:
$zadd = [$r_key]; foreach ($rets as $ret) { $zadd[] = $ret['id']; $zadd[] = "{$ret['user_id']}|{$ret['d_id']}"; } // [rkey, socres1, 'value1',socres2, 'value2' .... ] call_user_func_array([$redis,"ZADD"],$zadd); $redis->expire($r_key,86400);
0 条评论