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 数据库实现的消息传递机制,它允许生产者将消息放入队列,然后由消费者从队列中取出并处理。在分布式系统中,消息队列常用于解耦组件、实现异步处理以及提高系统的吞吐量。本文将...
【微服务SpringBoot整合Redis基于Redis的Stream消息队列实现异步秒杀下单】这篇文章主要讲解了如何在微服务架构中使用SpringBoot整合Redis来构建一个基于Redis Stream的消息队列,以此来实现实时、高效的异步秒杀...
集群聊天服务器(nginx tcp负载均衡模块、muduo网络库、基于发布-订阅的redis消息队列、mysql数据库) 集群聊天服务器(nginx tcp负载均衡模块、muduo网络库、基于发布-订阅的redis消息队列、mysql数据库) 集群聊天...
**Node.js-Kue:Redis支持的优先级队列详解** 在Node.js的开发环境中,处理异步任务和工作流程管理是常见的需求。Kue(发音为"queue")是Automattic公司为解决这一问题而设计的一个强大的工具,它是一个基于Node.js...
标题中的“Redis延时消息队列基于swoole实现的多进程消费端”是指使用Redis作为消息队列,结合Swoole的多进程特性来构建一个高效、可扩展的延迟消息处理系统。在这个系统中,Redis作为一个可靠的键值存储,用于暂存...
Fastrq是一个针对Redis构建的高效队列系统,它提供了多种类型的队列,包括普通队列、双向队列、优先级队列以及堆栈,为开发者提供了更丰富的选择和更灵活的解决方案。 首先,我们来看普通的队列。队列遵循“先进先...
khronos golang 优先级队列,兼容 redis resp 协议 package main import ( "fmt" "github.com/eatmoreapple/khronos" ) func main() { khronos.ListenAndServe(":7464") }
SpringBoot中利用Redis实现消息队列,代码亲测可用, 可以传输字符串,或java对象都可以
整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个Bucket,并将delay...
本项目是基于Go语言和Redis实现的延迟队列,借鉴了有赞(Zan)的设计思路,旨在提供一种高效、可靠的延迟服务。 首先,我们要理解Go语言的特点。Go,也称为Golang,是由Google开发的一种静态类型的编译型编程语言,...
Redis延时队列是一种在Redis数据库中实现的特殊队列,它允许我们存储消息并在未来某个特定时间点处理这些消息。这种功能对于处理定时任务、延迟通知、订单超时等场景非常有用。在这个"redis延时队列.zip"压缩包中,...
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作为一个高性能的键值数据库,不仅在数据存储领域有广泛的应用,同时也被广泛地用于实现消息队列(Message Queue,MQ)。消息队列是分布式系统中的一种中间件,它允许不同组件之间异步通信,提高了系统的响应...
本文将深入探讨如何使用Go语言实现基于Redis的消息队列,并着重讲解其特性,包括并发队列处理、Topic与Group的注册、异常监听与重启恢复。 首先,Go语言因其轻量级线程(Goroutine)和通道(Channel)机制,非常...
**标题解析:** "mvc - redis队列dome" 暗示了这是一个关于使用Model-View-Controller(MVC)架构模式与Redis构建队列的示例项目。MVC是一种广泛应用于Web开发的设计模式,它将应用程序分为三个主要部分:模型、视图...
在Laravel7中,Redis队列的使用是一个高效且灵活的方法来处理异步任务和后台工作。Redis是一个开源的、高性能的键值存储系统,它支持多种数据结构,如字符串、哈希、列表、集合和有序集合,这使得它成为处理队列的...
通过与Redis集成,我们可以利用Redis的高效内存存储特性来实现消息队列。Redis不仅是一个键值存储系统,还支持多种数据结构如列表、集合、有序集合等,这使得它成为构建队列的理想选择。 在描述中提到了Yii框架,...