背景:电商的产品数据来自不同的数据库,比如商品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。