QuXiao's Blog

Life && Tech && Thoughts

最近开发中遇到的MySQL与Redis的使用问题

Written on

最近在开发中遇到了两个坑,一个关于MySQL,一个关于Redis,特此记录下。

问题一

一天,同事和我发生了以下对话:

同事:『不好!我们的数据库被人黑了,数据被改掉了!』
我:『什么?!数据被怎么修改了?』
同事:『一个库中的所有表中的时间字段都被人改了!时间都增加了11个小时。』
我:问有没有其它的数据被修改了?
同事查了一会儿说:『其它数据都没有修改』
我们一直在揣测这位『黑客』的目的。
我:『我们最近有什么操作吗?』
同事:『没做什么啊……对了,运维昨天修正了下MySQL的时区』

修改时区会导致时间数据被修改?!查了资料,原来真的可以,终于找到了原因:原来这个库中的所有表的时间字段都是Timestamp字段,但是, 如果字段使用了Timestamp类型,字段的数值会随着时区修改而进行对应调整

资料 中是这么说的:

If you store a TIMESTAMP value, and then change the time zone and retrieve the value, the retrieved value is different from the value you stored.

原来,只是虚惊一场。

问题二

我和同事(仍然是那位同事)正在针对一项功能进行联调,过程中发现发送和接收的数据量对不上,我们当时模块的交互流程如下:

  1. 服务端给许多客户端发送探测请求
  2. 服务端做了一些其它处理
  3. 服务端开始subscribe redis中的key
  4. 客户端收到请求处理之后,将数据publish到同样的redis key中
  5. 服务端收到所有客户端的数据之后,最后将统计的结果返回

看似这个交互过程并没有什么问题,但是却有一个问题:无法保证客户端第一个publish的时候,服务端已经开始subscribe了 。并且,在redis中,订阅方无法收到subscribe之前发布方publish的消息 。因此,在步骤2和步骤3之间,如果客户端publish了数据,就会被漏掉,所以才会出现数据量对不上的情况。

后来,修改了一下数据交互的方式,使用redis list的rpush/blpop替代了publish/subscribe,这样就不会出现漏掉数据的情况了。

-- EOF --

comments powered by Disqus