最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python Redis如何執(zhí)行Lua腳本

 更新時(shí)間:2024年02月09日 08:38:07   作者:XerCis CSDN認(rèn)證博客專家  
這篇文章主要介紹了Python Redis如何執(zhí)行Lua腳本問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

問題描述

Python Redis 執(zhí)行 Lua 腳本可實(shí)現(xiàn)原子性

官方文檔表示,Redis 使用相同的 Lua 解釋器來運(yùn)行所有命令,Redis 保證腳本以原子方式執(zhí)行:

  • 在執(zhí)行腳本時(shí)不會(huì)執(zhí)行其他腳本或 Redis 命令。
  • 這種語(yǔ)義類似于 MULTI / EXEC 的語(yǔ)義,從所有其他客戶的角度來看,腳本的效果要么仍然不可見,要么已經(jīng)完成。

解決方案

安裝

pip install redis

代碼

from redis import Redis

redis = Redis()
script = """
redis.call('SETEX', 'key', 100, 'value')
"""
redis.register_script(script)()  # 執(zhí)行腳本

效果

傳遞參數(shù)

Script 類調(diào)用函數(shù)原型:

def __call__(self, keys=[], args=[], client=None)
from redis import Redis

redis = Redis()
script = """
local key = KEYS[1]
local seconds = ARGV[1]
local value = ARGV[2]
redis.call('SETEX', key, seconds, value)
"""
cmd = redis.register_script(script)
cmd(keys=['key'], args=[100, 'value'])  # 執(zhí)行腳本

效果同上

分布式鎖

1.加鎖并設(shè)過期時(shí)間 SET lock_resource_name $uuid NX PX $expire_time,同時(shí)啟動(dòng)守護(hù)線程為快要過期單還沒執(zhí)行完畢的客戶端的鎖續(xù)命;

2.客戶端執(zhí)行業(yè)務(wù)邏輯操作共享資源;

3.通過 Lua 腳本釋放鎖,先 get 判斷鎖是否是自己加的,再執(zhí)行 DEL。

判斷+刪除

import time
from uuid import uuid4

from redis import Redis

redis = Redis()

# 判斷是否自己創(chuàng)建的鎖,是的話則釋放
script = """
if redis.call('GET', KEYS[1]) == ARGV[1] then
    return redis.call('DEL', KEYS[1])
else
    return 0
end
"""


def do_something():
    name = 'lock'  # 鎖名,此處故意寫死讓別的進(jìn)程進(jìn)來占用
    uuid = str(uuid4())
    # 上鎖
    if redis.set(name=name, value=uuid, nx=True, ex=25):  # 鎖不存在才能上鎖成功,過期時(shí)間應(yīng)為業(yè)務(wù)時(shí)間的五倍,此處故意寫小,模擬過期釋放
        print('上鎖')
        try:
            print('處理業(yè)務(wù)', uuid)
            time.sleep(10)
        except Exception as e:
            print(e)
        finally:
            # 釋放鎖
            cmd = redis.register_script(script)
            res = cmd(keys=[name], args=[uuid])  # 執(zhí)行腳本
            if res:
                print('鎖已釋放')
            else:
                print('不是自己的鎖')
    else:
        print('鎖已存在')


if __name__ == '__main__':
    do_something()

模擬過程:

  • 運(yùn)行程序1
  • 手動(dòng)迅速刪掉這個(gè)鎖
  • 運(yùn)行程序2

效果:

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • 基于Redis實(shí)現(xiàn)基本搶紅包算法詳解

    基于Redis實(shí)現(xiàn)基本搶紅包算法詳解

    [key, value]的緩存數(shù)據(jù)庫(kù), Redis官方性能描述非常高, 所以面對(duì)高并發(fā)場(chǎng)景, 使用Redis來克服高并發(fā)壓力是一個(gè)不錯(cuò)的手段, 本文主要基于Redis來實(shí)現(xiàn)基本的搶紅包系統(tǒng)設(shè)計(jì),感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • 淺談Redis中bind的坑

    淺談Redis中bind的坑

    本文主要介紹了淺談Redis中bind的坑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Redis中的單線程多線程解讀

    Redis中的單線程多線程解讀

    這篇文章主要介紹了Redis中的單線程多線程使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-08-08
  • Redis之如何實(shí)現(xiàn)用戶關(guān)注

    Redis之如何實(shí)現(xiàn)用戶關(guān)注

    這篇文章主要介紹了Redis之如何實(shí)現(xiàn)用戶關(guān)注問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • Redis bitmap 實(shí)現(xiàn)簽到案例(最新推薦)

    Redis bitmap 實(shí)現(xiàn)簽到案例(最新推薦)

    這篇文章主要介紹了Redis bitmap 實(shí)現(xiàn)簽到案例,通過設(shè)計(jì)簽到功能對(duì)應(yīng)的數(shù)據(jù)庫(kù)表,結(jié)合sql語(yǔ)句給大家講解的非常詳細(xì),具體示例代碼跟隨小編一起看看吧
    2024-07-07
  • redis延時(shí)隊(duì)列zset實(shí)現(xiàn)的示例

    redis延時(shí)隊(duì)列zset實(shí)現(xiàn)的示例

    延時(shí)隊(duì)列是一種常用的設(shè)計(jì)模式,用于處理那些需要在未來某個(gè)時(shí)間點(diǎn)執(zhí)行的任務(wù),本文主要介紹了redis延時(shí)隊(duì)列zset實(shí)現(xiàn)的示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08
  • 最新評(píng)論

    湟中县| 宁国市| 兴义市| 桐城市| 桐梓县| 开江县| 合川市| 洛隆县| 陵水| 新河县| 沁水县| 曲沃县| 搜索| 黄陵县| 澄城县| 吉首市| 滨海县| 交口县| 织金县| 丹阳市| 台南县| 桃江县| 卓尼县| 荔浦县| 精河县| 海口市| 敦煌市| 双峰县| 府谷县| 宽甸| 迭部县| 珲春市| 福泉市| 德安县| 获嘉县| 甘洛县| 屯门区| 灌云县| 青浦区| 九江县| 新余市|