blpop实践错误记录

blpop指令的简要描述是:

从队列左边取出一个元素,并将元素从队列里移除

完整的介绍看这里

然后最近用redis做消息队列的时候用到blpop指令(nodejs+redis包),本来想队列里无数据的时候用blpop阻塞查询,一是、无数据的时候减少去redis取数据的操作;二是、有数据的时候,能尽快的消费数据。

但是在操作过程中发现,blpop在阻塞的时候,队列里有数据,但是不能立即取出消费,似乎需要等到本次阻塞超时后才能取出数据返回。

后面排查原因后,发现由于写数据的rpush指令是属于非阻塞指令,而blpop属于阻塞指令,由于两者共用一个队列操作数据,所以rpush到redis后,因为前面有一条blpop阻塞而不能写数据,要等阻塞超时后才能写数据,写完数据后,后续的blpop立即取到数据去消费。

那么解决办法就是阻塞指令走一个连接通道,非阻塞走一个连接通道即可。

/**
 * 非阻塞指令连接通道
 */
const client: RedisClient = createClient({ host: REDIS_HOST, port: REDIS_PORT, socket_keepalive: true });
/**
 * 阻塞指令连接通道
 */
const blockClient: RedisClient = client.duplicate();

实际上redis包的文档上有指出该问题(client.duplicate描述处),不过没注意,然后花费了一些时间排查了下。。。。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 包含的重点内容:JAVA基础JVM 知识开源框架知识操作系统多线程TCP 与 HTTP架构设计与分布式算法数据库知...
    消失er阅读 4,425评论 1 10
  • 1.1 资料 ,最好的入门小册子,可以先于一切文档之前看,免费。 作者Antirez的博客,Antirez维护的R...
    JefferyLcm阅读 17,166评论 1 51
  • 使用缓存是系统性能优化的第一黄金法则。 缓存的设计和使用对一个系统的性能至关重要,平时接触到项目无论多少也都会在某...
    刀刃丿阅读 1,359评论 0 6
  • 简介 Redis模块负责与Redis数据库交互,并提供Redis的相关API支持; Redis模块提供redis与...
    SuperGu阅读 1,708评论 0 4
  • NOSQL类型简介键值对:会使用到一个哈希表,表中有一个特定的键和一个指针指向特定的数据,如redis,volde...
    MicoCube阅读 4,102评论 2 27