我们知道 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筛选功能就实现了