当前位置: 首页 > 后端技术 > PHP

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

时间:2023-03-30 05:31:14 PHP

业务场景:Redis以高效读取数据着称。我们经常将数据存储在redis中的mysql、oracle等关系型数据库中。根据key=>value的查询是高效的,但是我们的需求是通过多个条件组合来查询的,比如queryselect*fromtablewheremoney>1000andidnotin(1,2,3,4)orderbyid,moneyasclimit10下面是代码片段1,mysql数据转redis数据,索引foreach($f_listas$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);