前言
这次来总结思考一下工作中的两个功能的设计与实现,一是丰享达人榜,二是丰享签到活动,三是商城秒杀活动,这里涉及到典型的互联网应用场景,都是tps,qps可能较高,要求接口延迟较短,有较好的用户交互体验。当然我们不可能像互联网大厂那样自研中间件,数据的存储无疑就是redis和mysql,从前面的要求来看,我们不能每次操作都对数据库进行操作,好在这类数据都不算敏感,可以容许因为异常导致的丢失和不准确,所以基本思路应该就是:主要依赖于redis缓存的crud操作,异步再去持久化数据到数据库,接下来看看具体的实现。
1 丰享达人榜
1积分排行列表
数据库表: rank_like{ id,date,theme_id(主题),user_id,balance(余额),integral(积分)}
积分排行列表是由数据组计算好入库,每天更新一次,最多100条。这里以date和theme_id为索引,过滤之后就是100条数据,再按balance或者integral做一个order by压力不大。这里没有要用户的信息比如头像,如果需要完全可以冗余到前面那个表
缓存 :String类型 key为:RANK_LIKE_${theme_id}_${date},value为排好序的列表
这里可以给这个列表设置一个两小时String类型缓存,直接把排好序的列表数据序列化反序列化,date参数可以防止因为两小时缓存跨天的时候不失效,所以这个列表的数据展示压力不大。
2列表用户的点赞总数量、当前用户是否已经点赞
方案1
缓存:Hash类型,key为RANK_USER_LIKE_${theme_id}_{list_user_id},field为${cur_user_id},value为是否点赞0/1
点赞取消点赞操作只需要hset RANK_USER_LIKE_${theme_id}_{list_user_id} ${cur_user_id} 0/1就行了