gpt4 book ai didi

在 Lua Redis 中使用下划线排序

转载 作者:IT王子 更新时间:2023-10-29 06:09:34 24 4
gpt4 key购买 nike

我的两个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com