Reids是一個比較高級的開源key-value存儲系統(tǒng),采用ANSI C實現(xiàn)。其與memcached類似,但是支持持久化數(shù)據存儲入隊操作
寶豐網站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網頁設計、網站建設、微信開發(fā)、APP開發(fā)、響應式網站開發(fā)等網站項目制作,到程序開發(fā),運營維護。成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選成都創(chuàng)新互聯(lián)公司。
復制代碼 代碼如下:
?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."\n";
}catch(Exception $e){
echo $e-getMessage()."\n";
}
}
?
出隊操作
復制代碼 代碼如下:
?php
$redis = new Redis();
$redis-pconnect('127.0.0.1',6379);
while(True){
try{
echo $redis-LPOP('key1')."\n";
}catch(Exception $e){
echo $e-getMessage()."\n";
}
sleep(rand()%3);
}?
如何使用Redis 做隊列操作
Reids是一個比較高級的開源key-value存儲系統(tǒng),采用ANSI C實現(xiàn)。其與memcached類似,但是支持持久化數(shù)據存儲,同時value支持多種類型:字符串 (同memcached中的value),列表 ,集合 (Set),有序集合 (OrderSet)和Hash 。所有的值類型均支持原子操作,如列表中追加彈出元素,集合中插入移除元素等。Rdids的數(shù)據大部分位于內存中,其讀寫效率非常高,其提供AOF(追加 式操作記錄文件)和DUMP(定期數(shù)據備份)兩種持久化方式。Redis支持自定義的VM(虛擬內存)機制,當數(shù)據容量超過內存時,可以將部分Value 存儲到文件中。同時Redis支持Master-Slave機制,可以進行數(shù)據復制。
可以把Redis的list結構當隊列來用.
從上面Redis的場景和作用來說,對于我們現(xiàn)在的開發(fā)活動,究竟能把Redis引入在那些場景,而不是把這么好的東東演變成“為了使用Redis,而Redis”的慘烈局面呢?當然,具體問題具體分析,這個真的很重要哈。
緩存?分布式緩存?
隊列?分布式隊列?
某些系統(tǒng)應用(例如,電信、銀行和大型互聯(lián)網應用等)都會使用到,當然,現(xiàn)在大行其道的memcache就是很好的證明;但從某一方面來說,memcache是否能把兩張囊括其中,而且能做到更好(沒有實際的應用過,所以只是拋出)。但從Redis身上,我就能感覺到,Redis,就能把隊列和緩存兩張都囊括其中,而且都不會產生并發(fā)環(huán)境下的困擾,因為Redis中的操作都是原子操作來著。
至于評論兩者的孰好孰壞就免了,存在就是理由,選擇適合的就是最好的。
下面開始玩玩Redis中的隊列(分布式)設計YY吧,請大蝦們多多指點。
狀況場景:
現(xiàn)在的項目,都是部署在多個服務器,或者多個IP上,而且前臺經由F5分發(fā),所以用戶的請求究竟落在那一臺的服務器上,是無法確定的。對于項目中,有一秒殺設計,剛開始沒有考慮到這種部署,同時也是使用最容易處理的方式,直接給數(shù)據庫表鎖行記錄(Oracle上的)。可以說,對于不同的應用部署,而只有一臺數(shù)據庫服務器來說,很“輕松”的就解決了這個并發(fā)的問題。所以現(xiàn)在考慮一下,是不是挪到應用上,避免數(shù)據庫服務器也摻雜到業(yè)務上。
比如,現(xiàn)在有2臺應用服務器,1臺數(shù)據庫服務器。想法是,把Redis部署在數(shù)據庫服務器上,兩臺服務器在操作并發(fā)緩存或者隊列時,先從Redis服務器上,取得在兩臺應用服務器的代理對象,再做入列出列的操作。
看代碼實現(xiàn)(PHP)
入隊列操作文件 list_push.php
復制代碼 代碼如下:
?php
$redis = getRedisInstance();//從Redis服務器拿到redis實例$redis-connect('Redis服務器IP', 6379);
while (true) {
$redis-lPush('list1', 'A_'.date('Y-m-d H:i:s'));sleep(rand()%3);
}
?
執(zhí)行# php list_push.php
出隊列操作 list_pop.php文件
復制代碼 代碼如下:
?php
$redis = getRedisInstance();//從Redis服務器拿到redis實例$redis-pconnect('Redis服務器IP', 6379);
while(true) {
try {
var_export( $redis-blPop('list1', 10) );} catch(Exception $e) {
//echo $e;
}
}
實現(xiàn)方法(Python)
1.入隊列(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.出隊列(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)
1. redis中保存的是數(shù)組(序列化),絕對不要保存SQL,保存SQL的方法很蛋疼 保存數(shù)組是為了數(shù)據庫安全(萬一sql語句有錯誤,任務就直接失敗了),靈活度和兼容性
2. 服務器后臺作一個shell腳本,死循環(huán),不斷從隊列中取數(shù)據,進行處理.如次反復,如果沒有數(shù)據,也立即嘗試取數(shù)據---不要擔心性能問題,后臺單并發(fā)請求,不會造成性能問題
3. 因為隊列中保存的是數(shù)組,不存在這個問題
一個笨方法:
1、把需要發(fā)的消息存到數(shù)據庫;
2、寫一個crontab,定期從數(shù)據庫取數(shù)據,然后處理~
首先,隊列的作用不是批量處理,而是延時處理,也叫異步處理
要做批量采集的話,首先你要劃分好區(qū)間,可以用php的多進程,也可以用php的cli模式做,只要數(shù)據不竄就行
在項目文件夾內創(chuàng)建入口文件index.php
?php
define('THINK_PATH', '../ThinkPHP');
define('APP_PATH', '.');
require(THINK_PATH."/ThinkPHP.php");
App::run();
?
在瀏覽器中訪問入口地址項目文件夾/index.php,之后ThinkPHP會自動生成項目文件.
在項目文件夾下Lib/Action目錄中,會生成默認的控制器文件IndexAction.php,你可以直接修改使用它.
?php
/**** IndexAction ****/
class IndexAction extends Action{
public function yourfunctionname(){
echo '默認操作br /';
}
public function yourfunctionname(){
$this - redirect('target',array('參數(shù)名1'=參數(shù)值1,'參數(shù)名2'=參數(shù)值2,.......),跳轉前停滯時間n秒,'跳轉前的提示:n秒后跳轉到target'); //重定向,即ThinkPHP自帶的跳轉函數(shù)
}
public tunction target(){
echo '跳轉成功,這里就是target.br /';
echo '參數(shù)名1:'.$_GET['參數(shù)名1'].'br /';
echo '參數(shù)名2:'.$_GET['參數(shù)名2'].'br /';
}
}
?
然后在瀏覽器中訪問你yourfunctionname的地址:
項目文件夾/index.php?Index/yourfunctionname,
就可以調用你自定義的函數(shù)了,系統(tǒng)會在n秒后跳轉到target,并顯示輸出.
extend.php是一個擴展函數(shù)庫,可以拷貝到控制器文件(如IndexAction)中使用
功能包括
樓主還有什么不懂的就去后盾人那里多學習學習
在PHP中,我們可以用array來簡單模擬隊列的功能,array_push出列,array_pop入列,但是更高效的用法還是要使用SplQueue這個官方提供的隊列類來做,記錄一下簡單的用法。
我們注意到,SplQueue中還有push和pop方法,它們與enqueue和dequeue有什么區(qū)別呢?
push和enqueue沒有區(qū)別,但是pop等同于棧的pop(FILO),每次彈出最后壓入隊列的元素。
而隊列是先進先出(FIFO)的,所以每次彈出的都是剩下的節(jié)點中先入列節(jié)點
以上是PHP隊列的簡單用法,下面是一些迭代器指針相關的操作
本文名稱:php隊列數(shù)據怎么處理 php處理大量數(shù)據
當前URL:http://redsoil1982.com.cn/article16/dodjodg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供商城網站、做網站、網頁設計公司、微信公眾號、手機網站建設、定制開發(fā)
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)