php語言redis隊列操作實例
PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多。下面是小編分享的php語言redis隊列操作實例,一起來看一下吧。
Redis是一個比較高級的開源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中的隊列(分佈式)。
狀況場景:
現在的項目,都是部署在多個服務器,或者多個IP上,而且前台經由F5分發,所以用户的請求究竟落在那一台的服務器上,是無法確定的。對於項目 中,有一秒殺設計,剛開始沒有考慮到這種部署,同時也是使用最容易處理的方式,直接給數據庫表鎖行記錄(Oracle上的)。可以説,對於不同的應用部 署,而只有一台數據庫服務器來説,很“輕鬆”的就解決了這個併發的問題。所以現在考慮一下,是不是挪到應用上,避免數據庫服務器也摻雜到業務上。
比如,現在有2台應用服務器,1台數據庫服務器。想法是,把Redis部署在數據庫服務器上,兩台服務器在操作併發緩存或者隊列時,先從Redis服務器上取得在兩台應用服務器的代理對象,再做入列出列的操作。
入隊操作代碼
<?php
$redis = new Redis();
$redis->connect('',6379);
while(True){
try{
$value = 'value_'('Y-m-d H:i:s');
$redis->LPUSH('key1',$value);
sleep(rand()%3);
echo $value."";
}catch(Exception $e){
echo $e->getMessage()."";
}
}
?>
出隊操作代碼
<?php
$redis = new Redis();
$redis->pconnect('',6379);
while(True){
try{
echo $redis->LPOP('key1')."";
}catch(Exception $e){
echo $e->getMessage()."";
}
sleep(rand()%3);
}?>
入隊列操作文件 list_
<?php
$redis = getRedisInstance();//從Redis服務器拿到redis實例
$redis->connect('Redis服務器IP', 6379);
while (true) {
$redis->lPush('list1', 'A_'('Y-m-d H:i:s'));
sleep(rand()%3);
}
?>
執行# php list_ &
出隊列操作 list_文件
<?php
$redis = getRedisInstance();//從Redis服務器拿到redis實例
$redis->pconnect('Redis服務器IP', 6379);
while(true) {
try {
var_export( $redis->blPop('list1', 10) );
} catch(Exception $e) {
//echo $e;
}
}
用Python實現:
1.入隊列()
#!/usr/bin/env python
import time
from redis import Redis
redis = Redis(host='', port=6379)
while True:
now = time("%Y/%m/%d %H:%M:%S")
h('test_queue', now)
p(1)
2.出隊列()
#!/usr/bin/env python
import sys
from redis import Redis
redis = Redis(host='', port=6379)
while True:
res = ('test_queue')
if res == None:
pass
else:
print str(res)
在操作時,注意,要操作的是同一個list對象。
-
PHP緩存技術
PHP具有非常強大的功能,所有的CGI的功能PHP都能實現,而且支持幾乎所有流行的數據庫以及操作系統。最重要的是PHP可以用C、C++進行程序的擴展!以下是小編為大家搜索整理的PHP緩存技術,希望能給大家帶來幫助!更多精彩內容請及時關注我們應屆畢業生考試網!全頁面靜態...
-
PHP學習入門的一些基礎知識
導語:PHP是一種通用開源腳本語言。語法吸收了C語言、Java和Perl的特點,利於學習,使用廣泛,主要適用於Web開發領域。下面我們來看看PHP學習入門的一些基礎知識,希望對大家有所幫助。一,PHP腳本代碼標記PHP的腳本是文件中一對特殊標記所包括的內容,如ASP是“”,PHP可看...
-
PHP時間和日期函數怎麼操作
php函數的多樣化和功能相近真是一大特點,同一個應用可以用多種函數實現,這恐怕也是開源的一個弊端了;通過對PHP時間函數的系統學習,充分理解了時間戳和時區的概念(這個真的很重要),有需要的小夥伴可以參考下。PHP中所有函數都是UNIX紀元的,即從1970年1月1日開始的。日...
-
編譯chm格式PHP手冊的方法
微軟的chm文件格式是很受我們喜愛的,因為它可以把很多HTML文件打包成一個文件,容易傳輸和分享。而且非常方便易用,支持索引、搜索等。正因為這樣,大家通常都使用chm版本的PHP手冊。php.net會定期編譯PHP手冊,提供各種版本供大家下載,包括chm格式。由於是定期編譯,所以...