導航:首頁 > 編程語言 > php分布式鎖

php分布式鎖

發布時間:2022-05-31 09:20:48

『壹』 php 使用redis鎖限制並發訪問類示例

本文介紹了php
使用redis鎖限制並發訪問類,並詳細的介紹了並發訪問限制方法。
1.並發訪問限制問題
對於一些需要限制同一個用戶並發訪問的場景,如果用戶並發請求多次,而伺服器處理沒有加鎖限制,用戶則可以多次請求成功。
例如換領優惠券,如果用戶同一時間並發提交換領碼,在沒有加鎖限制的情況下,用戶則可以使用同一個換領碼同時兌換到多張優惠券。
偽代碼如下:
if
A(可以換領)

B(執行換領)

C(更新為已換領)
D(結束)
如果用戶並發提交換領碼,都能通過可以換領(A)的判斷,因為必須有一個執行換領(B)後,才會更新為已換領(C)。因此如果用戶在有一個更新為已換領之前,有多少次請求,這些請求都可以執行成功。
2.並發訪問限制方法
使用文件鎖可以實現並發訪問限制,但對於分布式架構的環境,使用文件鎖不能保證多台伺服器的並發訪問限制。
Redis是一個開源的使用ANSI
C語言編寫、支持網路、可基於內存亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。
本文將使用其setnx方法實現分布式鎖功能。setnx即Set
it
N**ot
eX**ists。
當鍵值不存在時,插入成功(獲取鎖成功),如果鍵值已經存在,則插入失敗(獲取鎖失敗)
RedisLock.class.PHP
<?php
/**
*
Redis鎖操作類
*
Date:
2016-06-30
*
Author:
fdipzone
*
Ver:
1.0
*
*
Func:
*
public
lock
獲取鎖
*
public
unlock
釋放鎖
*
private
connect
連接
*/
class
RedisLock
{
//
class
start
private
$_config;
private
$_redis;
/**
*
初始化
*
@param
Array
$config
redis連接設定
*/
public
function
__construct($config=array()){
$this->_config
=
$config;
$this->_redis
=
$this->connect();
}
/**
*
獲取鎖
*
@param
String
$key
鎖標識
*
@param
Int
$expire
鎖過期時間
*
@return
Boolean
*/
public
function
lock($key,
$expire=5){
$is_lock
=
$this->_redis->setnx($key,
time()+$expire);
//
不能獲取鎖
if(!$is_lock){
//
判斷鎖是否過期
$lock_time
=
$this->_redis->get($key);
//
鎖已過期,刪除鎖,重新獲取
if(time()>$lock_time){
$this->unlock($key);
$is_lock
=
$this->_redis->setnx($key,
time()+$expire);
}
}
return
$is_lock?
true
:
false;
}
/**
*
釋放鎖
*
@param
String
$key
鎖標識
*
@return
Boolean
*/
public
function
unlock($key){
return
$this->_redis->del($key);
}
/**
*
創建redis連接
*
@return
Link
*/
private
function
connect(){
try{
$redis
=
new
Redis();
$redis->connect($this->_config['host'],$this->_config['port'],$this->_config['timeout'],$this->_config['reserved'],$this->_config['retry_interval']);
if(empty($this->_config['auth'])){
$redis->auth($this->_config['auth']);
}
$redis->select($this->_config['index']);
}catch(RedisException
$e){
throw
new
Exception($e->getMessage());
return
false;
}
return
$redis;
}
}
//
class
end
?>
demo.php
<?php
require
'RedisLock.class.php';
$config
=
array(
'host'
=>
'localhost',
'port'
=>
6379,
'index'
=>
0,
'auth'
=>
'',
'timeout'
=>
1,
'reserved'
=>
NULL,
'retry_interval'
=>
100,
);
//
創建redislock對象
$oRedisLock
=
new
RedisLock($config);
//
定義鎖標識
$key
=
'mylock';
//
獲取鎖
$is_lock
=
$oRedisLock->lock($key,
10);
if($is_lock){
echo
'get
lock
success<br>';
echo
'do
sth..<br>';
sleep(5);
echo
'success<br>';
$oRedisLock->unlock($key);
//
獲取鎖失敗
}else{
echo
'request
too
frequently<br>';
}
?>
測試方法:
打開兩個不同的瀏覽器,同時在A,B中訪問demo.php
如果先訪問的會獲取到鎖
輸出
get
lock
success
do
sth..
success
另一個獲取鎖失敗則會輸出request
too
frequently
保證同一時間只有一個訪問有效,有效限制並發訪問。
為了避免系統突然出錯導致死鎖,所以在獲取鎖的時候增加一個過期時間,如果已超過過期時間,即使是鎖定狀態都會釋放鎖,避免死鎖導致的問題。
源碼下載地址:點擊查看

『貳』 zookeeper怎麼實現分布式鎖

1. 利用節點名稱的唯一性來實現共享鎖
ZooKeeper抽象出來的節點結構是一個和unix文件系統類似的小型的樹狀的目錄結構。ZooKeeper機制規定:同一個目錄下只能有一個唯一的文件名。例如:我們在Zookeeper目錄/test目錄下創建,兩個客戶端創建一個名為Lock節點,只有一個能夠成功。
演算法思路: 利用名稱唯一性,加鎖操作時,只需要所有客戶端一起創建/test/Lock節點,只有一個創建成功,成功者獲得鎖。解鎖時,只需刪除/test/Lock節點,其餘客戶端再次進入競爭創建節點,直到所有客戶端都獲得鎖。
基於以上機制,利用節點名稱唯一性機制的共享鎖演算法流程如圖所示:

該共享鎖實現很符合我們通常多個線程去競爭鎖的概念,利用節點名稱唯一性的做法簡明、可靠。
由上述演算法容易看出,由於客戶端會同時收到/test/Lock被刪除的通知,重新進入競爭創建節點,故存在"驚群現象"。
使用該方法進行測試鎖的性能列表如下:

總結 這種方案的正確性和可靠性是ZooKeeper機制保證的,實現簡單。缺點是會產生「驚群」效應,假如許多客戶端在等待一把鎖,當鎖釋放時候所有客戶端都被喚醒,僅僅有一個客戶端得到鎖。

2. 利用臨時順序節點實現共享鎖的一般做法
首先介紹一下,Zookeeper中有一種節點叫做順序節點,故名思議,假如我們在/lock/目錄下創建節3個點,ZooKeeper集群會按照提起創建的順序來創建節點,節點分別為/lock/0000000001、/lock/0000000002、/lock/0000000003。
ZooKeeper中還有一種名為臨時節點的節點,臨時節點由某個客戶端創建,當客戶端與ZooKeeper集群斷開連接,則開節點自動被刪除。
利用上面這兩個特性,我們來看下獲取實現分布式鎖的基本邏輯:
客戶端調用create()方法創建名為「locknode/guid-lock-」的節點,需要注意的是,這里節點的創建類型需要設置為EPHEMERAL_SEQUENTIAL。
客戶端調用getChildren(「locknode」)方法來獲取所有已經創建的子節點,同時在這個節點上注冊上子節點變更通知的Watcher。
客戶端獲取到所有子節點path之後,如果發現自己在步驟1中創建的節點是所有節點中序號最小的,那麼就認為這個客戶端獲得了鎖。
如果在步驟3中發現自己並非是所有子節點中最小的,說明自己還沒有獲取到鎖,就開始等待,直到下次子節點變更通知的時候,再進行子節點的獲取,判斷是否獲取鎖。
釋放鎖的過程相對比較簡單,就是刪除自己創建的那個子節點即可。
上面這個分布式鎖的實現中,大體能夠滿足了一般的分布式集群競爭鎖的需求。這里說的一般性場景是指集群規模不大,一般在10台機器以內。
不過,細想上面的實現邏輯,我們很容易會發現一個問題,步驟4,「即獲取所有的子點,判斷自己創建的節點是否已經是序號最小的節點」,這個過程,在整個分布式鎖的競爭過程中,大量重復運行,並且絕大多數的運行結果都是判斷出自己並非是序號最小的節點,從而繼續等待下一次通知——這個顯然看起來不怎麼科學。客戶端無端的接受到過多的和自己不相關的事件通知,這如果在集群規模大的時候,會對Server造成很大的性能影響,並且如果一旦同一時間有多個節點的客戶端斷開連接,這個時候,伺服器就會像其餘客戶端發送大量的事件通知——這就是所謂的驚群效應。而這個問題的根源在於,沒有找准客戶端真正的關注點。
我們再來回顧一下上面的分布式鎖競爭過程,它的核心邏輯在於:判斷自己是否是所有節點中序號最小的。於是,很容易可以聯想的到的是,每個節點的創建者只需要關注比自己序號小的那個節點。

3、利用臨時順序節點實現共享鎖的改進實現
下面是改進後的分布式鎖實現,和之前的實現方式唯一不同之處在於,這里設計成每個鎖競爭者,只需要關注」locknode」節點下序號比自己小的那個節點是否存在即可。
演算法思路:對於加鎖操作,可以讓所有客戶端都去/lock目錄下創建臨時順序節點,如果創建的客戶端發現自身創建節點序列號是/lock/目錄下最小的節點,則獲得鎖。否則,監視比自己創建節點的序列號小的節點(比自己創建的節點小的最大節點),進入等待。
對於解鎖操作,只需要將自身創建的節點刪除即可。
具體演算法流程如下圖所示:

使用上述演算法進行測試的的結果如下表所示:

該演算法只監控比自身創建節點序列號小(比自己小的最大的節點)的節點,在當前獲得鎖的節點釋放鎖的時候沒有「驚群」。
總結 利用臨時順序節點來實現分布式鎖機制其實就是一種按照創建順序排隊的實現。這種方案效率高,避免了「驚群」效應,多個客戶端共同等待鎖,當鎖釋放時只有一個客戶端會被喚醒。

4、使用menagerie
其實就是對方案3的一個封裝,不用自己寫代碼了。直接拿來用就可以了。
menagerie基於Zookeeper實現了java.util.concurrent包的一個分布式版本。這個封裝是更大粒度上對各種分布式一致性使用場景的抽象。其中最基礎和常用的是一個分布式鎖的實現: org.menagerie.locks.ReentrantZkLock,通過ZooKeeper的全局有序的特性和EPHEMERAL_SEQUENTIAL類型znode的支持,實現了分布式鎖。具體做法是:不同的client上每個試圖獲得鎖的線程,都在相同的basepath下面創建一個EPHEMERAL_SEQUENTIAL的node。EPHEMERAL表示要創建的是臨時znode,創建連接斷開時會自動刪除; SEQUENTIAL表示要自動在傳入的path後面綴上一個自增的全局唯一後綴,作為最終的path。因此對不同的請求ZK會生成不同的後綴,並分別返回帶了各自後綴的path給各個請求。因為ZK全局有序的特性,不管client請求怎樣先後到達,在ZKServer端都會最終排好一個順序,因此自增後綴最小的那個子節點,就對應第一個到達ZK的有效請求。然後client讀取basepath下的所有子節點和ZK返回給自己的path進行比較,當發現自己創建的sequential node的後綴序號排在第一個時,就認為自己獲得了鎖;否則的話,就認為自己沒有獲得鎖。這時肯定是有其他並發的並且是沒有斷開的client/線程先創建了node。

『叄』 有誰用過基於memache的分布式鎖

像memcache和redias這些想要與PHP結合的話一般都是有組件提供給你去使用的,
按照官方給的參考去做就可以了,要是想更具使用性建議自己封裝操作類。

『肆』 基於java jsp asp php vb安卓系統畢業設計與實現論文源碼下載

及時送上了計算機畢業設計相關資源 合意的換請採納一下,大家順遍點下贊吧
在線考試制卷系統(任務書,論文,源碼)
net小型證券術語解釋及翻譯系統的設計與開發(源碼,論文)
原創vf員工培訓管理系統(任務書,論文)
asp科研信息管理系統(任務書,開題,論文,源碼)
android小型企業工資管理系統(源碼,論文)
asp計程車管理系統(任務書,論文,源碼)
vb.net實驗室計算機的ip地址自動設置程序——伺服器端(任務書,論文,源碼)
rsa可視化演算法程序的實現與研究(任務書,論文)
j2ee數控加工技術教學素材資源庫的構建(任務書,論文,源碼)
eims系統-oa子系統的設計與開發(任務書,開題,論文,源碼)
jsp網上購書(任務書,論文)
vb圖書管理系統(任務書,論文)
vc戶籍管理系統(任務書,論文,源碼)
php基於bs結構的工藝品銷售系統的實現(源碼,論文)
net模塊化動態電子商務網站的開發(任務書,論文,源碼)
pb電信人事管理系統設計(任務書,論文)
vb成本費用計算系統(源碼,論文)
jsp計程車管理系統(任務書,開題,論文,源碼)
asp.net求職招聘網站設計(源碼,論文)
vb.net機房監控系統(全套)
vf學生辦證管理系統(任務書,開題,論文,源碼)
jsp基於網路超市商品銷售管理系統(任務書,論文,源碼)
jsp團員管理
asp.net一個動態文學網站
vf基於jme平台的掌上網路商店-伺服器端的開發
c#報警系統
net(vc)辦公自動化管理系統
jsp計算機等級考試查詢系統jdbc
vb.net商品配送中心庫存模擬軟體設計
jsp網路購物
net在線英語自學系統——知識庫管理的設計
jsp企業進銷存管理系統
php某公司進銷存信息管理系統
pb幹部檔案管理系統
delphi學生信息管理系統畢業設計
asp學生信息管理系統
asj2eetoc電子商務網站
delphi圖書管理系統(畢業程序翻譯%通過)
jsp網上商城系統
jsp客戶關系管理系統
jsp企業人事管理系統
c#辦公管理系統
jsp搜索引擎的研究與實現
jsp網路房產信息超市
php會員管理系統
j2ee基於usbkey的文件加密工具—-客戶端的實現
net網上圖書訂閱系統的設計
php網站流量統計
asp.net團員管理
android文件傳輸
delphi並行介面器件功能演示的可視化設計學位
php房屋租賃管理信息系統jdbc
數據採集電路pcb的設計與製作
androidsmart系統-考試監控及閱卷模塊的設計與開發
java流動資金貸款業務系統
asp電腦配機
vf物流管理系統--倉儲管理子系統的實現
簡化的cpu邏輯功能的模擬實現
net網上教材管理系統
net高校學生宿舍管理系統
vc葯品公司進銷售存管理系統
基於des加密演算法的word加密插件的實現
asp.net基於asp.net的房產中介系統
c#簡單圖片轉化
asp基於asp的反垃圾郵件管理系統的設計
delphi航空客運訂票系統
c#windows簡單防火牆設計與實現
j2ee車間調度系統
php《資訊理論與編碼》在線考試系統
vb.net基於角色訪問控制的oa系統
asp某小型數字圖書館
vb圖形識別和編輯
pb電腦公司財務管理系統
asp網上購書
android光碟信息管理系統
php新聞網程序
php購物系統
vb.net考試系統vb.net
java學生管理系統
基於apriori演算法的關聯規則挖掘系統
vf布匹出口管理系統
c#會計電算化系統——財務管理子系統
php畢業生信息管理系統
pb酒店客房餐飲管理系統
vf庫存管理
asp.net葯品銷售數據管理系統
asp.net網上論壇
基於linux的遠程式控制制技術服務端實現
php網路商城
文件壓縮解壓縮實踐
asp學生管理系統
php科研項目網上申報管理系統
vb.net圖片文件中的信息隱藏和還原的設計
asp銷售供應鏈管理系統的設計與開發
asp基於asp技術的獵頭公司管理軟體的設計和實現——內部事務部分
網路求職招聘系統
neterp系統(畢業設計
php基於web的商場管理系統
vb電腦公司財務管理系統
delphi客戶管理系統
net圖書館管理信息系統
java超市商品管理系統
pb在線考試
java原創庫存管理系統可執行程序
c語言文件系統設計
基於webservice的資料庫同步系統
vb.net考勤管理系統vb.net
vb簡單幾何圖形的識別和編輯系統
net某公司員工管理系統
vf酒店客房管理系統
vf商場管理系統
vb.net開發在windows下的串口非同步通信程序
asp一個小型搜索引擎
j2ee高速公路票據管理系統
vb小區物業管理系統
php酒店房間預約系統設計
asp《資訊理論與編碼》在線考試系統
vf宿舍管理系統
android基於區域網的文件傳輸系統
asp學生網上選課系統
php校園學生信息在線管理系統
asp基於web的商場管理系統
net基於web的訂餐系統
jsp倉儲管理系統
簡易網路存儲系統
javaftp客戶端
jsp公交查詢系統
java人才管理系統
net企業投資價值分析系統
asp基於bbs的bbs系統設計(structmy)好
android通用圖書館管理系統
asp網上選課系統
最新asp網上論壇
vc網路爬蟲程序
net考勤系統(net)
net交通信息網上查詢系統
美食網站
pb企業物料需求計劃管理系統
delphi公交車查詢系統delphi源
asp.net網路招聘系統
asp視頻點播系統
vf學生學籍管理
android畢業管理系統
簡易網路存儲系統
vb.net一種基於cc模式的網上購物系統
asp.net網路文件管理系統
asp.net學生信息管理系統
j2ee城市公交查詢系統
j2ee人機介面設備—示波器的模擬實現
jsp網路商城
net基於bs的圖書銷售管理系統
net基於net的公司網站
j2ee汽車零件銷售管理系統
vf圖片文件中的信息隱藏和還原的設計
vf醫葯管理系統
net技術的獵頭公司管理軟體——內部事務部分
最新net高校學生宿舍管理系統
vb區域網抓包軟體
asp.net企業物流平台
asp.net學生排課管理系統
vb.net網路數據包捕獲工具
android企業考勤
c#在線考試
j2eealendar的跨平台系統的設計
vf書店輔助進書系統
asp倉庫即時查詢系統
asp作業提交與批改系統
vb開發在windows下的串口非同步通信程序
javaac自動組卷系統
asp網上體育用品商店
jsp華夏文化交流平台
delphi采購管理
php校園新聞發布管理系統
vb.net成績管理系統vb.net
delphi五子棋游戲(網路版)的設計與開發
最新net網上圖書訂閱系統的設計
vb教學輔助系統vb
android試題庫自動組卷系統
vc試題庫自動組卷系統(vc)cym
asp.net基於bs的家教交流平台的實現
vf學生成績管理系統vf
asp.net樓宇專業網站畢業設計
net多語種網路硬碟系統的設計
vf考試系統vf
埠信息工具
vf物業管理
net公交車管理系統的實現與設計
pb基於半打開的埠掃描技術及其實現
j2ee水費管理系統
vf用遺傳演算法解決車輛優化調度問題任務書
jsp辦公自動化管理系統
jsp基於android的在線購物系統
asp.net車輛調度管理系統
pb線程插入木馬
delphi基於delphi的串口通信服務的開發
asp葯店管理系統
jsp實驗室設備管理系統
kasumi演算法的研究與j2ee實現
net基於.net的城市公交查詢系統
jsp基於web的subversion用戶管理系統phb
delphivbd租賃管理系統
linux下的網路層加密解密的實現
android葯品公司進銷售存管理系統
asp服裝銷售系統
j2ee電信人事管理系統設計
jsp員工信息管理系統
android考勤管理系統android
vf基於.net的網上購物系統
vb.net財務管理系統
vc題庫管理系統
delphi基於webcam的人臉檢測技術
php在線學習系統
最新php團員管理
vb原創圖書管理系統)畢業設計
net某企業信息管理系統
asvbtoc電子商務網站
vf火車站售票管理系統
asp科研信息管理系統
net某企業信息管理系統
vb基於usbkey的文件加密工具—-客戶端的實現
net基於.net企業訂單管理系統的開發
net房地產評估系統
net作業在線提交系統
vc多線程與線程安全實踐-基於http協議的斷點續傳
vf地稅局工資管理系統
delphi科研管理系統
delphi煙花爆竹經銷管理系統
面向internet上的cscw的共享白板
php網路招聘系統
php網上求職與招聘系統
vb.net機房監控系統
asp.net考試報名信息處理系統
j2ee醫院病房管理系統
基於進程和通信隱藏的木馬設計與實現
net息加密與隱藏工具
c#汽車銷售系統
jsp原創教師信息管理系統
android簡易web伺服器研究
asp科研項目網上申報管理系統
asp基於asp的論壇
php計算機組成原理教學網站
android超市銷售系統
c#網路流量監控及分析工具
delphi電子郵件客戶端軟體
android排課系統程序
jsp網上拍賣平台系統)
j2ee某百貨店pos積分管理系統-積分添加和通票回收
j2ee教務管理系統j2ee
vf銀行代扣代發工資系統
php學生學籍管理系統
基於webservice的異構資料庫檢索系統的設計
android長途汽車信息管理系統
net系辦辦公自動化系統
c#網路計時管理系統
net網路商店銷售管理系統
原創net高校學生宿舍管理系統
asp網路教學評判系統
net客戶關系管理系統的實現
c語言遺傳演算法在求解tsp問題畢業
asp.net網上教學資源共享系統
基於icmp模擬網路控制軟體的開發——控制管理模塊
vb車間調度系統
net動態口令認證的網上選課系統
asp.net圖書館管理系統
asp企業公告及資料發布系統
pb原創圖書管理系統)畢業設計
vf基於cs結構的企業人事管理系統
網路嗅探器
jsp網上書店售書系統
asp.net網上選課系統
asp酒店客房管理系統
asp.net自動排課系統
net信息安全研究所設備管理系統
最新net基於bs的圖書銷售管理系統
java葯品銷售系統
java簡單小游戲設計
jsp基於web的旅遊網站建設
android庫存管理
php淘寶店主交易管理系統
net頻點播系統
pb大型機房學生上機管理系統
jsp基於bs結構的工廠設備管理系統的設計與開發
web的入侵防禦系統
最新php基於bbs的bbs系統設計(structmy)好
asp教師信息管理系統
net課件發布系統
j2ee在線英語自學系統——課程及自測管理的設計
asp網上二手商品交易管理系統
原創asp.net購物系統
pb小說租閱管理系統
人機介面設備—開關類部件的模擬實現
net校園新聞發布系統
php基於linux的遠程管理系統客戶端的實現
php在線exam
delphi物質管理系統
vb.net電信人事管理系統設計
android試題庫自動組卷系統(android)cym
j2ee學生檔案管理
net基於.net的內部郵件系統實現
asp.net學科建設
asp某公司進銷存信息管理系統
java企業投資價值分析系統
java大隨機數生成器演算法的研究與實現
jsp某高校工資管理系統
vb在線英語自學系統——課程及自測管理的設計
net某店pos積分管理系統-清除履歷表、日誌表、月購買額
asp會員管理系統
原創美食網站
vs家庭理財系統
區域網監聽系統
vc房屋租憑管理系統
jsp在線二手交易系統
vb.net模擬器件測試平台的設計與開發
原創net考勤系統(net)
java酒店管理信息系統
原創網路求職招聘系統
vf高校教務排課系統
c#rsa密碼體制的實現
埠掃描與檢測技術的實現
delphi猜數游戲的設計與開發
php宿舍管理系統設計
j2eeac自動組卷系統
原創php網路購物
android物質管理系統
php實驗室設備管理系統
asp求職招聘網站設計
androidsc結構服裝專賣店
net電子購物商城系統
java自動排課系統
java職員信息管理系統
vb書店輔助進書系統
android教師管理系統
jsp基於bs模式的中小企業人事管理系統
vc物質管理系統
最新簡易網路存儲系統
android並行介面器件功能演示的可視化設計學位
原創基於des加密演算法的word加密插件的實現
net頻點播系統
asp.net網路旅遊信息系統
原創asp計算機組成原理教學網站
jsp車輛調度管理系統
asp.net基於bs的工藝品展示系統
基於糾錯碼的容錯技術的研究——x碼
asp電子商務系統
pb原創庫存管理系統可執行程序
c#企業往來賬務管理系統
vc超市售貨管理系統
原創net網上圖書訂閱系統的設計
android人事管理系統
原創php在線學習系統
vf桌面日歷系統
java商業匯票(支票管理)
asp聊天室
java計科教務管理系統
vb.net物業管理系統
asp公共課平時成績查詢系統asp
最新asp會員管理系統
vc書店管理系統
win平台下的pe文件病毒的研究及實現
j2ee電子郵件客戶端軟體
asp.net基於asp.net的學生信息管理系統
vf企業人事工資管理系統
vbrsa密碼體制的實現
java基於bs方式的即時通訊軟體
vf煤氣站管理系統dpac
pb多媒體教學控制系統-網路通訊平台的設計
delphi酒店管理系統
jsp基於bs結構的工廠設備管理系統的設計與開發
jsp企業人力資源管理系統的設計
java課程設計醫葯管理系統(java)應要求源文件代碼打包上傳
j2ee實驗室儀器管理系統
pb網吧管理系統
pb車隊綜合業務管理系統
最新php網路商城
c#大隨機數生成器演算法的研究與實現
asp基於bs結構的二手交易系統
javad的網路三維技術
最新net考勤系統(net)
jsp基於web的信息處理系統
net小型門戶網自助建站系統
社區論壇
asp公交查詢系統
java文檔資料管理系統
php紅旗汽車修理廠物資流通管理系統
校園網路工程綜合布線方案
vc高校繳費系統
php格式化系統——前台
原創asp網上選課系統
最新asp校園學生信息在線管理系統
android基於特徵的入侵檢測系統
vb人事管理系統
vb.net圖書管理系統
java簡易web伺服器研究
jsp基於jsp學生成績管理系統軟體的開發
net模塊化動態電子商務網站的開發
delphi中大迅通合同統計系統
linux下的簡單網路管理控制系統的設計與開發
vf航空售票模擬系統
vb通用銷售管理系統
c#教學信息管理系統畢業
vc企業投資價值分析系統
j2ee基於bs方式的即時通訊軟體
asp.net科研信息管理系統
vb.net軟體項目開發管理系統vb.net
android可視化圖像處理系統
c#高校題庫管理系統附原代碼程序萬字
net基於.net電子相冊的開發
pb商品配送中心庫存模擬軟體設計
android成本費用計算系統
asp.net旅遊信息管理系統
j2ee宿舍管理系統
vb.net氣象信息服務系統
net基於tcp協議的簡單即時通信軟體
原創vb職員信息管理系統
php小型企業網上訂單系統
android人事管理
vb.net汽車銷售系統
最新美食網站
最新簡化的cpu邏輯功能的模擬實現
vb光碟信息管理系統
深水藍文學網站
vb列車時刻查詢決策系統
vc畢業管理系統
android商品交易系統
delphi列車時刻查詢決策系統課程設計
java圖書管理系統帶
java基於jee的公交查詢系統
net《資料庫原理及應用技術》課程指導平台的開發
原創net某企業信息管理系統
delphi區域網的語音通信
vc家庭財務管理系統
android人臉識別系統設計.
php軟體信息發布系統
社區論壇
net網上辦公系統——公文流程管理設計與實現
原創delphi學生檔案管理
delphi幹部檔案管理系統
asp基於bs的人才交流網站
asp.net酒店房間預約系統
java網路流量監控及分析工具
asp在線教學質量評價系統
php網路購物
快速加密解密晶元中kasumi演算法的實現
asp.net網路購物系統
最新php科研項目網上申報管理系統
j2ee打字系統
基於ajaxlucene構建搜索引擎的設計和實現
pb超市配送運輸管理系統
vf醫療糾紛檢索系統
pb圖書管理系統(畢業程序翻譯%通過)
原創美食網站
vb網路在線考試系統原碼
vb.net郵件收發系統的設計
jsp科研處管理信息系統
vcaccti電話語音應答系統
vc用遺傳演算法解決車輛優化調度問題任務書
delphi多媒體教學控制系統-網路通訊平台的設計
vc試卷生成系統
java氣象信息服務系統
asp區域網文件共享及檢索系統的設計與開發
php音樂網站
c內存映射文件在進程共享中的應用研究
php基於web的辦公自動化管理系統可執行
php基於網路環境的庫存管理系統
jsp在線直銷商城
vb排課管理系統
最新簡易網路存儲系統
jsp基於jsp的網上考試系統_
第二代木馬的研究與實現
vb.netjpeg編碼優化
java基於java的五子棋游戲軟體的設計與開發
java績效評價系統
vc倉庫管理系統
j2ee圖書館書庫管理系統
php學生成績查詢
java基於windows入侵檢測系統的研究與設計——檢測模塊設計
android象棋程序
vf網吧計費系統
c#smart系統-考試監控及閱卷模塊的設計與開發
android某醫療部門總務信息管理系統
vb.net圖書館全開架借閱管理系統
vf電子通訊錄(帶系統托盤)
android指紋識別系統
android設備保養管理系統
android基於區域網的信息收發系統
android辦公用品管理系統
pb企業考勤管理系統
pb葯品公司進銷售存管理系統
c#光碟管理系統
php服裝銷售系統
原創asp.net網上選課系統
net儀器設備管理系統設計與實現
j2ee基於特徵的入侵檢測系統
最新net基於net的公司網站
vb教學設備管理系統
net(java)辦公自動化管理系統
c#企業人事管理系統
asp.net校友錄server
android郵政編碼系統
最新asjavatoc電子商務網站
原創基於icmp模擬網路控制軟體的開發——控制管理模塊
asp計算機組成原理教學網站
j2ee考試分析評價系統
net基於bs的計算機等級考試系統
埠掃描與檢測技術的實現
vb.net題庫管理系統
原創php基於php的論壇
文學網站
php網上體育用品商店
asp網上書店
php博客網站
php施甸縣旅遊咨詢網
原創net客戶關系管理系統的實現
vf木馬檢測工具的實現
vb社區人口資源管理系統設計與實現
vbd的網路三維技術
基於net教學輔助系統設計與實現
c區域網即時聊天程序
delphi象棋程序
jsp基於網路超市商品銷售管理系統
c#計算機機房管理系統
asp網路教學平台
asp圖書館管理系統
pbsmart系統-公共資源模塊的設計與開發--代碼
asp助學貸款管理系統
j2ee學生檔案管理系統
php網上購物系統答辯
net門診就診系統
php某小型數字圖書館
asp.net網上家電銷售管理系統
asp.net網上商城系統
net中小企業oa系統
vb.net房屋銷售管理信息系統
最新面向internet上的cscw的共享白板
php同學錄系統
iptables圖形管理工具
asjavatoc電子商務網站
vc考試系統vc
最新asvftoc電子商務網站
實驗室計算機的ip地址自動設置程序——客戶端
asp.net網路教學評判系統
asp.net基於asp.net的筆記本銷售網站
php葯品銷售數據管理系統
android自動出題題庫系統
原創j2ee電腦公司財務管理系統
資料庫連接池的研究與實現
jsp課程設計
java上機考試系統
原創基於net教學輔助系統設計與實現
php科研信息管理系統
eims系統-oa子系統的設計與開發
net基於.net的工資績效管理系統的開發
pb基於工作流引擎的系統框架設計開發
asp.net網上日記本
c#員工管理系統
基於rsa的數字簽名
php企業人力資源管理系統的設計
原創asp《資訊理論與編碼》在線考試系統
j2ee掃雷游戲的設計與開發
jsp網上考試系統
vb學生管理系統
c#基於c#的飛行模擬游戲的設計及實現
php求職招聘網站設計
jsp科研處管理信息系統
net基於svg的自動站雨量分析系統
asp.net文章在線發布系統
vb流動資金貸款業務系統
net網路考試系統.net
jsp聊天室
vb.net基於vb.net的兩個通用安全模塊
net小型證券術語解釋及翻譯系統的設計與開發
android電腦銷售系統
j2ee自動點歌系統
net小型酒店管理系統的設計
vf辦公自動化系統
java商業匯票(支票管理)
asp.net課程設計
pb銀行設備管理
jsp企業網站設計
網路數據包的協議分析程序的設計開發
java網路多人聊天系統
android停車場管理系統
_基於.net的駕校理論考試模擬系統
jsp基於bs結構的工藝品銷售系統的實現
asp.net格式化系統——前台
asp個人網站
c#兼職中介管理系統
jsp基於jsp的人事管理系統
最新基於des加密演算法的word加密插件的實現
asp.net網路實驗教學網站
asp網路招聘系統
vb.net煤氣站管理系統dpac
asp倉儲管理系統
android圖書銷售信息系統
asp.netcd銷售管理系統
php學生信息管理系統
android圖像處理工具
pb學生辦證管理系統
j2ee黨員管理系統
asp.net機房自由上機收費管理軟體
vf網路計時管理系統
java基於java的五子棋游戲軟體的設計與開發
c#中介管理系統
php酒店客房管理系統
c#圖書館管理系統
pb科研項目管理系統
jsp學生管理
jsp學生考試成績分析(帶餅狀態圖,柱狀圖)
asp課程設計
asp.netc語言試題生成與考試系統
vb.net教學信息管理系統
vb區域網的數據包監聽及數據分析
vb高校題庫管理系統附原代碼程序萬字
php視頻點播系統
vb企業檔案管理系統簡單版
vb學生宿舍管理系統
net房地產管理系統
c#物業管理
vb音像店管理系統
javasmart系統-公共資源模塊的設計與開發--代碼
java基於ftp協議的文件訪問系統
最新基於des加密演算法的word加密插件的實現
vf績效評價系統
asp操作系統課程教學網站
pb旅遊資源及線路管理系統
vb.net計科教務管理系統
最新php客戶關系管理系統
j2ee病房管理系統
php原創交友網設計
最新net頻點播系統
php基於php學生成績管理系統軟體的開發
最新neterp系統(畢業設計
原創vc基於bs方式的即時通訊軟體
基於lotus的故障報修系統
vf超市配送運輸管理系統
vb.net試卷生成系統
原創文件壓縮與解壓縮實踐
php教師檔案管理系統
原創jsp《資訊理論與編碼》在線考試系統
android網路數據包捕獲工具
jsp葯品銷售數據管理系統
asp在線學習系統
j2ee考勤管理系統j2ee
asp網路商城
c區域網即時聊天程序
c#健身中心會員管理系統
vf客房管理信息系統
java基於採集
netxx職業中學圖書管理系統的設計
基於caché的實驗室資源管理系統的設計
最新基於net教學輔助系統設計與實現
vb.net學生管理系統
c內存映射文件在進程共享中的應用研究
vf中國象棋游戲
vbsmart系統-題庫及試卷管理模塊的設計與開發
win平台下的pe文件病毒的研究及實現
net基於手機簡訊平台聊天程序
jsp網上圖書銷售系統
原創web的入侵防禦系統
vc幹部檔案管理系統
最新web的入侵防禦系統
vf基於misty演算法的加密軟體的實現
vb.net數據結構輔助教學
php個人日誌系統
asp.net論壇程序設計(萬字功能強大)
asp網頁設計輔導系統
最新net動態口令認證的網上選課系統
net基於.net電子相冊的開發
j2ee學生信息管理系統萬字
pb網上交易系統pb
vf超市進銷存管理系統vf報稿
asp留言板
c#模擬atm機系統軟體的設計與開發c#
asp交友錄
pb車輛

『伍』 php面試題 memcache和redis的區別

Redis與Memcached的區別傳統MySQL+ Memcached架構遇到的問題實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發時間。2.Memcached與MySQL資料庫數據一致性問題。3.Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。4.跨機房cache同步問題。眾多NoSQL百花齊放,如何選擇最近幾年,業界不斷涌現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問題,實際歸根結底最重要的是了解這些產品的定位,並且了解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用於解決以下幾種問題1.少量數據存儲,高速讀寫訪問。此類產品通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。2.海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞集群信息,數據保證最終一致性,後者是一個中心化的方案設計,通過類似一個分布式鎖服務來保證強一致性,數據寫入先寫內存和redo log,然後定期compat歸並到磁碟上,將隨機寫優化為順序寫,提高寫入性能。4.Schema free,auto-sharding等。比如目前常見的一些文檔資料庫都是支持schema-free的,直接存儲json格式數據,並且支持auto-sharding等功能,比如mongodb。面對這些不同類型的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。Redis適用場景,如何正確的使用前面已經分析過,Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:1 Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。2 Redis支持數據的備份,即master-slave模式的數據備份。3 Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。拋開這些,可以深入到Redis內部構造去觀察更加本質的區別,理解Redis的設計。在Redis中,並不是所有的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。Redis只會緩存所有的 key的信息,如果Redis發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據「swappability = age*log(size_in_memory)」計 算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在內存中清除。這種特性使得Redis可以 保持超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的key,畢竟這些數據是不會進行swap操作的。同時由於Redis將內存 中的數據swap到磁碟中的時候,提供服務的主線程和進行swap操作的子線程會共享這部分內存,所以如果更新需要swap的數據,Redis將阻塞這個 操作,直到子線程完成swap操作後才可以進行修改。使用Redis特有內存模型前後的情況對比:VM off: 300k keys, 4096 bytes values: 1.3G usedVM on: 300k keys, 4096 bytes values: 73M usedVM off: 1 million keys, 256 bytes values: 430.12M usedVM on: 1 million keys, 256 bytes values: 160.09M usedVM on: 1 million keys, values as large as you want, still: 160.09M used當 從Redis中讀取數據的時候,如果讀取的key對應的value不在內存中,那麼Redis就需要從swap文件中載入相應數據,然後再返回給請求方。 這里就存在一個I/O線程池的問題。在默認的情況下,Redis會出現阻塞,即完成所有的swap文件載入後才會相應。這種策略在客戶端的數量較小,進行 批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程序中,這顯然是無法滿足大並發的情況的。所以Redis運行我們設置I/O線程 池的大小,對需要從swap文件中載入相應數據的讀取請求進行並發操作,減少阻塞的時間。如果希望在海量數據的環境中使用好Redis,我相信理解Redis的內存設計和阻塞的情況是不可缺少的。補充的知識點:memcached和redis的比較1 網路IO模型Memcached是多線程,非阻塞IO復用的網路模型,分為監聽主線程和worker子線程,監聽線程監聽網路連接,接受請求後,將連接描述字pipe 傳遞給worker線程,進行讀寫IO, 網路層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全局變數加鎖,進行計數等工作,帶來了性能損耗。(Memcached網路IO模型)Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。2.內存管理方面Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內存池的方式可以省去申請/釋放內存的開銷,並且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在內存仍然有很大空間時,新的數據也可能會被剔除,原因可以參考Timyang的文章:/memcached/)。Memcached的客戶端軟體實現非常多,包括C/C++, PHP, Java, python, Ruby, Perl, Erlang, Lua等。當前Memcached使用廣泛,除了LiveJournal以外還有Wikipedia、Flickr、Twitter、Youtube和WordPress等。在Window系統下,Memcached的安裝非常方便,只需從以上給出的地址下載可執行軟體然後運行memcached.exe –d install即可完成安裝。在Linux等系統下,我們首先需要安裝libevent,然後從獲取源碼,make && make install即可。默認情況下,Memcached的伺服器啟動程序會安裝到/usr/local/bin目錄下。在啟動Memcached時,我們可以為其配置不同的啟動參數。1.1 Memcache配置Memcached伺服器在啟動時需要對關鍵的參數進行配置,下面我們就看一看Memcached在啟動時需要設定哪些關鍵參數以及這些參數的作用。1)-p Memcached的TCP監聽埠,預設配置為11211;2)-U Memcached的UDP監聽埠,預設配置為11211,為0時表示關閉UDP監聽;3)-s Memcached監聽的UNIX套接字路徑;4)-a 訪問UNIX套接字的八進制掩碼,預設配置為0700;5)-l 監聽的伺服器IP地址,默認為所有網卡;6)-d 為Memcached伺服器啟動守護進程;7)-r 最大core文件大小;8)-u 運行Memcached的用戶,如果當前為root的話需要使用此參數指定用戶;9)-m 分配給Memcached使用的內存數量,單位是MB;10)-M 指示Memcached在內存用光的時候返回錯誤而不是使用LRU演算法移除數據記錄;11)-c 最大並發連數,預設配置為1024;12)-v –vv –vvv 設定伺服器端列印的消息的詳細程度,其中-v僅列印錯誤和警告信息,-vv在-v的基礎上還會列印客戶端的命令和相應,-vvv在-vv的基礎上還會列印內存狀態轉換信息;13)-f 用於設置chunk大小的遞增因子;14)-n 最小的chunk大小,預設配置為48個位元組;15)-t Memcached伺服器使用的線程數,預設配置為4個;16)-L 嘗試使用大內存頁;17)-R 每個事件的最大請求數,預設配置為20個;18)-C 禁用CAS,CAS模式會帶來8個位元組的冗餘;2. Redis簡介Redis是一個開源的key-value存儲系統。與Memcached類似,Redis將大部分數據存儲在內存中,支持的數據類型包括:字元串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操作。Redis使用C語言開發,在大多數像Linux、BSD和Solaris等POSIX系統上無需任何外部依賴就可以使用。Redis支持的客戶端語言也非常豐富,常用的計算機語言如C、C#、C++、Object-C、PHP、Python、Java、Perl、Lua、Erlang等均有可用的客戶端來訪問Redis伺服器。當前Redis的應用已經非常廣泛,國內像新浪、淘寶,國外像Flickr、Github等均在使用Redis的緩存服務。Redis的安裝非常方便,只需從bin目錄下。在啟動Redis伺服器時,我們需要為其指定一個配置文件,預設情況下配置文件在Redis的源碼目錄下,文件名為redis.conf。php面試題 memcache和redis的區別

『陸』 PHP如何做分布式鎖

PHP其實沒有這個需求,所以答案是,不能。 PHP作為一個模板語言,首要任務是輸出HTML以及處理一些web方面的工作。 如果你的本意是想用腳本語言來做分布式運算,你可以試試erlang,這門語言專門為這個領域做了大量優化。

『柒』 分布式系統為什麼要同步,同步所需要的構件有哪些

在Zookeeper的官 網上有這么一句話:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing group services. 這大概描述了Zookeeper主要可以干哪些事情:配置管理,名字服務,提供分布式同步以及集群管理。那這些服務又到底是什麼呢?我們為什麼需要這樣的服務?我們又為什麼要使用Zookeeper來實現呢,使用Zookeeper有什麼優勢?接下來我會挨個介紹這些到底是什麼,以及有哪些開源系統中使用了。 配置管理 在我們的應用中除了代碼外,還有一些就是各種配置。比如資料庫連接等。一般我們都是使用配置文件的方式,在代碼中引入這些配置文件。但是當我們只有一種配置,只有一台伺服器,並且不經常修改的時候,使用配置文件是一個很好的做法,但是如果我們配置非常多,有很多伺服器都需要這個配置,而且還可能是動態的話使用配置文件就不是個好主意了。這個時候往往需要尋找一種集中管理配置的方法,我們在這個集中的地方修改了配置,所有對這個配置感興趣的都可以獲得變更。比如我們可以把配置放在資料庫里,然後所有需要配置的服務都去這個資料庫讀取配置。但是,因為很多服務的正常運行都非常依賴這個配置,所以需要這個集中提供配置服務的服務具備很高的可靠性。一般我們可以用一個集群來提供這個配置服務,但是用集群提升可靠性,那如何保證配置在集群中的一致性呢? 這個時候就需要使用一種實現了一致性協議的服務了。Zookeeper就是這種服務,它使用Zab這種一致性協議來提供一致性。現在有很多開源項目使用Zookeeper來維護配置,比如在HBase中,客戶端就是連接一個Zookeeper,獲得必要的HBase集群的配置信息,然後才可以進一步操作。還有在開源的消息隊列Kafka中,也使用Zookeeper來維護broker的信息。在Alibaba開源的SOA框架Dubbo中也廣泛的使用Zookeeper管理一些配置來實現服務治理。 名字服務 名字服務這個就很好理解了。比如為了通過網路訪問一個系統,我們得知道對方的IP地址,但是IP地址對人非常不友好,這個時候我們就需要使用域名來訪問。但是計算機是不能是別域名的。怎麼辦呢?如果我們每台機器里都備有一份域名到IP地址的映射,這個倒是能解決一部分問題,但是如果域名對應的IP發生變化了又該怎麼辦呢?於是我們有了DNS這個東西。我們只需要訪問一個大家熟知的(known)的點,它就會告訴你這個域名對應的IP是什麼。在我們的應用中也會存在很多這類問題,特別是在我們的服務特別多的時候,如果我們在本地保存服務的地址的時候將非常不方便,但是如果我們只需要訪問一個大家都熟知的訪問點,這里提供統一的入口,那麼維護起來將方便得多了。 分布式鎖 其實在第一篇文章中已經介紹了Zookeeper是一個分布式協調服務。這樣我們就可以利用Zookeeper來協調多個分布式進程之間的活動。比如在一個分布式環境中,為了提高可靠性,我們的集群的每台伺服器上都部署著同樣的服務。但是,一件事情如果集群中的每個伺服器都進行的話,那相互之間就要協調,編程起來將非常復雜。而如果我們只讓一個服務進行操作,那又存在單點。通常還有一種做法就是使用分布式鎖,在某個時刻只讓一個服務去幹活,當這台服務出問題的時候鎖釋放,立即fail over到另外的服務。這在很多分布式系統中都是這么做,這種設計有一個更好聽的名字叫Leader Election(leader選舉)。比如HBase的Master就是採用這種機制。但要注意的是分布式鎖跟同一個進程的鎖還是有區別的,所以使用的時候要比同一個進程里的鎖更謹慎的使用。 集群管理 在分布式的集群中,經常會由於各種原因,比如硬體故障,軟體故障,網路問題,有些節點會進進出出。有新的節點加入進來,也有老的節點退出集群。這個時候,集群中其他機器需要感知到這種變化,然後根據這種變化做出對應的決策。比如我們是一個分布式存儲系統,有一個中央控制節點負責存儲的分配,當有新的存儲進來的時候我們要根據現在集群目前的狀態來分配存儲節點。這個時候我們就需要動態感知到集群目前的狀態。還有,比如一個分布式的SOA架構中,服務是一個集群提供的,當消費者訪問某個服務時,就需要採用某種機制發現現在有哪些節點可以提供該服務(這也稱之為服務發現,比如Alibaba開源的SOA框架Dubbo就採用了Zookeeper作為服務發現的底層機制)。還有開源的Kafka隊列就採用了Zookeeper作為Cosnumer的上下線管理。 後記 在這篇文章中,列出了一些Zookeeper可以提供的服務,並給出了一些開源系統裡面的實例。後面我們從Zookeeper的安裝配置開始,並用示例進一步介紹Zookeeper如何使用。 (轉載)

『捌』 php面試題 memcache和redis的區別

Redis與Memcached的區別

傳統MySQL+ Memcached架構遇到的問題

實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:

1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發時間。

2.Memcached與MySQL資料庫數據一致性問題。

3.Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。

4.跨機房cache同步問題。

眾多NoSQL百花齊放,如何選擇

最近幾年,業界不斷涌現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的
問題,實際歸根結底最重要的是了解這些產品的定位,並且了解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用於解
決以下幾種問題

1.少量數據存儲,高速讀寫訪問。此類產品通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。

2.海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。

3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞集群信息,數據保證最終一致性,後者是一個中心化的方案設計,通過類似一個分布式鎖服務來保證強一致性,數據寫入先寫內存和redo log,然後定期compat歸並到磁碟上,將隨機寫優化為順序寫,提高寫入性能。

4.Schema free,auto-sharding等。比如目前常見的一些文檔資料庫都是支持schema-free的,直接存儲json格式數據,並且支持auto-sharding等功能,比如mongodb。

面對這些不同類型的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。

Redis適用場景,如何正確的使用

前面已經分析過,Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-
backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用
Memcached,何時使用Redis呢?

如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:

1 Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

2 Redis支持數據的備份,即master-slave模式的數據備份。

3 Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。

拋開這些,可以深入到Redis內部構造去觀察更加本質的區別,理解Redis的設計。


Redis中,並不是所有的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。Redis只會緩存所有的
key的信息,如果Redis發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據「swappability =
age*log(size_in_memory)」計
算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在內存中清除。這種特性使得Redis可以

保持超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的key,畢竟這些數據是不會進行swap操作的。同時由於Redis將內存

中的數據swap到磁碟中的時候,提供服務的主線程和進行swap操作的子線程會共享這部分內存,所以如果更新需要swap的數據,Redis將阻塞這個
操作,直到子線程完成swap操作後才可以進行修改。

使用Redis特有內存模型前後的情況對比:
VM off: 300k keys, 4096 bytes values: 1.3G used
VM on: 300k keys, 4096 bytes values: 73M used
VM off: 1 million keys, 256 bytes values: 430.12M used
VM on: 1 million keys, 256 bytes values: 160.09M used
VM on: 1 million keys, values as large as you want, still: 160.09M used



從Redis中讀取數據的時候,如果讀取的key對應的value不在內存中,那麼Redis就需要從swap文件中載入相應數據,然後再返回給請求方。

這里就存在一個I/O線程池的問題。在默認的情況下,Redis會出現阻塞,即完成所有的swap文件載入後才會相應。這種策略在客戶端的數量較小,進行

批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程序中,這顯然是無法滿足大並發的情況的。所以Redis運行我們設置I/O線程
池的大小,對需要從swap文件中載入相應數據的讀取請求進行並發操作,減少阻塞的時間。

如果希望在海量數據的環境中使用好Redis,我相信理解Redis的內存設計和阻塞的情況是不可缺少的。

補充的知識點:

memcached和redis的比較

1 網路IO模型

Memcached是多線程,非阻塞IO復用的網路模型,分為監聽主線程和worker子線程,監聽線程監聽網路連接,接受請求後,將連接描述
字pipe 傳遞給worker線程,進行讀寫IO, 網路層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache
coherency和鎖的問題,比如,Memcached最常用的stats
命令,實際Memcached所有操作都要對這個全局變數加鎖,進行計數等工作,帶來了性能損耗。

(Memcached網路IO模型)

Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,
對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實
際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。

2.內存管理方面

Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內
存池的方式可以省去申請/釋放內存的開銷,並且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在內存仍然有很大空間時,新的數據也可
能會被剔除,原因可以參考Timyang的文章:http://timyang.net/data/Memcached-lru-evictions/

Redis使用現場申請內存的方式來存儲數據,並且很少使用free-list等方式來優化內存分配,會在一定程度上存在內存碎片,Redis
跟據存儲命令參數,會把帶過期時間的數據單獨存放在一起,並把它們稱為臨時數據,非臨時數據是永遠不會被剔除的,即便物理內存不夠,導致swap也不會剔
除任何非臨時數據(但會嘗試剔除部分臨時數據),這點上Redis更適合作為存儲而不是cache。

3.數據一致性問題

Memcached提供了cas命令,可以保證多個並發訪問操作同一份數據的一致性問題。 Redis沒有提供cas 命令,並不能保證這點,不過Redis提供了事務的功能,可以保證一串 命令的原子性,中間不會被任何操作打斷。

4.存儲方式及其它方面

Memcached基本只支持簡單的key-value存儲,不支持枚舉,不支持持久化和復制等功能

Redis除key/value之外,還支持list,set,sorted set,hash等眾多數據結構,提供了KEYS

進行枚舉操作,但不能在線上使用,如果需要枚舉線上數據,Redis提供了工具可以直接掃描其mp文件,枚舉出所有數據,Redis還同時提供了持久化和復制等功能。

5.關於不同語言的客戶端支持

在不同語言的客戶端方面,Memcached和Redis都有豐富的第三方客戶端可供選擇,不過因為Memcached發展的時間更久一些,目
前看在客戶端支持方面,Memcached的很多客戶端更加成熟穩定,而Redis由於其協議本身就比Memcached復雜,加上作者不斷增加新的功能
等,對應第三方客戶端跟進速度可能會趕不上,有時可能需要自己在第三方客戶端基礎上做些修改才能更好的使用。

根據以上比較不難看出,當我們不希望數據被踢出,或者需要除key/value之外的更多數據類型時,或者需要落地功能時,使用Redis比使用Memcached更合適。

關於Redis的一些周邊功能

Redis除了作為存儲之外還提供了一些其它方面的功能,比如聚合計算、pubsub、scripting等,對於此類功能需要了解其實現原
理,清楚地了解到它的局限性後,才能正確的使用,比如pubsub功能,這個實際是沒有任何持久化支持的,消費方連接閃斷或重連之間過來的消息是會全部丟
失的,又比如聚合計算和scripting等功能受Redis單線程模型所限,是不可能達到很高的吞吐量的,需要謹慎使用。

總的來說Redis作者是一位非常勤奮的開發者,可以經常看到作者在嘗試著各種不同的新鮮想法和思路,針對這些方面的功能就要求我們需要深入了解後再使用。

總結:

1.Redis使用最佳方式是全部數據in-memory。

2.Redis更多場景是作為Memcached的替代者來使用。

3.當需要除key/value之外的更多數據類型支持時,使用Redis更合適。

4.當存儲的數據不能被剔除時,使用Redis更合適。

談談Memcached與Redis(一)

1. Memcached簡介

Memcached是以LiveJurnal旗下Danga Interactive公司的Bard
Fitzpatric為首開發的高性能分布式內存緩存伺服器。其本質上就是一個內存key-value資料庫,但是不支持數據的持久化,伺服器關閉之後數
據全部丟失。Memcached使用C語言開發,在大多數像Linux、BSD和Solaris等POSIX系統上,只要安裝了libevent即可使
用。在Windows下,它也有一個可用的非官方版本(http://code.jellycan.com/memcached/)。Memcached
的客戶端軟體實現非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang,
Lua等。當前Memcached使用廣泛,除了LiveJournal以外還有Wikipedia、Flickr、Twitter、Youtube和
WordPress等。

在Window系統下,Memcached的安裝非常方便,只需從以上給出的地址下載可執行軟體然後運行memcached.exe –d
install即可完成安裝。在Linux等系統下,我們首先需要安裝libevent,然後從獲取源碼,make && make
install即可。默認情況下,Memcached的伺服器啟動程序會安裝到/usr/local/bin目錄下。在啟動Memcached時,我們可
以為其配置不同的啟動參數。

1.1 Memcache配置

Memcached伺服器在啟動時需要對關鍵的參數進行配置,下面我們就看一看Memcached在啟動時需要設定哪些關鍵參數以及這些參數的作用。

1)-p <num> Memcached的TCP監聽埠,預設配置為11211;

2)-U <num> Memcached的UDP監聽埠,預設配置為11211,為0時表示關閉UDP監聽;

3)-s <file> Memcached監聽的UNIX套接字路徑;

4)-a <mask> 訪問UNIX套接字的八進制掩碼,預設配置為0700;

5)-l <addr> 監聽的伺服器IP地址,默認為所有網卡;

6)-d 為Memcached伺服器啟動守護進程;

7)-r 最大core文件大小;

8)-u <username> 運行Memcached的用戶,如果當前為root的話需要使用此參數指定用戶;

9)-m <num> 分配給Memcached使用的內存數量,單位是MB;

10)-M 指示Memcached在內存用光的時候返回錯誤而不是使用LRU演算法移除數據記錄;

11)-c <num> 最大並發連數,預設配置為1024;

12)-v –vv –vvv 設定伺服器端列印的消息的詳細程度,其中-v僅列印錯誤和警告信息,-vv在-v的基礎上還會列印客戶端的命令和相應,-vvv在-vv的基礎上還會列印內存狀態轉換信息;

13)-f <factor> 用於設置chunk大小的遞增因子;

14)-n <bytes> 最小的chunk大小,預設配置為48個位元組;

15)-t <num> Memcached伺服器使用的線程數,預設配置為4個;

16)-L 嘗試使用大內存頁;

17)-R 每個事件的最大請求數,預設配置為20個;

18)-C 禁用CAS,CAS模式會帶來8個位元組的冗餘;

2. Redis簡介

Redis是一個開源的key-value存儲系統。與Memcached類似,Redis將大部分數據存儲在內存中,支持的數據類型包括:字
符串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操作。Redis使用C語言開發,在大多數像Linux、BSD和Solaris等
POSIX系統上無需任何外部依賴就可以使用。Redis支持的客戶端語言也非常豐富,常用的計算機語言如C、C#、C++、Object-C、PHP、
Python、Java、Perl、Lua、Erlang等均有可用的客戶端來訪問Redis伺服器。當前Redis的應用已經非常廣泛,國內像新浪、淘
寶,國外像Flickr、Github等均在使用Redis的緩存服務。

Redis的安裝非常方便,只需從http://redis.io/download獲取源碼,然後make && make

install即可。默認情況下,Redis的伺服器啟動程序和客戶端程序會安裝到/usr/local/bin目錄下。在啟動Redis伺服器時,我們
需要為其指定一個配置文件,預設情況下配置文件在Redis的源碼目錄下,文件名為redis.conf。

『玖』 分布式鎖用zookeeper還是redis好

1. 不能重入

2. 沒有本地鎖,並發性能會比較差,不使用用在並發爭鎖較多的場景下。本地鎖非自旋
3. 未考慮鎖等待排序. 這個是redis很難實現的.

可以通過redis的list實現,但缺點是list下每個子節點無超時時間. redis也無法進行模糊查詢 key*.
故還是通過zookeeper實現比較好. 但zookeeper 會遇到性能瓶頸,我們線下的就出現了,經常注冊不上的情況.
zookeeper原理是臨時節點

『拾』 零基礎應該選擇學習 java、php、前端 還是 python

這三門當中,首推Java。真的,Python當然是好,但是對於一個新入門的人,最重要的是先找到工作不是嗎?而找工作的話,Java無疑是最容易的。相比較PHP與Python而言,Java程序員的崗位需求要大的很多,對於跨行業的人而言,最困難的其實是第一步,那就是如何進入這個行業。如果你連進都進不來,第一份工作遲遲無法開始,那麼好好努力,補上數據結構,設計模式,演算法設計這些差距就根本無從說起,不是嗎?
接著,我來談談具體的規劃。
1.
了解Java的運行環境。搞清楚path和classpath是干什麼的,怎麼在命令行進行編譯,執行。知道IDE的各個按鈕後面真正發生了什麼事情。
2.
掌握Java的語法。搞清楚包,介面,類,繼承這些基本概念。掌握多態,overwrite,死背下IO的介面,包括InputStream/OutputStream和Writer/Reader,死背下網路編程和GUI編程的介面,背JDBC介面。這一步,推薦的書是《
瘋狂Java講義》。
3.
掌握多線程編程。弄明白ConcurrencyHashMap是怎麼實現的,搞清楚synchronized是怎麼回事,弄明白為什麼要有Runnable介面。
在第二步和第三步掌握到80%的時候,你就可以考慮找工作了。
4. 在工作中體會一下設計模式。推薦《輕量級Java
EE企業應用實戰》這本書。看完裡面的Decorator,IO介面你再也不會去死記硬背了。用的時候,根據Adaptor和Decorator的命名規則,自己臨時推都推得出來。
5. 惡補數據結構。 搞清楚 LinkedList和
ArrayList的實現機制,了解它們的每一個介面的時間復雜度。同樣的還有其他容器,Map啊,Set啊,都是一樣的。棧,隊列,二叉樹,圖貫穿編程始終,如果這一步你邁不過去,那就只能在低階程序員里打轉。
6.
如果有可能,最好對一些演算法設計也有所涉獵。比如動態規則的思路,貪心演算法,諸如KMP這種奇妙的演算法等。這一步沒有數據結構那麼重要,學得好當然好,學不好也不用太挫敗。
到了這一步,你和科班程序員之間的差距就不大了。可以在工作中獨立承擔開發任務了。
瘋狂軟體教育中心專注於Java培訓,瘋狂軟體Java培訓可以有效的幫助你提升相關技能。名師講解Java設計和編程、Web前端開發、JavaEE進階、大數據核心知識等,讓你在5個半月內快速獲得理論和實踐的雙重提升。
7.
進階,這時候就可以有自己的思考了。Java發展到現在,被用在各種各樣的情景之中,說它是應用最廣泛的編程語言並不過分。你在打好基礎以後,就可以考慮應該向哪個方向發展了。比如服務端的架構,最好能學習一下JavaEE。JEE一直以來,都是讓人覺得門檻太高。這個其實可以從Spring入手,搞清楚反射,控制反轉,依賴注射都是什麼鬼(這些神叨叨的名詞其實都是為了解決Java本身不夠動態這個缺陷而出現的,這里不展開,我只想提醒的是,這些概念沒有什麼大不了的東西,不要被愛裝逼的傢伙嚇住了)。還有消息這個東西,還有ORM這個東西,都去搞搞清楚。想一下它們要解決什麼問題,再猜一下他們是怎麼實現的。我面試的時候發現,其實大多數優秀的開發者,即使以前沒思考過這個問題,讓他現場設計一下Hibernate,都能設計得差不多。這說明,這些框架性的東沒有什麼大不了的。有了基礎,你也能設計出來。關鍵是要去動腦筋想。以上是以服務端開發舉例,那麼對於客戶端,你就去思考事件響應機制是如何工作的(這個我不熟悉,就不再多說了)。還可以深入研究一下JVM的源代碼,以及其實現機制,了解一下垃圾回收演算法等等。
到了這一步,你就可以應聘Java高級開發了。如果運氣好,年薪30萬是有可能的。保底也要20萬了。
8.
架構。到了這一步,你就算是登堂入室,真正邁入高級開發人員了。這一步,你要思考更多的東西,比如,如何處理高並發,如何應對分布式系統,如何提供更健壯的數據服務。到了這一步,那就沒有什麼可以參考的,現成的東西了。全靠自己的悟性了。那最後能達到什麼高度,就不是我這個層次能點評的了。
編程的世界永遠向所有熱愛編程的人開放,這是一個自由,平等,共享的世界,我始終是這樣堅信的。

閱讀全文

與php分布式鎖相關的資料

熱點內容
加密媒體怎麼輸密碼 瀏覽:161
方舟如何刪除伺服器數據 瀏覽:600
用閱讀app怎麼看18 瀏覽:689
gn文件編譯 瀏覽:783
酷閃加密系統 瀏覽:820
區塊鏈數據加密 瀏覽:389
3d命令集 瀏覽:289
單片機的智能產品工廠里有 瀏覽:300
事業單位程序員有必要去嗎 瀏覽:583
人工智慧訓練小鳥python 瀏覽:132
怎樣把兩個pdf合並成一個 瀏覽:681
什麼app帶仿製圖章 瀏覽:420
單片機CJNE什麼意思 瀏覽:569
廊坊伺服器是什麼 瀏覽:763
客戶解壓要打欠條還是收據 瀏覽:774
通過app組件啟動有什麼壞處 瀏覽:775
不屬於國產密碼演算法 瀏覽:861
單片機LED顯示字型檔 瀏覽:353
日本文件夾品牌十大名牌 瀏覽:397
靜脈壓縮襪和打底褲的區別 瀏覽:345