如何在Redis中的两个列表上检查Equals

时间:2017-03-15 10:23:16

标签: redis

我在Redis中有两个列表。我如何检查这些列表是否相等?唯一的选择是从列表中逐个获取元素并与内存中的列表进行比较吗?

Redis是否提供任何变通方法?

1 个答案:

答案 0 :(得分:7)

没有解决方法,Redis没有列表的摘要功能(或其他类型的数据类型),因为这些是双重链接,除了逐个元素之外没有其他方法可以比较它们。

然而,您可以在Lua中进行比较,以使其与在客户端执行相比更有效。以下内容应该有效:

if redis.call('LLEN',KEYS[1]) == redis.call('LLEN',KEYS[2]) and
    redis.call('LRANGE',KEYS[1],0,0)[1] == redis.call('LRANGE',KEYS[2],0,0)[1] and
    redis.call('LRANGE',KEYS[1],-1,-1)[1] == redis.call('LRANGE',KEYS[2],-1,-1)[1] and
    redis.call('DUMP',KEYS[1]) == redis.call('DUMP',KEYS[2]) then
    return 'Lists are the same'
end
return 'Lists are not the same'

只有当列表的大小不同且其结尾(提取成本低廉)相同时,上述脚本才会进行完全比较。