这个简陋的人让我难过。我一直在修补redis-py,试图学习绳索。我尝试的一件事是:
pipeline1 = my_server.pipeline()
for hash_obj in hash_objs:
num = pipeline1.hincrby(hash_obj,"num",amount=-1)
result1 = pipeline1.execute()
print result1
>>> [0L,0L]
列表hash_objs
中有两个redis哈希值。我在屏幕上看到的内容是[0L,0L]
。有人可以帮我解读这个输出意味着什么吗?什么' L
?我希望每个int
得到num
hash_obj
的{{1}}值(例如[2,0]
)。
我的目标是在每个num
中按hash_obj
递减1
,并在num
最终为0
的地方,删除hash_obj
。
我试图在两个不同的管道中实现这一目标;上面的代码是尝试减少所有num
中的所有hash_objs
值。在此之后,如果有必要,我会删除相关的hash_objs
。我仍然在理解如何在redis中有效地使用流水线技术。
答案 0 :(得分:0)
上面的代码没有错 - L
表示长(整数),结果打印输出是一致的,假设在运行之前哈希值设置为1。如果预先将哈希值设置为3和1(下面的步骤3和4),您将在步骤9中获得预期结果:
In [1]: import redis
In [2]: r = redis.StrictRedis()
In [3]: r.hset('h1', 'num', 3)
Out[3]: 1L
In [4]: r.hset('h2', 'num', 1)
Out[4]: 1L
In [5]: hashes = ['h1', 'h2']
In [6]: p = r.pipeline()
In [7]: for h in hashes:
...: p.hincrby(h, 'num', -1)
...:
In [8]: res = p.execute()
In [9]: res
Out[9]: [2L, 0L]
注意:3和4中的1L
表示密钥已创建。
现在您可以迭代结果并继续处理。但是,在您的情况下,仅使用一个管道而不是执行hincrby
调用更有意义,如果结果为0,Lua脚本会递减并删除键,例如下面的那个(返回1)如果密钥被删除了):
In [1]: import redis
In [2]: r = redis.StrictRedis()
In [3]: r.hset('h1', 'num', 3)
Out[3]: 0L
In [4]: r.hset('h2', 'num', 1)
Out[4]: 0L
In [5]: s = r.script_load('if redis.call("HINCRBY", KEYS[1], ARGV[1], ARGV[2]) <= 0 then redis.call("DEL", KEYS[1]) return 1 end return 0')
In [6]: p = r.pipeline()
In [7]: for h in ['h1', 'h2']:
...: p.evalsha(s, 1, h, 'num', -1)
...:
In [8]: p.execute()
Out[8]: [0L, 1L]