背景:
最近接到个需求,要求汇总用户一个月内在不同的供应商处购买的商品sku(上限1000条),去重后按照购买时间去倒序排序,当用户再次在对应的供应商处购买商品时,弹出之前的购买sku列表。
分析:
这个需求,简化后就是要求对用户(User)和供应商(Supplier) 做一个唯一键,在这个唯一键上,按照时间倒序去汇总好去重后的(Sku)。略微思考,使用redis的zset可以比Mysql,或者es更为方便处理。zset本身就能实现去重的功能,且对于同一元素进行重复赋值,会更新score;排序可以通过使用购买时间的timestamp作为score 来实现;保证一个唯一键只有一个月内1000条历史数据,可以通过zremrangebyscore和zremrangebyrank两个zset自带方法实现。
核心代码:
简化后的商品sku购买历史数据库DO
public class SccPurchaseDetailDO implements Serializable {
/**
* ID
*/
private Long id;
/**
* 订单号
*/
private String bizOrderNo;
/**
* 商品行ID, 同一个订单号, 可以采购多条sku, itemId用于区分该订单号下不同sku购买排序
*/
private Integer itemId;
/**
* 二级类目id
*/
private Long skuId;
/**
* 创建时间
*/
private Date gmtCreate;
}
简化后的zset缓存计算逻辑
/**
* 创建zset的key - 含供货商信息
*
* @param userId 用户id
* @param supplierEntId 供应商企业id
* @return
*/
private String makePayeeZSetKey(Long userId, Long supplierEntId)