Redis - 有一个blpush

时间:2014-11-21 17:39:39

标签: redis

对于跨进程的数据通信,我打算使用Redis列表。生产者推送到列表,而一组消费者使用BRPOP消费列表内容。

为了限制列表大小无限增长,我想将列表大小限制为固定值(比如10K项)。我很惊讶地发现没有像BLPUSH或BRPUSH这样的命令。这是Redis人员故意省略的吗?

所以,我假设我必须创建一个带有Watch / multi的Txn,以便在推送之前检查列表大小。这是正确的方法,还是更好的技术?

1 个答案:

答案 0 :(得分:2)

我会为这个功能寻找一个lua脚本。

接受一个密钥(列表名称)的LUA,以及两个参数new_element_namemax_size。 当列表已满时,返回值可以是LPUSH返回值或-1 这是一个执行此操作的脚本:

if tonumber(ARGV[2]) > redis.call('LLEN', KEYS[1]) then
    return redis.call('LPUSH', KEYS[1], ARGV[1])  end 
return -1

您应该使用SCRIPT LOAD加载一次:

cat blpush.lua | redis-cli -x script load

与EVALSHA一起使用

evalsha 96d1fb35d6173758facda9dbc108296fd4a1512d 1 <myList> <new_element_name> <max_size>