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

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

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

問題描述

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

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

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

解決方案

安裝

pip install redis

代碼

from redis import Redis

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

效果

傳遞參數

Script 類調用函數原型:

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.加鎖并設過期時間 SET lock_resource_name $uuid NX PX $expire_time,同時啟動守護線程為快要過期單還沒執(zhí)行完畢的客戶端的鎖續(xù)命;

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

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'  # 鎖名,此處故意寫死讓別的進程進來占用
    uuid = str(uuid4())
    # 上鎖
    if redis.set(name=name, value=uuid, nx=True, ex=25):  # 鎖不存在才能上鎖成功,過期時間應為業(yè)務時間的五倍,此處故意寫小,模擬過期釋放
        print('上鎖')
        try:
            print('處理業(yè)務', 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()

模擬過程:

  • 運行程序1
  • 手動迅速刪掉這個鎖
  • 運行程序2

效果:

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。 

相關文章

  • K8S redis 部署的項目實踐

    K8S redis 部署的項目實踐

    本文主要介紹了K8S redis 部署的項目實踐,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-05-05
  • Redis大量數據插入過程

    Redis大量數據插入過程

    本文介紹Redis處理大數據插入的三種高效方法:redis-cli管道模式、Jedis pipelined()方法及RedisTemplate批量保存,旨在減少通信開銷并提升吞吐量
    2025-08-08
  • 詳解Redis終端操作和Redis-plus-plus接口使用教程

    詳解Redis終端操作和Redis-plus-plus接口使用教程

    這篇文章主要介紹了詳解Redis終端操作和Redis-plus-plus接口使用教程,本文結合實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2026-03-03
  • Redis慢查詢日志及慢查詢分析詳解

    Redis慢查詢日志及慢查詢分析詳解

    這篇文章主要為大家介紹了Redis慢查詢日志及慢查詢分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 基于Redis實現基本搶紅包算法詳解

    基于Redis實現基本搶紅包算法詳解

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

    淺談Redis中bind的坑

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

    Redis中的單線程多線程解讀

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

    Redis之如何實現用戶關注

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

    Redis bitmap 實現簽到案例(最新推薦)

    這篇文章主要介紹了Redis bitmap 實現簽到案例,通過設計簽到功能對應的數據庫表,結合sql語句給大家講解的非常詳細,具體示例代碼跟隨小編一起看看吧
    2024-07-07
  • redis延時隊列zset實現的示例

    redis延時隊列zset實現的示例

    延時隊列是一種常用的設計模式,用于處理那些需要在未來某個時間點執(zhí)行的任務,本文主要介紹了redis延時隊列zset實現的示例,具有一定的參考價值,感興趣的可以了解一下
    2024-08-08

最新評論

永泰县| 根河市| 乌兰察布市| 泰宁县| 仪陇县| 和田市| 波密县| 乃东县| 比如县| 东丰县| 黑山县| 朔州市| 长白| 静乐县| 汾阳市| 青铜峡市| 峨山| 永登县| 高陵县| 新乡县| 柘荣县| 大同市| 九龙坡区| 婺源县| 清水县| 巧家县| 南平市| 措美县| 林口县| 水城县| 嘉善县| 眉山市| 沿河| 南丰县| 浮山县| 江油市| 白城市| 吉首市| 砚山县| 凉城县| 浪卡子县|