排行榜设计(mysql)
排行榜设计
CREATE TABLE `t_daka_rank` (
`id` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
`consumer_id` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`ranking` int DEFAULT NULL COMMENT '排名',
`rank_status` int DEFAULT NULL COMMENT '与昨天比的名次变化',
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='大咖排名记录';
排名规则
用户得分做去重排序、每个用户的得分与排序名次对应,确保同分时,排名相同。
名次变化计算方式
根据上次排名、与这次的排名进行比较,1为上升1名,0为不变,-1为下降1名
ps: 值得注意的是,如果排名不做实时的,那么新加入的用户会暂时没有排名、名次等信息,直到生成下次排名。
数据存储
mysql记录每次排名生成的数据(如上面的表设计)
redis保存各个用户的id、与之对应的排名、名次,用于业务查询。
遇到的问题
当把LocalDateTime
类型的字段保存到redis,再取出来的时候会报序列化错误. 这是由于redis序列化的方式,和我们取出来反序列化的方式不一致产生的。
解决方式:加注解
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime createTime;