在redis中使用哈希作为键的可能性

时间:2015-06-16 16:11:16

标签: ruby redis

在Python中:

import redis
db = redis.StrictRedis()
db.set({'test1': 'a', 'test2' : 'b'},1)
print db.get({'test2': 'b', 'test1' : 'a'})
result : 1

我怎样才能在Ruby中做到这一点? (我不想使用JSON,因为在JSON中,哈希中元素的顺序必须很强。)

1 个答案:

答案 0 :(得分:0)

这可能是可能的,但不是像Python中那样直截了当。那是因为密钥将在String中转换,但不会有任何特定的规范化。因此,如果您交换键的位置,字符串表示将会改变。

2.1.5 :001 > r = Redis.current
 => #<Redis client v3.2.1 for redis://127.0.0.1:6379/0>
2.1.5 :002 > r.set({test1: 'a', test2: 'b'}, 1)
 => "OK"
2.1.5 :003 > r.keys
 => ["{:test1=>\"a\", :test2=>\"b\"}"]
2.1.5 :004 > r.get({test2: 'b', test1: 'a'})
 => nil

此外,在Ruby中,哈希可以用键映射为String或Symbol,它返回不同的to_s表示。

如果要将哈希用作符号,则需要执行的操作是首先对其应用规范化函数。例如:

def to_key(hash)
  hash.to_a.sort.map { |pair| "%s:%s" % pair }.join("/")
end

那将转换

{test2: 'b', test1: 'a'}
{test1: 'a', test2: 'b'}
{"test1" => 'a', "test2" => 'b'}
...

"test1:a/test2:b"

可以有效地用作关键。