php語言redis隊(duì)列操作實(shí)例
PHP是將程序嵌入到HTML文檔中去執(zhí)行,執(zhí)行效率比完全生成HTML標(biāo)記的CGI要高許多。下面是小編分享的php語言redis隊(duì)列操作實(shí)例,一起來看一下吧。
Redis是一個(gè)比較高級(jí)的開源key-value存儲(chǔ)系統(tǒng),采用ANSI C實(shí)現(xiàn)。其與memcached類似,但是支持持久化數(shù)據(jù)存儲(chǔ),同時(shí)value支持多種類型:字符串 (同memcached中的value),列表 ,集合 (Set),有序集合 (OrderSet)和Hash 。所有的值類型均支持原子操作,如列表中追加彈出元素,集合中插入移除元素等。Rdids的數(shù)據(jù)大部分位于內(nèi)存中,其讀寫效率非常高,其提供AOF(追加 式操作記錄文件)和DUMP(定期數(shù)據(jù)備份)兩種持久化方式。Redis支持自定義的VM(虛擬內(nèi)存)機(jī)制,當(dāng)數(shù)據(jù)容量超過內(nèi)存時(shí),可以將部分Value 存儲(chǔ)到文件中。同時(shí)Redis支持Master-Slave機(jī)制,可以進(jìn)行數(shù)據(jù)復(fù)制。
可以把Redis的list結(jié)構(gòu)當(dāng)隊(duì)列來用
從上面Redis的場景和作用來說,對(duì)于我們現(xiàn)在的開發(fā)活動(dòng),究竟能把Redis引入在那些場景,而不是把這么好的東東演變成“為了使用Redis,而Redis”的慘烈局面呢?當(dāng)然,具體問題具體分析,這個(gè)真的很重要哈。
緩存?分布式緩存? 隊(duì)列?分布式隊(duì)列?
某些系統(tǒng)應(yīng)用(例如,電信、銀行和大型互聯(lián)網(wǎng)應(yīng)用等)都會(huì)使用到,當(dāng)然,現(xiàn)在大行其道的memcache就是很好的證明;但從某一方面來 說,memcache是否能把兩張囊括其中,而且能做到更好(沒有實(shí)際的應(yīng)用過,所以只是拋出)。但從Redis身上,我就能感覺到,Redis,就能把 隊(duì)列和緩存兩張都囊括其中,而且都不會(huì)產(chǎn)生并發(fā)環(huán)境下的困擾,因?yàn)镽edis中的'操作都是原子操作來著。
下面開始說說Redis中的隊(duì)列(分布式)。
狀況場景:
現(xiàn)在的項(xiàng)目,都是部署在多個(gè)服務(wù)器,或者多個(gè)IP上,而且前臺(tái)經(jīng)由F5分發(fā),所以用戶的請(qǐng)求究竟落在那一臺(tái)的服務(wù)器上,是無法確定的。對(duì)于項(xiàng)目 中,有一秒殺設(shè)計(jì),剛開始沒有考慮到這種部署,同時(shí)也是使用最容易處理的方式,直接給數(shù)據(jù)庫表鎖行記錄(Oracle上的)。可以說,對(duì)于不同的應(yīng)用部 署,而只有一臺(tái)數(shù)據(jù)庫服務(wù)器來說,很“輕松”的就解決了這個(gè)并發(fā)的問題。所以現(xiàn)在考慮一下,是不是挪到應(yīng)用上,避免數(shù)據(jù)庫服務(wù)器也摻雜到業(yè)務(wù)上。
比如,現(xiàn)在有2臺(tái)應(yīng)用服務(wù)器,1臺(tái)數(shù)據(jù)庫服務(wù)器。想法是,把Redis部署在數(shù)據(jù)庫服務(wù)器上,兩臺(tái)服務(wù)器在操作并發(fā)緩存或者隊(duì)列時(shí),先從Redis服務(wù)器上取得在兩臺(tái)應(yīng)用服務(wù)器的代理對(duì)象,再做入列出列的操作。
入隊(duì)操作代碼
<?php
$redis = new Redis();
$redis->connect('127.0.0.1',6379);
while(True){
try{
$value = 'value_'.date('Y-m-d H:i:s');
$redis->LPUSH('key1',$value);
sleep(rand()%3);
echo $value." ";
}catch(Exception $e){
echo $e->getMessage()." ";
}
}
?>
出隊(duì)操作代碼
<?php
$redis = new Redis();
$redis->pconnect('127.0.0.1',6379);
while(True){
try{
echo $redis->LPOP('key1')." ";
}catch(Exception $e){
echo $e->getMessage()." ";
}
sleep(rand()%3);
}?>
入隊(duì)列操作文件 list_push.php
<?php
$redis = getRedisInstance();//從Redis服務(wù)器拿到redis實(shí)例
$redis->connect('Redis服務(wù)器IP', 6379);
while (true) {
$redis->lPush('list1', 'A_'.date('Y-m-d H:i:s'));
sleep(rand()%3);
}
?>
執(zhí)行# php list_push.php &
出隊(duì)列操作 list_pop.php文件
<?php
$redis = getRedisInstance();//從Redis服務(wù)器拿到redis實(shí)例
$redis->pconnect('Redis服務(wù)器IP', 6379);
while(true) {
try {
var_export( $redis->blPop('list1', 10) );
} catch(Exception $e) {
//echo $e;
}
}
用Python實(shí)現(xiàn):
1.入隊(duì)列(write.py)
#!/usr/bin/env python
import time
from redis import Redis
redis = Redis(host='127.0.0.1', port=6379)
while True:
now = time.strftime("%Y/%m/%d %H:%M:%S")
redis.lpush('test_queue', now)
time.sleep(1)
2.出隊(duì)列(read.py)
#!/usr/bin/env python
import sys
from redis import Redis
redis = Redis(host='127.0.0.1', port=6379)
while True:
res = redis.rpop('test_queue')
if res == None:
pass
else:
print str(res)
在操作時(shí),注意,要操作的是同一個(gè)list對(duì)象。
【php語言redis隊(duì)列操作實(shí)例】相關(guān)文章:
PHP curl之操作實(shí)例08-17
C語言循環(huán)隊(duì)列的表示與實(shí)例詳解11-19
php簡單偽靜態(tài)實(shí)例09-28
php短域名互換實(shí)例10-01
php防盜鏈實(shí)例09-21
php操作mysql步驟09-19
PHP文件怎么操作09-01