zoco

爬了人生最大的坑

2015-12-18


刚开始做公司的某个业务的时候,要存数据。
那就存成两部分,一部分zset存列表,一部分string存profile。
zset的key是userid,score是时间,member是profile的key。
很简单吧。

但是,在存string的时候有了麻烦。这次的数据比较多,所以我用了一个redis的集群,按照key%10进行分片。

当然之前都是没问题的,之前一般我们都是拿userid hash的,userid现在最多是10位。但是这次我存的key是trade no。也就是类似这种东西2016121612292709411017316

所以我就按照上面的方案存了。

之后上线了好久才发现,怎么第7个分片的数据这么多啊,比其他的分片数据多多了。

然后开始查问题。

我们的底层封装的hash有这样一行代码

$res = intval($id);

要把id转换成int。

那么问题来了,2016121612292709411017316转换成int是多少?

我们存的是字符串,也就是intval(‘2016121612292709411017316’) = 9223372036854775807 这里具体为什么自行Google

这就是坑