场景
任务是 当 redis set 中有新元素时及时处理 需要在set有新元素后自动得到通知,省得使用轮询的方式来查看是否有新元素 相当于对set做一个事件提醒
实现
如果能使用阻塞版命令就非常简单了,例如list的pop操作有阻塞版的brpop
阻塞版的意思就是:当key中为空时就等着,有新元素后就马上获取
非阻塞版命令则不等,直接返回了
获取set元素的命令spop是没有阻塞版本的,但可以把他俩一起使用,使用brpop来完成这个任务 新元素的事件处理,相当于消费者 示例代码
LOOP forever WHILE SPOP(key) returns elements ... 逻辑处理 ... END BRPOP helper_key END 向set中添加新元素时就触发了事件,相当于生产者 示例代码 MULTI SADD key element LPUSH helper_key x EXEC 生产者向set中添加元素,同时向list中也添加了元素,并把这两个动作放到一个事务中,保证原子性
消费者阻塞等待list,阻塞解除后,从set中获取元素进行逻辑处理,当生产者向list中添加新元素时,阻塞就解除了,也就说明set中有了新元素
这个list只是一个帮助角色,用来实现阻塞通知功能,不是业务角色
通过对list阻塞方式的结合,巧妙的实现了阻塞版的set 使用阻塞版list操作,可以实现更丰富的阻塞原语 此示例来自redis官网,很有趣的用法