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