redis队列原理是什么?代码示例

TheDisguiser 2020-07-30 16:12:38 java常见问答 6900

redis消息队列是它的核心特点之一,想要掌握redis,它的原理是必须知道的,小伙伴们知道它的原理是什么吗?本篇文章小编就带你了解下。

示例:

生产者

/** 
 *  
 */
package scheduleTest;
import java.util.Random;
import java.util.UUID;
import redis.clients.jedis.Jedis;
/** 
 * 模拟一个生产者 
 * <p>Title: TaskProducer</p> 
 * <p>Description: </p> 
 * <p>Company: </p> 
 * @vesion 1.0 
 */
public class TaskProducer implements Runnable
{
    Jedis jedis = new Jedis("120.55.195.177", 6379);
    public void run()
    {
        Random random = new Random();
        while (true)
        {
            try
            {
                Thread.sleep(random.nextInt(600) + 600);
                // 模拟生成一个任务  
                UUID taskid = UUID.randomUUID();
                //将任务插入任务队列:task-queue  
                jedis.lpush("task-queue", taskid.toString());
                System.out.println("插入了一个新的任务: " + taskid);
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    }
}

消费者

/** 
 *  
 */
package scheduleTest;
import java.util.Random;
import redis.clients.jedis.Jedis;
/** 
 * 模拟消费者 
 * <p>Title: TaskConsumer</p> 
 * <p>Description: </p> 
 * <p>Company: </p> 
 * @vesion 1.0 
 */
public class TaskConsumer implements Runnable
{
    Jedis jedis = new Jedis("120.55.195.177", 6379);
    public void run()
    {
        Random random = new Random();
        while (true)
        {
            //从任务队列"task-queue"中获取一个任务,并将该任务放入暂存队列"tmp-queue"  
            String taskid = jedis.rpoplpush("task-queue", "tmp-queue");
            // 处理任务----纯属业务逻辑,模拟一下:睡觉  
            try
            {
                Thread.sleep(1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
            //模拟成功和失败的偶然现象  
            if (random.nextInt(13) % 7 == 0)
            { // 模拟失败的情况,概率为2/13  
                //将本次处理失败的任务从暂存队列"tmp-queue"中,弹回任务队列"task-queue"  
                jedis.rpoplpush("tmp-queue", "task-queue");
                System.out.println(taskid + "处理失败,被弹回任务队列");
            }
            else
            { // 模拟成功的情况  
                // 将本次任务从暂存队列"tmp-queue"中清除  
                jedis.rpop("tmp-queue");
                System.out.println(taskid + "处理成功,被清除");
            }
        }
    }
}

主程序调度

/** 
 *  
 */
package scheduleTest;
/** 
 * <p>Title: TaskShedulerSystem</p> 
 * <p>Description: </p> 
 * <p>Company: </p> 
 * @vesion 1.0 
 */
public class TaskShedulerSystem
{
    public static void main(String[] args) throws Exception
    {
        // 启动一个生产者线程,模拟任务的产生  
        new Thread(new TaskProducer())
            .start();
        Thread.sleep(15000);
        //启动一个线程者线程,模拟任务的处理  
        new Thread(new TaskConsumer())
            .start();
        //主线程休眠  
        Thread.sleep(Long.MAX_VALUE);
    }
}

可以看到因为redis是单线程所以才能够用其中的List实现队列的

redis队列原理

以上就是本篇文章的所有内容,相较于其他中间件来说,redis在消息队列方面十分出色。如若还想了解其他java常见问题及解决方法就快来关注本网站吧。

推荐阅读:

redisserver一闪而过是怎么回事?redis启动一闪而过怎么办?

启动redis cluster失败要怎么解决?

启动redis,如何启动redis服务?