2014-11-21 273 views
2

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

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

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

回答

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> 
使用
相关问题