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
分享到:
相关推荐
Python 中使用 Redis 实现队列、堆栈、双端队列和优先级队列二维码QR可帮助您创建和使用Redis的队列、上限集合(有界队列)、双端队列和堆栈数据结构。Redis 非常适合实现这些抽象数据结构,而 QR 使使用 Python 中...
用于与创建的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数据类型、队列实现、阻塞读操作以及与分布式系统相关的其他高级话题。下面对这些知识点进行详细说明。 首先,...
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") }
3 种排队策略FIFO 队列、LIFO 队列和优先级队列。消息处理程序工作线程允许沙盒化并从单独的隔离线程运行消息处理程序,并且不会影响来自同一消费者的其他消息处理程序的性能。可以将消息设置为在给定的时间内未送达...
SpringBoot中利用Redis实现消息队列,代码亲测可用, 可以传输字符串,或java对象都可以
整个延迟队列由4个部分组成: 1. JobPool用来存放所有Job的元信息。 2. DelayBucket是一组以时间为维度的有序队列,用来存放所有需要延迟的Job(这里只存放Job Id)。 3. Timer负责实时扫描各个Bucket,并将delay...
redis消息队列中间件Redis消息堆中间件安装平台.net core版本2.1redis版本3.0以上特点1.通过注解的方式,订阅队列2.可以设置消费消息的频次3.支持消息广播4.1.0.0.7版本新增延迟队列支持5.1.0.0.14版本新增循环队列...
本项目是基于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)机制,非常...