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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值