对于跨进程的数据通信,我打算使用Redis列表。生产者推送到列表,而一组消费者使用BRPOP消费列表内容。
为了限制列表大小无限增长,我想将列表大小限制为固定值(比如10K项)。我很惊讶地发现没有像BLPUSH或BRPUSH这样的命令。这是Redis人员故意省略的吗?
所以,我假设我必须创建一个带有Watch / multi的Txn,以便在推送之前检查列表大小。这是正确的方法,还是更好的技术?
答案 0 :(得分:2)
我会为这个功能寻找一个lua脚本。
接受一个密钥(列表名称)的LUA,以及两个参数new_element_name
和max_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>