小编典典

Redis-是否有斑点

redis

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

为了限制列表的大小无限增长,我想将列表大小限制为固定值(例如1万个项目)。我很惊讶地没有找到像BLPUSH或BRPUSH这样的等效命令。这是Redis员工故意遗漏的吗?

因此,我假设我必须在推送之前使用Watch / multi创建一个Txn来检查列表大小。这是正确的方法还是可用的更好的技术?


阅读 259

收藏
2020-06-20

共1个答案

小编典典

我将为此功能使用lua脚本。

接受一个键(列表名称),两个参数new_element_name和的LUA
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>
2020-06-20