php實(shí)現(xiàn)數(shù)據(jù)庫隊(duì)列 php中數(shù)據(jù)庫怎么設(shè)計(jì)

php 用 redis做隊(duì)列 運(yùn)行過程是什么樣的

Reids是一個(gè)比較高級(jí)的開源key-value存儲(chǔ)系統(tǒng),采用ANSI C實(shí)現(xiàn)。其與memcached類似,但是支持持久化數(shù)據(jù)存儲(chǔ)入隊(duì)操作

創(chuàng)新互聯(lián)是少有的網(wǎng)站制作、成都網(wǎng)站制作、營(yíng)銷型企業(yè)網(wǎng)站、小程序開發(fā)、手機(jī)APP,開發(fā)、制作、設(shè)計(jì)、賣鏈接、推廣優(yōu)化一站式服務(wù)網(wǎng)絡(luò)公司,公司2013年成立,堅(jiān)持透明化,價(jià)格低,無套路經(jīng)營(yíng)理念。讓網(wǎng)頁驚喜每一位訪客多年來深受用戶好評(píng)

復(fù)制代碼 代碼如下:

?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";

}

}

?

出隊(duì)操作

復(fù)制代碼 代碼如下:

?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 做隊(duì)列操作

Reids是一個(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的場(chǎng)景和作用來說,對(duì)于我們現(xiàn)在的開發(fā)活動(dòng),究竟能把Redis引入在那些場(chǎng)景,而不是把這么好的東東演變成“為了使用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中的操作都是原子操作來著。

至于評(píng)論兩者的孰好孰壞就免了,存在就是理由,選擇適合的就是最好的。

下面開始玩玩Redis中的隊(duì)列(分布式)設(shè)計(jì)YY吧,請(qǐng)大蝦們多多指點(diǎn)。

狀況場(chǎng)景:

現(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上的)??梢哉f,對(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ì)象,再做入列出列的操作。

看代碼實(shí)現(xiàn)(PHP)

入隊(duì)列操作文件 list_push.php

復(fù)制代碼 代碼如下:

?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文件

復(fù)制代碼 代碼如下:

?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;

}

}

實(shí)現(xiàn)方法(Python)

1.入隊(duì)列(write.py)

復(fù)制代碼 代碼如下:

#!/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)

復(fù)制代碼 代碼如下:

#!/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)

PHP+MYSQL 實(shí)現(xiàn)隊(duì)列 進(jìn)行發(fā)送短信怎么做

最近遇到一個(gè)批量發(fā)送短信的需求,短信接口是第三方提供的。剛開始想到,獲取到手機(jī)號(hào)之后,循環(huán)調(diào)用接口發(fā)送不就可以了嗎?

但很快發(fā)現(xiàn)問題:當(dāng)短信數(shù)量很大時(shí),不僅耗時(shí),而且成功率很低。

于是想到,用PHP和MySQL實(shí)現(xiàn)一個(gè)消息隊(duì)列,一條一條的發(fā)送短信。下面介紹具體的實(shí)現(xiàn)方法:

首先,建立一個(gè)數(shù)據(jù)表sms,包含以下字段:

id,

phone, //手機(jī)號(hào)

content //短信內(nèi)容

將需要發(fā)送的短信和手機(jī)號(hào)存入sms表中。

接下來,需要用PHP實(shí)現(xiàn)一個(gè)定時(shí)器,定時(shí)讀取一條記錄,并發(fā)送短信:

?php

$db = new Db();

$sms = new Sms();

while(true){

$item = $db-getFirstRecord(); //獲取數(shù)據(jù)表第一條記錄

if(!$item){

//如果隊(duì)列中沒有數(shù)據(jù),則結(jié)束定時(shí)器

break;

}

$res = $sms-send($item['phone'],$item['content']); //發(fā)送短信

if($res){

$db-deleteFristRecord(); //刪除發(fā)送成功的記錄

echo $item['phone'].'發(fā)送成功';

}else{

echo $item['phone'].'發(fā)送失敗,稍后繼續(xù)嘗試';

}

sleep(10); //每隔十秒循環(huán)一次

}

echo '發(fā)送完畢!';

?

將代碼保存為timer_sms.php,打開命令行,執(zhí)行定時(shí)器:

php timer_sms.php

好了,php定時(shí)器將會(huì)根據(jù)設(shè)定的時(shí)間間隔(這里設(shè)的是10秒),自動(dòng)完成發(fā)送短信的任務(wù)。任務(wù)完成后將自動(dòng)退出定時(shí)器,不再占用服務(wù)器資源。

根據(jù)我的測(cè)試,PHP定時(shí)器占用資源并不多,不會(huì)對(duì)服務(wù)器造成壓力。而且是異步訪問數(shù)據(jù)庫,也不會(huì)影響數(shù)據(jù)庫的運(yùn)行。

這種方式的優(yōu)點(diǎn)是:

1、后臺(tái)運(yùn)行,前臺(tái)無需等待

2、成功率高,失敗的記錄會(huì)自動(dòng)重發(fā),直到成功

PHP SplQueue 隊(duì)列用法

在PHP中,我們可以用array來簡(jiǎn)單模擬隊(duì)列的功能,array_push出列,array_pop入列,但是更高效的用法還是要使用SplQueue這個(gè)官方提供的隊(duì)列類來做,記錄一下簡(jiǎn)單的用法。

我們注意到,SplQueue中還有push和pop方法,它們與enqueue和dequeue有什么區(qū)別呢?

push和enqueue沒有區(qū)別,但是pop等同于棧的pop(FILO),每次彈出最后壓入隊(duì)列的元素。

而隊(duì)列是先進(jìn)先出(FIFO)的,所以每次彈出的都是剩下的節(jié)點(diǎn)中先入列節(jié)點(diǎn)

以上是PHP隊(duì)列的簡(jiǎn)單用法,下面是一些迭代器指針相關(guān)的操作

PHP 數(shù)據(jù)結(jié)構(gòu)隊(duì)列(SplQueue)和優(yōu)先隊(duì)列(SplPriorityQueue)簡(jiǎn)單使用實(shí)例

隊(duì)列這種數(shù)據(jù)結(jié)構(gòu)更簡(jiǎn)單,就像我們生活中排隊(duì)一樣,它的特性是先進(jìn)先出(FIFO)。

PHP

SPL中SplQueue類就是實(shí)現(xiàn)隊(duì)列操作,和棧一樣,它也可以繼承雙鏈表(SplDoublyLinkedList)輕松實(shí)現(xiàn)。

SplQueue類摘要如下:

SplQueue簡(jiǎn)單使用如下:

復(fù)制代碼

代碼如下:

$queue

=

new

SplQueue();

/**

*

可見隊(duì)列和雙鏈表的區(qū)別就是IteratorMode改變了而已,棧的IteratorMode只能為:

*

(1)SplDoublyLinkedList::IT_MODE_FIFO

|

SplDoublyLinkedList::IT_MODE_KEEP

(默認(rèn)值,迭代后數(shù)據(jù)保存)

*

(2)SplDoublyLinkedList::IT_MODE_FIFO

|

SplDoublyLinkedList::IT_MODE_DELETE

(迭代后數(shù)據(jù)刪除)

*/

$queue-setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO

|

SplDoublyLinkedList::IT_MODE_DELETE);

//SplQueue::enqueue()其實(shí)就是

SplDoublyLinkedList::push()

$queue-enqueue('a');

$queue-enqueue('b');

$queue-enqueue('c');

//SplQueue::dequeue()其實(shí)就是

SplDoublyLinkedList::shift()

print_r($queue-dequeue());

foreach($queue

as

$item)

{

echo

$item

.

PHP_EOL;

}

print_r($queue);

而優(yōu)先隊(duì)列SplPriorityQueue是基于堆(后文介紹)實(shí)現(xiàn)的。

SplPriorityQueue的類摘要如下:

SplPriorityQueue簡(jiǎn)單使用:

$pq

=

new

SplPriorityQueue();

$pq-insert('a',

10);

$pq-insert('b',

1);

$pq-insert('c',

8);

echo

$pq-count()

.PHP_EOL;

//3

echo

$pq-current()

.

PHP_EOL;

//a

/**

*

設(shè)置元素出隊(duì)模式

*

SplPriorityQueue::EXTR_DATA

僅提取值

*

SplPriorityQueue::EXTR_PRIORITY

僅提取優(yōu)先級(jí)

*

SplPriorityQueue::EXTR_BOTH

提取數(shù)組包含值和優(yōu)先級(jí)

*/

$pq-setExtractFlags(SplPriorityQueue::EXTR_DATA);

while($pq-valid())

{

print_r($pq-current());

//a

c

b

$pq-next();

}

新聞名稱:php實(shí)現(xiàn)數(shù)據(jù)庫隊(duì)列 php中數(shù)據(jù)庫怎么設(shè)計(jì)
轉(zhuǎn)載注明:http://muchs.cn/article44/ddccpee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、服務(wù)器托管網(wǎng)站策劃、網(wǎng)頁設(shè)計(jì)公司移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)