[英]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.c
( src/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.