PHP 在使用 Redis 中 SERIALIZER 选项时遇到的问题

因为我们在很多项目中使用了

1
setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);

使用了 SERIALIZER_PHP 参数后,将会使用 serialize 函数序列化后保存到 Redis 中,于是我在使用 Sorted Sets 的时候遇到一个问题。

比如调用 zAdd 的时候,实际存储在数据库中的数据会根据类型序列化

1
2
3
zAdd('myzset', 1, 100);
zAdd('myzset', 2, 101);
zAdd('myzset', 3, "100");

会造成 100 和 “100” 实际上是两个 member,效果如

1
2
3
4
5
6
1) "i:100;"
2) "1"
3) "i:101;"
4) "2"
5) "s:3:\"100\";"
6) "3"

但是在在使用 zRange 读取数据的时候,由于反序列后的 member 是被当成同一个 key 的,所以只会读取其中一个 member,按照排序先后,后面一个的 score 会覆盖前面的 score,如

1
2
[100] => 3
[101] => 2

所以就会造成排序混乱问题