java多线程    Java入门    vsftp    ftp    linux配置    centos    FRP教程    HBase    Html5缓存    webp    zabbix    分布式    neo4j图数据库    

借助redis实现快速排序

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


This entry was posted in PHP and tagged . Bookmark the permalink.
月小升QQ 2651044202, 技术交流QQ群 178491360
首发地址:月小升博客https://java-er.com/blog/redis-sort-data/
无特殊说明,文章均为月小升原创,欢迎转载,转载请注明本文地址,谢谢
您的评论是我写作的动力.

Leave a Reply