最近写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 条评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据