对于跨进程的数据通信,我打算使用Redis列表。生产者推送到列表,而一组使用者使用BRPOP消费列表内容。
为了限制列表的大小无限增长,我想将列表大小限制为固定值(例如1万个项目)。我很惊讶地没有找到像BLPUSH或BRPUSH这样的等效命令。这是Redis员工故意遗漏的吗?
因此,我假设我必须在推送之前使用Watch / multi创建一个Txn来检查列表大小。这是正确的方法还是可用的更好的技术?
我将为此功能使用lua脚本。
接受一个键(列表名称),两个参数new_element_name和的LUA max_size。返回值可以是返回值,也可以是列表已满时的LPUSH值-1。 这是执行此操作的脚本:
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>