问题--时景重复点赞问题排查及解决方案

1. 黄海龙官赞了2次

2016/7/5 9:12:31
2016/7/5 9:13:17

相隔时间 45784ms 约45s

2. 明侠赞了6次,
2016/7/5 6:33:12
2016/7/5 7:16:9
2016/7/5 7:30:18
2016/7/5 9:3:48
2016/7/5 9:4:3
2016/7/5 13:55:12

第1次和第2次时间间隔:2577425ms 约 2577s 约43min,
第2次和第3次时间间隔:848283ms 约 848s 约 14min
第3次和第4次时间间隔:5609891ms 约 5609ms 约 93min
第4次和第5次时间间隔:15780ms 约15s
第5次和第6次时间间隔:17468253ms 约 291min

3.(1)通过点赞的时间间隔,可以排除因为并发问题 ,而导致点赞重复这种可能


排除并发问题之后:
4.(1)为什么会有重复点赞?
a. 从redis里面校验的时候,redis返回的是false,所以点完赞后,还可以继续点赞(主要原因)
b. picture_praise表中 sns_id picture_id三个字段应该设置成唯一key(这个非主要原因)

(2)为什么点赞之后,再次从redis校验的时候,redis会返回false(即用户没有点过赞)
没有存入到redis
数据存入到redis之后,丢失了,或者失效了。但是赞的时间是今天上午,这种情况基本可以排除

(3)为什么没有存入到redis ?
a. redis满了,没有存入,这种可能性有,但是很小

b. 在加入redis之前有一个判断
SimpleDateFormat YYYYMMDD_FORMAT = new SimpleDateFormat("yyyyMMdd");
final String yearAndMonthAndDay = YYYYMMDD_FORMAT.format(pictureCreateTime);
if (Long.parseLong(yearAndMonthAndDay) >= newStartDay){
才存入redis


查了一下图片的create_time是1395458758000,这个数和上面的比较, 返回的是false。
初步判断,问题就在这里了

(4)create_time 和 newStartDay比较为什么会返回false
create_time 是1395458758000L 转换之后是2014/3/22 11:25:58 小于redis的最小时间20140723,所以返回false,点完赞之后,就不能存入redis

(5)为什么时间大于20140723,才能存入redis????

因为在0723之前,是否赞过是存在mongo里面,所以会加0723判断

但是,判断是否赞过的时候,就算图片创建日期在2014-07-23之前,也没有从mongo里面查是否赞过

5.解决方案
存redis的时候,
(1)如果图片创建日期在2016-06-09之后,逻辑不变
(2)创建日期在 2014-07-23之前逻辑不动
(3)其余情况,按创建日期在2016-06-09之后的逻辑走,即分5段
判断是否赞过,也需要添加

原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5644652.html