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
分享到:
相关推荐
用于与创建的Redis优先级队列进行交互的命令行工具。 安装 npm install --g dq-cli 用法 dq导入 Usage: dq-import [options] Options: -h, --help output usage information -V, --version output the version ...
redis 案例。包含, 队列操作, socket通信, 以及 socket 和 redis 配合 redis 案例。包含, 队列操作, socket通信, 以及 socket 和 redis 配合
redis 消息队列源码示例 redis 消息队列源码示例 redis 消息队列源码示例
集群聊天服务器(nginx tcp负载均衡模块、muduo网络库、基于发布-订阅的redis消息队列、mysql数据库) 集群聊天服务器(nginx tcp负载均衡模块、muduo网络库、基于发布-订阅的redis消息队列、mysql数据库) 集群聊天...
Kue 是一款为 node.js 而构建,由 redis 支持的优先级队列
khronos golang 优先级队列,兼容 redis resp 协议 package main import ( "fmt" "github.com/eatmoreapple/khronos" ) func main() { khronos.ListenAndServe(":7464") }
将整个Redis当做消息池,以kv形式存储消息 使用ZSET做优先队列,按照score维持优先级
整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个Bucket,并将delay...
07-Redis队列Stream、Redis多线程详解_ev.07-Redis队列Stream、Redis多线程详解_ev.07-Redis队列Stream、Redis多线程详解_ev.07-Redis队列Stream、Redis多线程详解_ev.07-Redis队列Stream、Redis多线程详解_ev.07-...
redis延时队列
Fastrq - 基于redis的队列、双向队列、优先队列和堆栈,以及众多增强版本
延迟队列, 参考有赞延迟队列设计实现
Redis优先级队列 redis-priority-queue是一个简单的工作队列,类似于具有以下新增功能: 可以添加具有优先级的项目(介于-9007199254740992和9007199254740992之间) 队列会自动进行重复数据删除(重复的项目在推送...
由redis支持的优先级作业队列,是为eggjs构建的。 安装 $ npm i egg-kue --save 用法 // {app_root}/config/plugin.js exports . kue = { enable : true , package : 'egg-kue' , } ; 配置 // {app_root}/config/...
二维码QR可以帮助您创建和使用Redis的队列,上限收集(有界队列),双端队列和堆栈数据结构。 Redis非常适合这些抽象数据结构的实现,QR使使用Python中的结构更加容易。快速设置你会需要: -2.0或更高版本默认情况下...
java redis使用之利用jedis实现redis消息队列.docx
SpringBoot中利用Redis实现消息队列,代码亲测可用, 可以传输字符串,或java对象都可以
Qt 使用 Redis实现 消息队列,点对点 生产者-消费者 模式
redis做消息队列,实现了kafka队列的调度(顺序消费,避免高并发内存溢出),大家参考,提高开发速度
Laravel7中Redis队列的使用