1. 程式人生 > >利用Redis 實現訊息佇列

利用Redis 實現訊息佇列

1.用redis中的List可以實現佇列,這樣可以用來做訊息處理和任務排程的佇列


2.程式碼模擬

程式碼結構
生產者模擬程式
  1. /** 
  2.  *  
  3.  */
  4. package scheduleTest;  
  5. import java.util.Random;  
  6. import java.util.UUID;  
  7. import redis.clients.jedis.Jedis;  
  8. /** 
  9.  * 模擬一個生產者 
  10.  * <p>Title: TaskProducer</p> 
  11.  * <p>Description: </p> 
  12.  * <p>Company: </p>
     
  13.  * @author 夏 傑 
  14.  * @date 2015年12月11日 下午4:26:48 
  15.  * @vesion 1.0 
  16. */
  17. publicclass TaskProducer implements Runnable{  
  18.     Jedis jedis = new Jedis("120.55.195.177",6379);  
  19.     publicvoid run() {  
  20.         Random random = new Random();  
  21.         while(true){  
  22.             try{  
  23.                 Thread.sleep(random.nextInt(600
    ) + 600);  
  24.                 // 模擬生成一個任務
  25.                 UUID taskid = UUID.randomUUID();  
  26.                 //將任務插入任務佇列:task-queue
  27.                 jedis.lpush("task-queue", taskid.toString());  
  28.                 System.out.println("插入了一個新的任務: " + taskid);  
  29.             }catch(Exception e){  
  30.                 e.printStackTrace();  
  31.             }  
  32.         }  
  33.     }  
  34. }  


消費者模擬程式
  1. /** 
  2.  *  
  3.  */
  4. package scheduleTest;  
  5. import java.util.Random;  
  6. import redis.clients.jedis.Jedis;  
  7. /** 
  8.  * 模擬消費者 
  9.  * <p>Title: TaskConsumer</p> 
  10.  * <p>Description: </p> 
  11.  * <p>Company: </p> 
  12.  * @author 夏 傑 
  13.  * @date 2015年12月11日 下午4:44:23 
  14.  * @vesion 1.0 
  15. */
  16. publicclass TaskConsumer implements Runnable {  
  17.     Jedis jedis = new Jedis("120.55.195.177",6379);  
  18.     publicvoid run() {  
  19.         Random random = new Random();  
  20.         while(true){  
  21.             //從任務佇列"task-queue"中獲取一個任務,並將該任務放入暫存佇列"tmp-queue"
  22.             String taskid = jedis.rpoplpush("task-queue""tmp-queue");  
  23.             // 處理任務----純屬業務邏輯,模擬一下:睡覺
  24.             try {  
  25.                 Thread.sleep(1000);  
  26.             } catch (InterruptedException e) {  
  27.                 e.printStackTrace();  
  28.             }  
  29.             //模擬成功和失敗的偶然現象
  30.             if(random.nextInt(13) % 7 == 0){// 模擬失敗的情況,概率為2/13
  31.                 //將本次處理失敗的任務從暫存佇列"tmp-queue"中,彈回任務佇列"task-queue"
  32.                 jedis.rpoplpush("tmp-queue""task-queue");  
  33.                 System.out.println(taskid + "處理失敗,被彈回任務佇列");  
  34.             } else {// 模擬成功的情況
  35.                 // 將本次任務從暫存佇列"tmp-queue"中清除
  36.                 jedis.rpop("tmp-queue");  
  37.                 System.out.println(taskid+"處理成功,被清除");  
  38.             }     
  39.         }  
  40.     }  
  41. }  


排程主程式
  1. /** 
  2.  *  
  3.  */
  4. package scheduleTest;  
  5. /** 
  6.  * <p>Title: TaskShedulerSystem</p> 
  7.  * <p>Description: </p> 
  8.  * <p>Company: </p> 
  9.  * @author 夏 傑 
  10.  * @date 2015年12月11日 下午4:19:09 
  11.  * @vesion 1.0 
  12. */
  13. publicclass TaskShedulerSystem {  
  14.     publicstaticvoid main(String[] args) throws Exception {  
  15.         // 啟動一個生產者執行緒,模擬任務的產生
  16.         new Thread(new TaskProducer()).start();  
  17.         Thread.sleep(15000);  
  18.         //啟動一個執行緒者執行緒,模擬任務的處理
  19.         new Thread(new TaskConsumer()).start();  
  20.         //主執行緒休眠
  21.         Thread.sleep(Long.MAX_VALUE);  
  22.     }  
  23. }  

執行結果

相關推薦

PHP中利用redis實現訊息佇列處理高併發請求

將請求存入redis 為了模擬多個使用者的請求,使用一個for迴圈替代 //redis資料入隊操作 $redis = new Redis(); $redis->connect('127.0.0.1',6379); for($i=0;$i<50;$i++){

PHP中利用redis實現訊息佇列處理高併發請求--簡潔程式碼實現效果

將請求存入redis 為了模擬多個使用者的請求,使用一個for迴圈替代 //redis資料入隊操作 $redis = new Redis(); $redis->connect('127.0.

利用Redis 實現訊息佇列

1.用redis中的List可以實現佇列,這樣可以用來做訊息處理和任務排程的佇列 2.程式碼模擬 程式碼結構 生產者模擬程式 /**   *    */ package scheduleTest;   import java.util.Ra

Qt應用Redis實現訊息佇列

    類似BS模式,客戶端傳送任務請求給服務端,服務端將處理結果返回給客戶端。 redis負責訊息的儲存和轉發。 模擬病人掛號看病,Patient程序進行掛號,Doctor程序進行看病 ,程式程式碼如下: /////////////

springboot整合redis實現訊息佇列

在java中直接使用redis的時候,直接使用簡單的兩個指令lpush和rpop或者rpush和lpop就可以實現訊息佇列的操作。當與spring結合時,可以使用RedisTemplate和StringRedisTemplate;這兩個Template是spring封裝了對Redis的一些常用的

第八篇:Spring Boot使用Redis實現訊息佇列

目前常用的訊息佇列大概有三種類型,RabbitMQ等AMQP系列, Kafka, Redis等key-value系列,它們的使用場景分別是: 1.RabbitMQ:相對重量級高併發的情況,比如資料的非同步處理,任務的序列執行等. 2.Kafka:基於Pull的模式來處理,具體

第 21 講 在Springboot使用Redis實現訊息佇列

第二十一講 在Springboot使用Redis實現訊息佇列 1.引入依賴:pom.xml <dependency> <groupId>org.springframew

SpringBoot中使用redis實現訊息佇列

在pom中加入redis依賴: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r

Redis實現訊息佇列

個人理解在專案中使用訊息佇列一般是有如下幾個原因:    把瞬間伺服器的請求處理換成非同步處理,緩解伺服器的壓力    實現資料順序排列獲取 ​redis實現訊息佇列步驟如下:1).redis函式rpush,lpop2).建議定時任務入佇列3)建立定時任務出佇列 檔案:dem

SpringBoot利用redis整合訊息佇列

import java.util.concurrent.CountDownLatch; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactor

springboot使用redis實現訊息佇列

一、概念訊息佇列分為兩種模式,一種是釋出訂閱模式,一種是生產者消費者模式。生產者消費者模式:生產者生產訊息放到佇列裡,多個消費者同時監聽佇列,誰先搶到訊息誰就會從佇列中取走訊息;即對於每個訊息只能被最多一個消費者擁有。釋出者訂閱者模式:釋出者生產訊息放到佇列裡,多個監聽佇列的

Spring+Redis實現訊息佇列

一、概述 針對Redis,我們知道有String、List、Hash、Set、sorted Set等資料結構,而List資料結構就是一個簡單的字串列表,我們可以向列表的首部或者尾部新增或者移除元素。並且當列表中沒有元素的時候會發生阻塞或者等待超時。因此我們就可以使用Redi

利用Redis實現非同步訊息佇列優化系統性能 (Redis高階應用)

寫在前面 今天把之前在專案中使用 Redis 做非同步訊息佇列的使用經驗總結一下。首先明確使用目的,因為專案中,我們進行某個操作後可能後續會有一系列的其他耗時操作,但是我們不希望將主執行緒阻塞在此過程中,這時便可將其他操作非同步化。舉個栗子,當你給這篇部落格點贊或評論的時候

基於redis訊息佇列的設計及實現

訊息佇列 所謂訊息佇列,就是一個以佇列資料結構為基礎的一個真實存在的實體,如陣列,redis中的佇列集合等等,都可以。 為什麼要使用佇列 主要原因是由於在高併發環境下,由於來不及同步處理,請求往往會發生堵塞,比如說,大量的insert,update之類的請求同時到達MySQL,直接導致無

Redis + DB +訊息佇列 實現高效的文章點贊,點踩功能

需求說明 使用者可點贊或踩,每贊一次,“贊”數量+1,每踩一次,“踩”數量+1,“點贊”和“點踩” 當天內二選一當天內有效 場景:使用者A 點贊 文章a,文章a 點贊量+1 ,同一使用者,同一文章 當天再次點選無效,贊與踩二選一,隔天再次點選有效 表設計 文章的

Redisredis非同步訊息佇列+Spring自定義註解+AOP方式實現系統日誌持久化

說明:   SSM專案中的每一個請求都需要進行日誌記錄操作。一般操作做的思路是:使用springAOP思想,對指定的方法進行攔截。拼裝日誌資訊實體,然後持久化到資料庫中。可是仔細想一下會發現:每次的客戶端的每一次請求,伺服器都會處理兩件事情。一個是正常的業務操作;另一個就是我們額外要做的日誌資料記錄。這樣的

12.springboot使用redis的訂閱功能實現訊息佇列

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org

Java Jedis操作Redis示例(一)——pub/sub模式實現訊息佇列

轉載:http://blog.csdn.net/shaobingj126/article/details/50585035 轉載:http://blog.csdn.net/abcd898989/article/details/51697596 一 訊息佇列 1. 定義 訊息

使用Redis+php-resque實現訊息佇列

一、Redis安裝 1. 獲取原始碼 shell># cd /usr/local/src shell># wget http://download.redis.io/releases/redis-2.6.16.tar.gz shell># tar -z

SpringBoot2.0高階案例(07) 整合:Redis叢集 ,實現訊息佇列場景

本文原始碼 GitHub地址:知了一笑 https://github.com/cicadasmile/middle-ware-pa