Python Redis如何执行Lua脚本

 更新时间:2024年02月09日 08:38:07   作者:XerCis CSDN认证博客专家  
这篇文章主要介绍了Python Redis如何执行Lua脚本问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

问题描述

Python Redis 执行 Lua 脚本可实现原子性

官方文档表示,Redis 使用相同的 Lua 解释器来运行所有命令,Redis 保证脚本以原子方式执行:

  • 在执行脚本时不会执行其他脚本或 Redis 命令。
  • 这种语义类似于 MULTI / EXEC 的语义,从所有其他客户的角度来看,脚本的效果要么仍然不可见,要么已经完成。

解决方案

安装

pip install redis

代码

from redis import Redis

redis = Redis()
script = """
redis.call('SETEX', 'key', 100, 'value')
"""
redis.register_script(script)()  # 执行脚本

效果

传递参数

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'])  # 执行脚本

效果同上

分布式锁

1.加锁并设过期时间 SET lock_resource_name $uuid NX PX $expire_time,同时启动守护线程为快要过期单还没执行完毕的客户端的锁续命;

2.客户端执行业务逻辑操作共享资源;

3.通过 Lua 脚本释放锁,先 get 判断锁是否是自己加的,再执行 DEL

判断+删除

import time
from uuid import uuid4

from redis import Redis

redis = Redis()

# 判断是否自己创建的锁,是的话则释放
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):  # 锁不存在才能上锁成功,过期时间应为业务时间的五倍,此处故意写小,模拟过期释放
        print('上锁')
        try:
            print('处理业务', uuid)
            time.sleep(10)
        except Exception as e:
            print(e)
        finally:
            # 释放锁
            cmd = redis.register_script(script)
            res = cmd(keys=[name], args=[uuid])  # 执行脚本
            if res:
                print('锁已释放')
            else:
                print('不是自己的锁')
    else:
        print('锁已存在')


if __name__ == '__main__':
    do_something()

模拟过程:

  • 运行程序1
  • 手动迅速删掉这个锁
  • 运行程序2

效果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持程序员之家。 

相关文章

  • Redis的使用模式之计数器模式实例

    Redis的使用模式之计数器模式实例

    这篇文章主要介绍了Redis的使用模式之计数器模式实例,本文讲解了汇总计数器、按时间汇总的计数器、速度控制、使用 Hash 数据类型维护大量计数器等内容,需要的朋友可以参考下
    2015-03-03
  • Redis分布式锁的7种实现

    Redis分布式锁的7种实现

    这篇文章主要介绍了Redis分布式锁的实现
    2022-04-04
  • k8s部署redis cluster集群的实现

    k8s部署redis cluster集群的实现

    在Kubernetes中部署Redis集群面临挑战,因为每个Redis实例都依赖于一个配置文件,该文件可以跟踪其他集群实例及其角色。需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Redis慢查询的具体使用

    Redis慢查询的具体使用

    慢查询顾名思义就是比较慢的查询,但是究竟是哪里慢呢?本文详细的介绍了Redis慢查询的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2023-06-06
  • redis分布式锁的8大坑总结梳理

    redis分布式锁的8大坑总结梳理

    这篇文章主要介绍了redis分布式锁的8大坑总结梳理,使用redis的分布式锁,我们首先想到的可能是setNx命令,文章围绕setNx命令展开详细的内容介绍,感兴趣的小伙伴可以参考一下
    2022-07-07
  • Redis分布式锁的正确实现方法总结

    Redis分布式锁的正确实现方法总结

    在本篇文章里小编给大家整理的是关于Redis分布式锁的正确实现方式介绍,有兴趣的朋友们可以学习下。
    2020-02-02
  • Redis教程(七):Key操作命令详解

    Redis教程(七):Key操作命令详解

    这篇文章主要介绍了Redis教程(七):Key操作命令详解,本文讲解了Key操作命令概述、相关命令列表、命令使用示例等内容,需要的朋友可以参考下
    2015-04-04
  • CentOS下Redis数据库的基本安装与配置教程

    CentOS下Redis数据库的基本安装与配置教程

    这篇文章主要介绍了CentOS下Redis数据库的基本安装与配置教程,Redis一般被用作基于内存的缓存式数据存储,要的朋友可以参考下
    2015-12-12
  • 彻底弄懂Redis的LRU淘汰策略

    彻底弄懂Redis的LRU淘汰策略

    本文主要介绍了LRU淘汰策略以及实现一个LRU算法,文章会结合图解循序渐进的讲解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • redis集群搭建过程(非常详细,适合新手)

    redis集群搭建过程(非常详细,适合新手)

    这篇文章主要介绍了redis集群搭建过程,Redis集群至少需要3个节点,因为投票容错机制要求超过半数节点认为某个节点挂了该节点才是挂了,所以2个节点无法构成集群,具体搭建过程跟随小编一起看看吧
    2021-11-11

最新评论

?


http://www.vxiaotou.com