我正在使用redis存储一组有序的项目。下面是一个示例代码:
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)
}
}
}
}当我运行制片人时,我得到了
publishing:1
publishing:2
publishing:3
publishing:4
publishing:5
publishing:6
publishing:7
publishing:8
publishing:9
publishing:10而当我运行consumer时,我会得到
processing:1
processing:2
processing:4
processing:5
processing:6
processing:7
processing:9
processing:10
processing:8
processing:3为什么项目的顺序不正确,这不是真正的FIFO。
发布于 2012-04-26 00:13:40
这不是真正的FIFO,因为代码是错误的。
如果您使用lpush对项目进行排队,则应该使用rpop而不是lpop来按FIFO顺序将它们出列。
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.
https://stackoverflow.com/questions/10316954
复制相似问题