協(xié)程化redis分布式鎖實(shí)現(xiàn)

最近看<<redis實(shí)戰(zhàn)>> 里面有一個(gè)不錯(cuò)的redis分布式鎖的實(shí)現(xiàn),但是只是同步實(shí)現(xiàn)版本, 由于工作中用python的協(xié)程化框架硕并,故簡單改造下,代碼如下:

import math
import time
import uuid
import asyncio

import aioredis
from aioredis.errors import WatchVariableError


async def acquire_lock(conn, lockname, acquire_timeout=10, lock_timeout=10):
    identifier = str(uuid.uuid4())
    lockname = 'lock:' + lockname
    lock_timeout = int(math.ceil(lock_timeout))

    end = time.time() + acquire_timeout
    while time.time() < end:
        if await conn.set(
                lockname,
                identifier,
                expire=lock_timeout,
                exist=conn.SET_IF_NOT_EXIST):
            return identifier

        await asyncio.sleep(1)

    return False


async def release_lock(conn, lockname, identifier):
    lockname = 'lock:' + lockname

    while True:

        try:
            await conn.watch(lockname)
            if await conn.get(lockname) == identifier:
                pipe = conn.multi_exec()
                pipe.delete(lockname)
                await pipe.execute()
                return True

            await conn.unwatch()
            break

        except WatchVariableError:
            pass

    return False


async def main():
    redis_pool = await aioredis.create_redis_pool(
        ("127.0.0.1", 6379),
        db=14,
        password=None,
        encoding="utf-8")

    identifier = await acquire_lock(redis_pool, 'foo_bar')
    print(await acquire_lock(redis_pool, 'foo_bar'))
    await release_lock(redis_pool, 'foo_bar', identifier)


if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市棋傍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌难审,老刑警劉巖瘫拣,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異告喊,居然都是意外死亡麸拄,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門葱绒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來感帅,“玉大人,你說我怎么就攤上這事地淀∈颍” “怎么了?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵帮毁,是天一觀的道長实苞。 經(jīng)常有香客問我,道長烈疚,這世上最難降的妖魔是什么黔牵? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮爷肝,結(jié)果婚禮上猾浦,老公的妹妹穿的比我還像新娘。我一直安慰自己灯抛,他們只是感情好金赦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著对嚼,像睡著了一般夹抗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纵竖,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天漠烧,我揣著相機(jī)與錄音,去河邊找鬼靡砌。 笑死已脓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的通殃。 我是一名探鬼主播摆舟,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了恨诱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤骗炉,失蹤者是張志新(化名)和其女友劉穎照宝,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體句葵,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡厕鹃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乍丈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剂碴。...
    茶點(diǎn)故事閱讀 38,777評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖轻专,靈堂內(nèi)的尸體忽然破棺而出忆矛,到底是詐尸還是另有隱情,我是刑警寧澤请垛,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布催训,位于F島的核電站,受9級特大地震影響宗收,放射性物質(zhì)發(fā)生泄漏漫拭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一混稽、第九天 我趴在偏房一處隱蔽的房頂上張望采驻。 院中可真熱鬧,春花似錦匈勋、人聲如沸礼旅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽各淀。三九已至,卻和暖如春诡挂,著一層夾襖步出監(jiān)牢的瞬間碎浇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工璃俗, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奴璃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓城豁,卻偏偏與公主長得像苟穆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容