国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

利用SQL實現(xiàn)簡單的分布式鎖_PHP教程

php中文網(wǎng)
發(fā)布: 2016-07-12 08:55:07
原創(chuàng)
1220人瀏覽過

利用sql實現(xiàn)簡單的分布式鎖

分布式鎖和普通鎖的主要區(qū)別在于參與主體跨不同節(jié)點,因此需要考慮到節(jié)點失效和網(wǎng)絡(luò)故障的問題。搞清楚問題要點,可以用各種不同的東西去實現(xiàn),比如redis,zookeeper等。但是其實用sql實現(xiàn)也是非常容易的,下面以postgresql為例進行說明。

1. 方法1:會話鎖

利用postgresql中特有的排他會話級別咨詢鎖。
pg_advisory_lock(key bigint)
pg_advisory_unlock(key bigint)
pg_try_advisory_lock(key bigint)

詳細參考: http://www.postgres.cn/docs/9.4/functions-admin.html#functions-advisory-locks-table

這種鎖是會話級的,在釋放鎖之前,鎖的獲得得者必須一直持有這個會話,也就是連接,否則鎖就會被釋放。
這個特性自然而然地解決了鎖的獲得者發(fā)生故障時鎖的釋放問題。
但是,對于需要長時間持有的鎖,它會產(chǎn)生長連接,而數(shù)據(jù)庫的連接是比較耗資源的,往大了配一般也就幾千個,這是需要注意的地方。
另外一個需要考慮的問題是,當(dāng)網(wǎng)絡(luò)或節(jié)點發(fā)生故障時連接的兩端未必能立刻感知到,因此tcp的keepalive是必須的,幸好postgresql的客戶端和服務(wù)端都支持這個設(shè)置。
下面是服務(wù)端的參數(shù):
tcp_keepalives_idle
tcp_keepalives_interval
tcp_keepalives_count

2. 方法2:期限鎖

鎖對象是持久的,為防止拿到鎖的客戶端奔潰導(dǎo)致鎖無法釋放,每個鎖都有一個過期期限。
在postgresql中可以按下面的方式實現(xiàn)

建表
  1. postgres=# create table distlock(id int primary key,expired_time interval,owner text,ts timestamptz);
  2. create table
  3. postgres=# insert into distlock(id) values(1);
  4. insert 0 1

加鎖和續(xù)期
  1. postgres=# update distlock set owner='node1',ts=now(),expired_time=interval '20 second' where id=1 and (owner='node1' or owner is null or now() > ts + expired_time);
  2. update 1
獲得鎖的客戶端如果要長時間持有鎖必須定期執(zhí)行相同的方法對鎖進行續(xù)租,否則會丟鎖。

此時,其它客戶端取鎖會失敗
  1. postgres=# update distlock set owner='node2',ts=now(),expired_time=interval '20 second' where id=1 and (owner='node2' or owner is null or now() > ts + expired_time);
  2. update 0

等鎖過期后取鎖成功
  1. postgres=# update distlock set owner='node2',ts=now(),expired_time=interval '20 second' where id=1 and (owner='node2' or owner is null or now() > ts + expired_time);
  2. update 1

釋放鎖
  1. postgres=# update distlock set owner=null,ts=now() where id=1 and owner='node2';
  2. update 1

3. 總結(jié)

可以看到用關(guān)系數(shù)據(jù)庫實現(xiàn)分布式鎖并不復(fù)雜。尤其上面基于表實現(xiàn)的鎖輔以靠譜的ha部署可以保障鎖信息的持久性和不丟失,但用表更新實現(xiàn)鎖畢竟比較重,不適合對鎖的性能要求非常高的場景。

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1117252.htmlTechArticle利用SQL實現(xiàn)簡單的分布式鎖 分布式鎖和普通鎖的主要區(qū)別在于參與主體跨不同節(jié)點,因此需要考慮到節(jié)點失效和網(wǎng)絡(luò)故障的問題。搞清楚問...
PHP速學(xué)教程(入門到精通)
PHP速學(xué)教程(入門到精通)

PHP怎么學(xué)習(xí)?PHP怎么入門?PHP在哪學(xué)?PHP怎么學(xué)才快?不用擔(dān)心,這里為大家提供了PHP速學(xué)教程(入門到精通),有需要的小伙伴保存下載就能學(xué)習(xí)啦!

下載
來源:php中文網(wǎng)
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔(dān)相應(yīng)法律責(zé)任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn
最新問題
開源免費商場系統(tǒng)廣告
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板
關(guān)于我們 免責(zé)申明 意見反饋 講師合作 廣告合作 最新更新
php中文網(wǎng):公益在線php培訓(xùn),幫助PHP學(xué)習(xí)者快速成長!
關(guān)注服務(wù)號 技術(shù)交流群
PHP中文網(wǎng)訂閱號
每天精選資源文章推送
PHP中文網(wǎng)APP
隨時隨地碎片化學(xué)習(xí)
PHP中文網(wǎng)抖音號
發(fā)現(xiàn)有趣的

Copyright 2014-2025 http://m.miracleart.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號