redis优先级队列探究
redis优先级队列参考下面的连接 由于zadd可以设置score, 越大表示排序越靠前,如果相同按照默认的排序来排列,因此可以通过设置score来设置队列的优先级顺序。
//==========================start=================================
package com.test;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import java.util.Iterator;
import java.util.Set;
/**
* User: weichun.zhan
* Date: 12-7-30
* Time: 下午12:17
*/
public class TestRedisQueue {
@Test
public void testQeuePriority1(){
JedisManager manager = JedisManager.getInstance();
Jedis jedis = manager.getResource();
//方式一:把队列值放入队列头
long r = jedis.lpush("derekzhan","1");
System.out.println(" result1:" + r);
jedis.lpush("derekzhan","2");
jedis.lpush("derekzhan","3");
long r4 = jedis.rpush("derekzhan", "4");
System.out.println(" result2:" + r4);
long l = jedis.lpush("derekzhan","5");
System.out.println(" result3:" + l);
String value = null;
while( null != (value = jedis.rpop("derekzhan"))){
System.out.println(value);
}
manager.returnResource(jedis);
}
@Test
public void testQeuePriority2(){
JedisManager manager = JedisManager.getInstance();
Jedis jedis = manager.getResource();
long start = System.currentTimeMillis();
//方式二:移动队列中指定的值到对列头
System.out.println("--------------------------");
for(int i = 0 ;i < 10000;i++){
jedis.lpush("derekzhan", "" + i);
}
String val = null;
String find = "3000";
while(true)
{
val = jedis.rpoplpush("derekzhan", "derekzhan");
//System.out.println("val = " + val);
if(find.equals(val)){
val = jedis.lpop("derekzhan");
jedis.rpush("derekzhan",val);
break;
}
}
String value = null;
while( null != (value = jedis.rpop("derekzhan"))){
//System.out.println(value);
}
System.out.println("took time:" + (System.currentTimeMillis() - start));
manager.returnResource(jedis);
}
@Test
public void testQeuePriority3(){
JedisManager manager = JedisManager.getInstance();
Jedis jedis = manager.getResource();
long start = System.currentTimeMillis();
//方式二:移动队列中指定的值到对列头
for(int i = 0 ;i < 10000;i++){
jedis.lpush("derekzhan", "" + i);
}
String val = null;
int i = 0;
String find = "3000";
while(true)
{
val = jedis.lindex("derekzhan", i);
//System.out.println("val = " + val);
i++;
if(find.equals(val)){
jedis.lrem("derekzhan",0,find);
jedis.rpush("derekzhan",val);
break;
}
}
String value = null;
while( null != (value = jedis.rpop("derekzhan"))){
//System.out.println(value);
}
System.out.println("took time:" + (System.currentTimeMillis() - start));
manager.returnResource(jedis);
}
/**
* redis优先级队列
*/
@Test
public void TestQueuePriority(){
JedisManager manager = JedisManager.getInstance();
Jedis jedis = manager.getResource();
long start = System.currentTimeMillis();
//重新调整队列的score值让此值处于队列的头 此种方式比上面的2种方式都要好,效率最高,
//但可能要维护多个score值,还有个问题是如果score一样,则按照默认的倒叙排列,值越大在队列头
String _name = "derekzhan";
jedis.zadd(_name,1,"2");
jedis.zadd(_name,1,"4");
jedis.zadd(_name,1,"3");
jedis.zadd(_name,3,"40");
jedis.zadd(_name,3,"10");
for(int i = 0 ;i < 5000;i++){
jedis.zadd(_name,1,""+i);
}
for(int i = 5000 ;i < 10000;i++){
jedis.zadd(_name,2,""+i);
}
String find = "3000";
jedis.zadd(_name,3,find);
//System.out.println(jedis.zrevrange(_name,0,-1));
while (true){
boolean hasValue = false;
Set val = jedis.zrevrange(_name,0,0);//从队列中获取一个数据.
for (Iterator iterator = val.iterator(); iterator.hasNext();) {
Object next = iterator.next();
System.out.println(next);
//proccess operation........
jedis.zrem(_name,next.toString());
if(!next.equals(find)){
hasValue = true;
}else {
hasValue = false;
System.out.println(next);
}
}
if(!hasValue){
break;
}
}
System.out.println("took time:" + (System.currentTimeMillis() - start));
manager.returnResource(jedis);
}
}
//==========================end=================================
来源:http://www.cnblogs.com/liuhao/archive/2012/06/26/2563702.html
页:
[1]