国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

redis 隊列操作的例子(php)

2024-05-04 23:15:02
字體:
供稿:網(wǎng)友

入隊操作

復制代碼 代碼如下:


<?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ù)據(jù)存儲,同時value支持多種類型:字符串 (同memcached中的value),列表 ,集合 (Set),有序集合 (OrderSet)和Hash 。所有的值類型均支持原子操作,如列表中追加彈出元素,集合中插入移除元素等。Rdids的數(shù)據(jù)大部分位于內(nèi)存中,其讀寫效率非常高,其提供AOF(追加 式操作記錄文件)和DUMP(定期數(shù)據(jù)備份)兩種持久化方式。Redis支持自定義的VM(虛擬內(nèi)存)機制,當數(shù)據(jù)容量超過內(nèi)存時,可以將部分Value 存儲到文件中。同時Redis支持Master-Slave機制,可以進行數(shù)據(jù)復制。
可以把Redis的list結(jié)構(gòu)當隊列來用.
從上面Redis的場景和作用來說,對于我們現(xiàn)在的開發(fā)活動,究竟能把Redis引入在那些場景,而不是把這么好的東東演變成“為了使用Redis,而Redis”的慘烈局面呢?當然,具體問題具體分析,這個真的很重要哈。
緩存?分布式緩存?
隊列?分布式隊列?
某些系統(tǒng)應用(例如,電信、銀行和大型互聯(lián)網(wǎng)應用等)都會使用到,當然,現(xiàn)在大行其道的memcache就是很好的證明;但從某一方面來說,memcache是否能把兩張囊括其中,而且能做到更好(沒有實際的應用過,所以只是拋出)。但從Redis身上,我就能感覺到,Redis,就能把隊列和緩存兩張都囊括其中,而且都不會產(chǎn)生并發(fā)環(huán)境下的困擾,因為Redis中的操作都是原子操作來著。
至于評論兩者的孰好孰壞就免了,存在就是理由,選擇適合的就是最好的。
下面開始玩玩Redis中的隊列(分布式)設(shè)計YY吧,請大蝦們多多指點。
狀況場景:
現(xiàn)在的項目,都是部署在多個服務器,或者多個IP上,而且前臺經(jīng)由F5分發(fā),所以用戶的請求究竟落在那一臺的服務器上,是無法確定的。對于項目中,有一秒殺設(shè)計,剛開始沒有考慮到這種部署,同時也是使用最容易處理的方式,直接給數(shù)據(jù)庫表鎖行記錄(Oracle上的)??梢哉f,對于不同的應用部署,而只有一臺數(shù)據(jù)庫服務器來說,很“輕松”的就解決了這個并發(fā)的問題。所以現(xiàn)在考慮一下,是不是挪到應用上,避免數(shù)據(jù)庫服務器也摻雜到業(yè)務上。
比如,現(xiàn)在有2臺應用服務器,1臺數(shù)據(jù)庫服務器。想法是,把Redis部署在數(shù)據(jù)庫服務器上,兩臺服務器在操作并發(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)


在操作時,注意,要操作的是同一個list對象。
呵呵,現(xiàn)在的主要思路就差不多就是如此,不過真實場景中,會有出入。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 玛曲县| 英山县| 固始县| 麻城市| 壶关县| 荥阳市| 玛多县| 香港| 龙口市| 新化县| 纳雍县| 弋阳县| 马公市| 青州市| 楚雄市| 南通市| 分宜县| 东安县| 塘沽区| 龙岩市| 新巴尔虎右旗| 安多县| 苏尼特左旗| 永寿县| 砚山县| 三门峡市| 安乡县| 宁国市| 普兰县| 台湾省| 墨玉县| 莱阳市| 许昌县| 鄂托克旗| 商都县| 常州市| 渑池县| 新巴尔虎左旗| 耒阳市| 乐安县| 台中县|