1. 程式人生 > >REDIS實踐之使用sort set完成商品篩選排序

REDIS實踐之使用sort set完成商品篩選排序

我們知道 redis中 有個用來排序的函式 sort,我們先看看手冊對它的描述

描述:按條件取得資料
引數:
array(
'by' => 'pattern', //匹配模式
'limit' => array(0, 1),
'get' => 'pattern'
'sort' => 'asc' or 'desc',
'alpha' => TRUE,
'store' => 'external-key'
)

返回或儲存給定列表集合有序集合key中經過排序的元素。


其中可以 使用外部key進行排序 這個外部key可以在 列表、集合、有序集合下。

沒錯,就是利用這個特性, 我們來實現今天所說的業務。

以前做電商web時候 有個篩選商品的業務邏輯,涉及到 七天包退換,貨到付款,可分期這樣的標記或者標籤(Tag),而且還有按照銷量進行排序,這理所當然的就想到了 redis中的 set   和 sort,下面就模擬下一個簡單的實現邏輯:

首先我們使用偽造資料:

//note  商品銷售量  和  商品資訊
for ($i=1; $i < 200; $i++) {
    $redis->set("001|goods_sellhot:good_id_{$i}", mt_rand(0, 1000));
    $arr = range('a', 'z');
    shuffle($arr);
    $redis->set("001|goods_info:good_id_{$i}", json_encode(['name'=>join("", array_slice( $arr, 0, 4 )), 'image'=>'https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png']) );
}
//note  對應的商品id扔進對應的tag set裡
for ($i=1; $i < 100; $i++) {
    $redis->sadd("001|goods_tag:7dayback", mt_rand(1, 200));
    $redis->sadd("001|goods_tag:pay_on_delivery", mt_rand(1, 200));
}

在組合篩選時候 利用集合 的inter 來實現,然後用sort排序
$redis->sInterStore("001|goods_tag:7dayback_And_pay_on_delivery", "001|goods_tag:7dayback", "001|goods_tag:pay_on_delivery");

$sort = array(
                'BY'    =>  "001|goods_sellhot:good_id_*",
                'SORT'  =>  'DESC',
                'limit' =>  array(0, 10),
                'get'   =>  [   "#",                            //id值
                                "001|goods_sellhot:good_id_*",  //銷量
                                "001|goods_info:good_id_*" ]    //商品資訊
    );

$result = $redis->sort("001|goods_tag:7dayback_And_pay_on_delivery", $sort);

print_r($result);

就這樣  一個快速,高效的tag篩選功能就實現了