背景:电商的产品数据来自不同的数据库,比如商品ID和名字,价格来自商品表,而订单量来自订单表,收藏来自收藏表,浏览数据来自浏览表。不同的表数据需要组合在一起各种排序,如果建立一个大的MYSQL就发现MYSQL的作用仅仅是一个临时排序用的。
所以就想到了Redis
Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 有序集合的成员是唯一的,但分数(score)却可以重复。
特点:ZADD命令重复插入,后面的覆盖前面的
小测试一下。
127.0.0.1:6379> ZADD Test 1 S1 (integer) 1 127.0.0.1:6379> ZADD Test 2 S1 (integer) 0 127.0.0.1:6379> ZADD Test 2 S2 (integer) 1 127.0.0.1:6379> ZADD Test 2 S3 (integer) 1 127.0.0.1:6379> ZADD Test 4 S3 (integer) 0 |
当重复插入的时候,后面的 ZADD Test 2 S1 覆盖了第一条命令
127.0.0.1:6379> Zrange Test 0 10 withscores 1) "S1" 2) "2" 3) "S2" 4) "2" 5) "S3" 6) "4" |
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
情况电商的产品,分为商品ID,商品SKU_CODE, 商品价格,商品上架日期,销售订单数,产品展示次数,产品收藏次数。
排序需求
1. 按上架日期倒排 2. 按订单倒排 3. 按展示次数倒排 4. 按订单数除以展示次数,得出转化率倒排 5. 按收藏次数排序 |
设计思路 假设以销量来排序。
1. 让数据全部以某个字段排序插入,假设商品的ID 为 1 2 3 名字为Name1 2 3 销量为25 30 27
ZADD Product 25 1 ZADD Product 30 2 ZADD Product 27 3 |
php代码片段
$redis->zadd('SkuOrder',$score,$sku_id); |
2. 所有数据以商品ID为key插入另一个hash
将商品的数据序列化为一个字符串
$member = serialize($skuArr); $redis->hset('SkuTable',$sku_id,$member); |
3. 从Product的redis里读取数据,根据ID来获取商品其他维度的数据,重新组合为数组。
当需要用其他维度排序的时候,重新组合一个Sorted Set有序集合即可。然后所有的Sorted Set有序集合共同使用SkuTable 这个Hash。