我的两个 ubuntu 服务器上的表以不同的方式排序时遇到问题。我在 redis-cli 工具中执行以下命令。这是服务器 1:
127.0.0.1:6379> eval "local a = {'_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axx:1'};table.sort(a);return a;" 0
1) "_mcat:banner"
2) "_mtype:html"
3) "_size:300x250"
4) "axx:1"
5) "for_meta:1"
和服务器 2:
127.0.0.1:6379> eval "local a = {'_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axx:1'};table.sort(a);return a;" 0
1) "axx:1"
2) "for_meta:1"
3) "_mcat:banner"
4) "_mtype:html"
5) "_size:300x250"
如您所见,问题在于排序如何处理“_”字符。我尝试升级 redis 和 gcc 的版本,并且服务器之间的行为没有改变。测试的 Redis 版本:2.8.4、2.8.19、4.0.2,gcc 版本:4.8.2。运行 locale 在两台服务器上返回相同的值:
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
在 Python 中执行相同的代码,在两台机器上的效果相同:
>>> sorted(['_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axx:1'])
['_mcat:banner', '_mtype:html', '_size:300x250', 'axx:1', 'for_meta:1']
也许有人对接下来要尝试什么提出了建议?谢谢。
已编辑:
在两台服务器上运行:
eval "local a = {'_mcat:banner','for_meta:1','_size:300x250','_mtype:html', 'axxx:2'};table.sort(a, function(a,b) return a<b end);return a;" 0
产生与 table.sort(a) 一致的结果(服务器之间如此不同),但看看这个:
在服务器 1 上:
127.0.0.1:6379> eval "local a;if 'axxx:2'>'_mcat:banner' then a=1 else a=0 end;return a;" 0
(integer) 1
127.0.0.1:6379> eval "local a;if 'a'>'_' then a=1 else a=0 end;return a;" 0
(integer) 1
在服务器 2 上:
127.0.0.1:6379> eval "local a;if 'axxx:2'>'_mcat:banner' then a=1 else a=0 end;return a;" 0
(integer) 0
127.0.0.1:6379> eval "local a;if 'a'>'_' then a=1 else a=0 end;return a;" 0
(integer) 1
最佳答案
鉴于table.sort
使用快速排序(src/ltablib.c
)在 Lua 本身中实现,对于字符串,比较归结为 strcoll
call,很难说下划线哪里会出错。我会尝试添加一个自定义排序函数,看看这是否会改变结果( table.sort(a, function(a,b) return a<b end)
),如果它仍然产生不正确的结果,那么您可以打印 a, b, a<b
值以查看哪里出了问题。
关于在 Lua Redis 中使用下划线排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47517089/