今天线上的一个短视频突然无法播放也无法查看详情了,而且目前反映也只有这一个,那么是什么原因,开始展开排查。
首先分析下这个短视频观看拉取数据的流程图:
按照,流程图首先hgetall 查看详情如下:
*.aliyuncs.com:6379> hgetall video:1157
1) "view_count"
2) "1"
发现redis的详情中只有view_count一个field,进一步查看当redis没有数据的时候,是否正确读取了mysql数据,仔细check下逻辑发现,只有不存在key video:1157时才会去mysql读取,但是,此时是有key的,所以没有回溯到mysql的。那么,可以猜测到,一定是在用户看到视频后上报观看量时通过hincrby产生的,而且在这之前key已经被删除了。整个系统正常只有后台编辑时才会删除key。但是正常情况,即时已经删除了key,在播放视频的时候也会从mysql查找并同步到redis。再仔细想想,就只剩下一个场景可以解释:首先,用户拉刚取了视频(还没来得及上报),此时后台恰好编辑完毕,紧接着观看视频上报,于是就产生了上述情况。虽然,这种情况看起来不太可能经常发生,但理论上明显是可以的。
分析到了问题的原因,做解决方案就简单了,从后台更新机制;api查询校验严谨性进行解决都可以,双方面进行解决最好。