design.md 2.66 KB

新潮教室

Redis设计

记录用户连续签到的天数。

用户签到成功之后,需要设置这个值。 key过期时间是当天时间到第二天零点,例如,当前设置时间为 2016-04-01 17:48, 则失效时间为2016-04-03 00:01 Key Value结构: KEY: <UID>, Value: NUMBER , 例如 checkedDays:10623456-->6 表示10623456已经连续签到6天。

记录用户当天是否签到。

用户签到成功之后,需要设置这个值。key过期时间:当天时间到今晚零点, 例如,设置时间为 2016-04-01 17:48, 则失效时间为2016-04-02 00:01 Key Value结构: KEY: <UID>, Value: Y or N , 例如 10623456-->Y 表示10623456当天已经签到。

记录用户签到记录。

缓存用户的签到记录。查询的时候,从数据库中获取,然后写入到缓存中。用户签到之后,删除缓存 LIST结构: KEY: <UID> , Value: [2015-03-12 18:12:12, 2015-03-13 18:12:12 ]

记录用户最近一次签到时间。

缓存用户最近的签到时间。 用户签到成功之后,需要设置这个值。 失效: 1个月 Key Value结构: KEY:<UID>, Value:LAST-CHECKIN-TIME(最近签到时间(unix 秒数)), 例如:10623456-->143026666

所有用户的亲密度信息。

不失效。 用户签到成功,修改了亲密度之后,添加element。 SortedSet接口, KEY: STAR_ORDER, Value: { <LAST-CHECKIN-TIME:UID>--> 亲密度信息 }

表设计

Table: user_cohesion 用户-亲密度表

列名 说明
uid 用户ID, 主键
cohesion 亲密度(int)
last_update 更新时间,格式为int (到现在的秒数)

Table: user_checkin_record 用户-签到记录表。 签到成功之后,添加记录

列名 说明
id 自增主键
uid 用户ID , 索引
checkin_time 签到时间,格式为int (到现在的秒数)

流程

签到

插入到签到记录表--> 计算应该新增的亲密度--> 修改用户亲密度表,添加亲密度 --》缓存修改(见下图)

流程图

查询亲密度前3名

所有用户的亲密度信息Cache中取前3个

获取我的亲密度排名

记录用户最近一次签到时间Cache 中找到用户最近一次签到时间(如果没有,则从数据库user_checkin_record中查找,并且设置到缓存中)-->从 所有用户的亲密度信息 Cache 中找出Element的rank(ZRANK)