redis 命令
blpop key1...keyN timeout
BLPOP 是阻塞式列表的弹出原语。 它是命令 LPOP 的阻塞版本,这是因为当给定列表内没有任何元素可供弹出的时候, 连接将被 BLPOP 命令阻塞。直到有另一个客户端对给定的这些 key 的任意一个执行 LPUSH 或 RPUSH 命令为止。 当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素.
返回值:返回 key 和弹出的元素值
超时时返回 nil
有时候,为了等待一个新元素到达数据中,需要使用轮询的方式对数据进行探查。
另一种更好的方式是,使用系统提供的阻塞原语,在新元素到达时立即进行处理,而新元素还没到达时,就一直阻塞住,避免轮询占用资源。BLPOP和BRPOP能很好解决这个问题。
和Java提供的阻塞队列如LinkedBlockingQueue相比,redis提供读取阻塞,不提供写入阻塞。
在spring中使用redis,实现线程阻塞
//list集合 第一个元素为key值,第二个元素为弹出的元素值;当超时返回[null]
List<Object> obj = redisTemplate.executePipelined(new RedisCallback<Object>() {
@Nullable
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {
//队列没有元素会阻塞操作,直到队列获取新的元素或超时
return connection.bLPop(timeout,key.getBytes());
}
},new StringRedisSerializer());
我们通过向队列添加元素来释放阻塞的线程
redisTemplate.opsForList().rightPush(key,value);