如何使用redis 做佇列操作 ?redis操作實例程式碼總結

伊谢尔伦
發布: 2023-03-14 08:26:02
原創
1364 人瀏覽過

如何使用Redis 做佇列操作

Reids是一個比較進階的開源key-value儲存系統,採用ANSI C實作。其與memcached類似,但是支援持久化資料存儲,同時value支援多種類型:字串 (同memcached中的value),列表,集合(Set),有序集合(OrderSet)和Hash 。所有的值類型均支援原子操作,如列表中追加彈出元素,集合中插入移除元素等。 Rdids的資料大多位於記憶體中,其讀寫效率非常高,其提供AOF(追加 式作業記錄檔)和DUMP(定期資料備份)兩種持久化方式。 Redis支援自訂的VM(虛擬記憶體)機制,當資料容量超過記憶體時,可以將部分Value 儲存到檔案中。同時Redis支援Master-Slave機制,可以進行資料複製。
可以把Redis的list結構當隊列來用.
從上面Redis的場景和作用來說,對於我們現在的開發活動,究竟能把Redis引入在那些場景,而不是把這麼好的東東演變成「為了使用Redis,而Redis」的慘烈局面呢?當然,具體問題具體分析,這真的很重要哈。
快取?分散式快取? 隊列?分散式佇列?
某些系統應用(例如,電信、銀行和大型網路應用程式等)都會使用到,當然,現在大行其道的memcache就是很好的證明;但從某一方面來說,memcache是​​否能把兩張囊括其中,而且能做到更好(沒有實際的應用過,所以只是拋出)。但從Redis身上,我就能感覺到,Redis,就能把隊列和緩存兩張都囊括其中,而且都不會產生並發環境下的困擾,因為Redis中的操作都是原子操作來著。
至於評論兩者的孰好孰壞就免了,存在就是理由,選擇適合的就是最好的。
下面開始玩Redis中的隊列(分佈式)設計YY吧,請大蝦們多多指點。
狀況場景:
現在的項目,都是部署在多個伺服器,或多個IP上,而且前台經由F5分發,所以使用者的請求究竟落在那一台的伺服器上,是無法確定的。對於專案中,有一秒殺設計,剛開始沒有考慮到這種部署,同時也是使用最容易處理的方式,直接給資料庫表鎖行記錄(Oracle上的)。可以說,對於不同的應用程式部署,而只有一台資料庫伺服器來說,很「輕鬆」的就解決了這個並發的問題。所以現在考慮一下,是不是移到應用程式上,避免資料庫伺服器也摻雜到業務上。
例如,現在有2台應用伺服器,1台資料庫伺服器。想法是,把Redis部署在資料庫伺服器上,兩台伺服器在操作並發快取或佇列時,先從Redis伺服器上,取得在兩台應用伺服器的代理程式物件,再做入列出列的操作。
看程式碼實作(PHP)
入佇列操作檔list_push.php

#程式碼如下:

<?php 
$redis = getRedisInstance();//从Redis服务器拿到redis实例 
$redis->connect(&#39;Redis服务器IP&#39;, 6379); 
while (true) { 
$redis->lPush(&#39;list1&#39;, &#39;A_&#39;.date(&#39;Y-m-d H:i:s&#39;)); 
sleep(rand()%3); 
} 
?>
登入後複製

執行# php list_push.php &
出佇列操作list_pop.php檔

程式碼如下:

<?php 
$redis = getRedisInstance();//从Redis服务器拿到redis实例 
$redis->pconnect(&#39;Redis服务器IP&#39;, 6379); 
while(true) { 
try { 
var_export( $redis->blPop(&#39;list1&#39;, 10) ); 
} catch(Exception $e) { 
//echo $e; 
} 
}
登入後複製

實作方法(Python)
1.入佇列(write.py)

#程式碼如下:

#!/usr/bin/env python 
import time 
from redis import Redis 
redis = Redis(host=&#39;127.0.0.1&#39;, port=6379) 
while True: 
now = time.
strftime("%Y/%m/%d %H:%M:%S") 
redis.lpush(&#39;test_queue&#39;, now) 
time.sleep(1)
登入後複製

2.出佇列(read.py)

程式碼如下:

#!/usr/bin/env python 
import sys 
from redis import Redis 
redis = Redis(host=&#39;127.0.0.1&#39;, port=6379) 
while True: 
res = redis.rpop(&#39;test_queue&#39;) 
if res == None: 
pass 
else: 
print str(res)
登入後複製


範例程式碼:

#1. 入隊動作

<?php
$redis = new Redis();
$redis->connect(&#39;127.0.0.1&#39;,6379);
while(True){
  try{
    $value = &#39;value_&#39;.date(&#39;Y-m-d H:i:s&#39;);
    $redis->LPUSH(&#39;key1&#39;,$value);
    sleep(rand()%3);
    echo $value."\n";
  }catch(Exception $e){
    echo $e->getMessage()."\n";
  }
}
?>
登入後複製

2. 出隊動作

<?php
$redis = new Redis();
$redis->pconnect(&#39;127.0.0.1&#39;,6379);
while(True){
  try{
    echo $redis->LPOP(&#39;key1&#39;)."\n";
  }catch(Exception $e){
  echo $e->getMessage()."\n";
  }
  sleep(rand()%3);
}
?>
登入後複製

以上是如何使用redis 做佇列操作 ?redis操作實例程式碼總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!