在 Lua Redis 中使用下划线排序

标签 sorting lua redis locale

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

相关文章:

python - 排序的字典返回没有意义/python

java - 使用多个条件对 ArrayList 进行排序

date - 在 Lua 中获得忏悔星期二

java - Redisson-netty 线程没有关闭

mongodb - mongoose - 按数组长度排序

c - 无论如何我可以比较使用指针制作的结构的结构?

c - 轻型用户数据作为表键

java - 从 Luaj 运行 Java 方法, "index expected, got string"

Redis节点不会进入MASTER模式

caching - Redis 缓存新闻文章