REDIS實踐之使用sort set完成商品篩選排序
阿新 • • 發佈:2019-01-22
我們知道 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篩選功能就實現了