redis實現像關係型資料庫一樣按條件高效查詢分頁

gordanhappy發表於2019-02-16

業務場景: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);

相關文章