繁体   English   中英

在Lua Redis中使用下划线排序

[英]Sorting with underscore in Lua Redis

我有两个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。 运行语言环境在两个服务器上返回相同的值:

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.csrc/ltablib.c )在Lua中实现的,对于字符串,比较归结为strcoll调用,很难说下划线可能出错。 我会尝试添加一个自定义排序函数来查看这是否会改变结果( table.sort(a, function(a,b) return a<b end) )如果它仍然产生不正确的结果,那么你可以打印a, b, a<b值可以看出它出错的地方。

感谢所有的意见和建议,我仍然不知道究竟发生了什么,但重建服务器工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM