【发布时间】:2016-11-03 01:13:39
【问题描述】:
我目前在我的 Redis 表中存储了大约 50k 散列,每个散列都有 5 个键/值对。我每天运行一次批处理作业来更新哈希值,包括将一些键值设置为哈希中另一个键的值。
这是我的 python 代码,它遍历键并将 old_code 设置为 new_code,如果给定哈希值存在 new_code 值:
pipe = r.pipeline()
for availability in availabilities:
pipe.hget(availability["EventId"], "new_code")
for availability, old_code in zip(availabilities, pipe.execute()):
if old_code:
availability["old_code"] = old_code.decode("utf-8")
for availability in availabilities:
if "old_code" in availability:
pipe.hset(
availability["EventId"], "old_code", availability["old_code"])
pipe.hset(availability["EventId"], "new_code", availability["MsgCode"])
pipe.execute()
对我来说有点奇怪,我必须对键进行两次迭代才能达到相同的结果,有没有更好的方法来做到这一点?
我想弄清楚的另一件事是如何以最佳性能获得所有哈希值。这是我目前的做法:
d = []
pipe = r.pipeline()
keys = r.keys('*')
for key in keys:
pipe.hgetall(key)
for val, key in zip(pipe.execute(), keys):
e = {"event_id": key}
e.update(val)
if "old_key" not in e:
e["old_key"] = None
d.append(e)
所以基本上我会使用keys * 然后在所有键上使用HGETALL 进行迭代以获取值。这太慢了,尤其是迭代。有更快的方法吗?
【问题讨论】:
-
您能否在不使用任何编程语言的情况下对问题的第一部分进行更多解释。
-
stackoverflow.com/questions/38065714/… 在这里查看我的答案
-
对于每个哈希/行,我获取当前代码并将其存储为 new_code,同时将当前 new_code 保存为 old_code(以记录以前的状态并在每次数据拉取时比较 old_code 和 new_code)。
-
你能用伪代码编写你的第一个代码吗?理解起来很模糊,也不清楚您要达到的目标。在您的第二个代码中,您为什么使用“keys *”?你在整个数据库中只有 50k 哈希吗?你的哈希值,事件ID的所有名称是什么??
标签: python database hash redis