练涛

排行榜设计(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;
posted @ 2021-08-04 16:38  练涛  阅读(302)  评论(0编辑  收藏  举报