资讯专栏INFORMATION COLUMN

redis实现像关系型数据库一样按条件高效查询分页

YancyYe / 1981人阅读

摘要:业务场景以高效读取数据著称,我们常常把等关系型数据库的数据存储在中,按照这种查询是高效的,但是我们的需求是按多个条件组合来查询,如查询以下是代码片段数据转数据,并构建索引以上代码用到了数据结构有集合有序集合,用到了集合的合并

业务场景:redis以高效读取数据著称,我们常常把mysql、oracle等关系型数据库的数据存储在redis中,按照key=>value 这种查询是高效的,但是我们的需求是按多个条件组合来查询,如查询 select *from table where money>1000 and id not in(1,2,3,4) order by id,money asc limit 10 以下是代码片段

1、mysql数据转redis数据,并构建索引

           foreach($f_list as $key=>$f)
            {
                RDBX::instance("redis")->set("data:fins:".$f["id"],json_encode($f));


                $tmp_idx_fins_id_arr[] = $f["id"];

                RDBX::instance("redis")->sAdd("idx:fins:source_type:".$f["source_type"],$f["id"]);
                RDBX::instance("redis")->sAdd("idx:fins:bill_day:".$f["bill_day"],$f["id"]);
                $tmp_idx_fins_money[] = $f["money"];
                $tmp_idx_fins_money[] = $f["id"];


                $tmp_source_type_arr[] = $f["source_type"];
                $tmp_bill_day_arr[] = $f["bill_day"];
                $tmp_money_arr[] = $f["money"];



                RDBX::instance("redis")->set("score:fins:invest_time:".$f["id"],$f["invest_time"]);
                RDBX::instance("redis")->set("score:fins:money:".$f["id"],$f["money"]);

                RDBX::instance("redis")->sAdd("idx:fins:client_id:".$f["client_id"],$f["id"]);


                $tmp_client_id_arr[] = $f["client_id"];

                RDBX::instance("redis")->set("score:fins:id:invest_time:".$f["id"],$f["id"].$f["invest_time"]);
                RDBX::instance("redis")->set("score:fins:id:money:".$f["id"],$f["id"].$f["money"]);



            }
            call_user_func_array(array(RDBX::instance("redis"), "zAdd"), $tmp_idx_fins_money);
            call_user_func_array(array(RDBX::instance("redis"), "sAdd"), $tmp_idx_fins_id_arr);
            call_user_func_array(array(RDBX::instance("redis"), "sAdd"), $tmp_source_type_arr);
            call_user_func_array(array(RDBX::instance("redis"), "sAdd"), $tmp_bill_day_arr);
            call_user_func_array(array(RDBX::instance("redis"), "sAdd"), $tmp_money_arr);
            call_user_func_array(array(RDBX::instance("redis"), "sAdd"), $tmp_client_id_arr);

以上代码用到了redis数据结构有 集合、有序集合,用到了集合的合并操作

2、实现按各种组合条件查询

    RDBX::instance("redis")->sDiffStore("sdiff_ids","idx:fins","not_fids","idx:fins:client_id:".$this->linfo["fincncin_client_id"]);
    $idx_fins_source_type_set = "idx:fins:source_type:".$this->linfo["source_type"];
    $idx_fins_bill_day_set = "idx:fins:bill_day:".$this->linfo["repay_day"];
    RDBX::instance("redis")->SinterStore("sinter_multi",$idx_fins_source_type_set,$idx_fins_bill_day_set,$money_set,"sdiff_ids");
    $sort=array("BY"=>$by_double,
        "SORT"=>"ASC",
        "GET"=>"data:fins:*",
        "LIMIT"=>array(0,$num)
    );
    $list =  RDBX::instance("redis")->sort("sinter_multi",$sort);

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30717.html

相关文章

  • 我用云缓存Redis实现了一个轻量级的搜索引擎!

    摘要:这里会发现,漏了一个价格的条件。总结这里只是一个采用优化查询搜索的一个简单,和现有的开源搜索引擎相比,它更轻量,学习成本页相应低些。大家如果是做后端开发的,想必都实现过列表查询的接口,当然有的查询条件很简单,一条 SQL 就搞定了。但有的查询条件极其复杂,再加上库表中设计的各种不合理,导致查询接口特别难写,然后加班什么的就不用说了(不知各位有没有这种感受呢~)。下面以一个例子开始,这是某购物...

    Tecode 评论0 收藏0

发表评论

0条评论

YancyYe

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<