zoukankan      html  css  js  c++  java
  • 问题--时景重复点赞问题排查及解决方案

    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段
    判断是否赞过,也需要添加

  • 相关阅读:
    ZABBIX实现原理及架构详解
    for(;;)和while(true)的区别
    JVM
    javap的基本用法
    Java VisualVM添加Visual GC插件
    Java虚拟机监控命令
    数据类型 原始类型的方法
    数据类型 数字类型
    Object(对象):基础知识 原型对象prototype
    Object(对象):基础知识 对象方法,"this"
  • 原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5644652.html
Copyright © 2011-2022 走看看