首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Redis队列排序错误

Redis队列排序错误
EN

Stack Overflow用户
提问于 2012-04-25 21:41:37
回答 1查看 580关注 0票数 2

我正在使用redis存储一组有序的项目。下面是一个示例代码:

代码语言:javascript
复制
object Producer{
  def main(args:Array[String]){
    val jedis = new Jedis("localhost")
    for (i<-1 to 10){
      println("publishing:"+(i))
      jedis.lpush("q1",i.toString)
    }
  }
}
object Consumer {
  def main(args:Array[String]){
    val jedis = new Jedis("localhost")
    while(true){
      while(jedis.llen("q1")>0){
        val msg=jedis.lpop("q1")
        println("processing:"+msg)
      }
    }

  }
}

当我运行制片人时,我得到了

代码语言:javascript
复制
publishing:1
publishing:2
publishing:3
publishing:4
publishing:5
publishing:6
publishing:7
publishing:8
publishing:9
publishing:10

而当我运行consumer时,我会得到

代码语言:javascript
复制
processing:1
processing:2
processing:4
processing:5
processing:6
processing:7
processing:9
processing:10
processing:8
processing:3

为什么项目的顺序不正确,这不是真正的FIFO。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-26 00:13:40

这不是真正的FIFO,因为代码是错误的。

如果您使用lpush对项目进行排队,则应该使用rpop而不是lpop来按FIFO顺序将它们出列。

代码语言:javascript
复制
redis 127.0.0.1:6379> lpush x 10
(integer) 1
redis 127.0.0.1:6379> lpush x 20
(integer) 2
redis 127.0.0.1:6379> lpush x 30
(integer) 3
redis 127.0.0.1:6379> lpop x
"30"
redis 127.0.0.1:6379> lpop x
"20"
redis 127.0.0.1:6379> lpop x
"10"

通常情况下,您应该以相反的顺序(LIFO)检索项目。但是您的两个代理可能是并发运行的,所以使用lpop得到的顺序并不是确定的。

请注意,您的出队代理的实现很差,因为它占用了100%的CPU (没有等待状态),并且在队列为空时会使用llen命令使Redis饱和。考虑使用阻塞调用,比如brpop.

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10316954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档