首页 > 数据库 >redis执行lua脚本

redis执行lua脚本

时间:2023-08-29 15:13:17浏览次数:40  
标签:脚本 ... script redis lua call

目录

redis执行lua脚本

简介

1. 原子操作: redis对lua脚本执行具备原子性 不需要事务维护
2. 复用高效: 客户端发送的脚本除非通过script flush清除 否则会一直被缓存 且lua由c编写而成 加载和运行速度都很快 支持不同平台可插入式编译
3. 减少网络开销: 多条指令可通过lua脚本整合一起处理 减少网络io和连接次数

常规命令

1. eval [lua脚本内容] [key数量] [key的值...] [val的值...]
	执行lua脚本
	
2. script load [lua脚本内容]
	lua脚本缓存 返回sha1值  携带sha1值执行evalsha命令才是实际执行lua
	
3. evalsha [lua缓存脚本的sha1值] [key数量] [key的值...] [val的值...]
	携带sha1值实际执行lua脚本 
	
4. script exists  [lua缓存脚本的sha1值]
	判断lua缓存脚本是否存在(0:不存在1:存在)
	
5. script flush
	删除redis服务端所有lua脚本缓存
	
6. script kill

7. redis-cli --eval [lua脚本文件位置] [key值...] , [val值...]

实例

eval

eval "redis.call('set', KEYS[1], ARGV[1]);redis.call('expire', KEYS[1], ARGV[2]);return 1;" 1 luaKey luaVal 3600

image


script load

script load  "redis.call('set', KEYS[1], ARGV[1]);redis.call('expire', KEYS[1], ARGV[2]);return 1;"

evalsha

evalsha "56574304875ec20fd85382070452bb509eeb04c0" 1 code golang 3600

image


script exists

script exists "56574304875ec20fd85382070452bb509eeb04c0"

image


script flush

script flush

image


script kill

# 模拟异常循环耗时写操作
redis> eval "while(true) do redis.call('expire', KEYS[1], ARGV[1]);end" 1 name 3600
# 模拟异常循环耗时读操作
redis> eval "while(true) do redis.call('get', KEYS[1]);end" 1 name 3600
# script kill 只作用于读操作 写操作需要停止服务才能终止异常耗时的lua脚本的执行(比如使用 shutdown nosave 终止)
redis> script kill

image


lua脚本文件执行

# 语法
redis-cli -a [密码] -h [IP地址] -p [端口号] --eval [lua脚本位置] [key值...] , [val值...]
ps: , 在key和val之间 都需要预留空格
-- 分布式锁简单示例 setnx + expire
if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then
	redis.call('expire', KEYS[1], ARGV[2]);
	return 1;
else
	return 0;
end
redis-cli --eval luaTest.lua uniqRedLock , uuid+threadId 3600

image


标签:脚本,...,script,redis,lua,call
From: https://www.cnblogs.com/fsh19991001/p/17664855.html

相关文章

  • redis集群-Cluser
    目录一RedisCluser介绍背景1.1问题1.2解决二数据分布(分布式数据库)2.1存在问题2.2分区方式2.2.1顺序分区2.2.2哈希分区三集群搭建四python操作集群一RedisCluser介绍背景https://www.cnblogs.com/liuqingzheng/articles/17324393.html1.1问题#存在问题1并发量......
  • redis哨兵Sentinel
    目录一主从复制高可用二哨兵三安装配置四python操作哨兵一主从复制高可用#主从复制存在的问题:1主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个slave变成master---->哨兵做高可用2主从复制,只能主写数据,所以写能力和存储能力有限----->使用集群解决#......
  • 一台服务器上部署 Redis 伪集群
    哈喽大家好,我是咸鱼今天这篇文章介绍如何在一台服务器(以CentOS7.9为例)上通过redis-trib.rb工具搭建Rediscluster(三主三从)redis-trib.rb是一个基于Ruby编写的脚本,其功能涵盖了创建、管理以及维护Redis集群的各个方面值得注意的是,随着时间的推移,一些较新版本的Redi......
  • redis主从复制
    目录一什么是主从复制1.1主从复制:一主一从,一主多从1.2特点1.3Redis主从复制的作用二主从原理2.1主库是否要开启持久化(一般情况要开启)3.2方式一3.3方式二:配置文件方式一什么是主从复制redis单实例--->容易产生机器故障;容量瓶颈;QPS(每秒查询率)瓶颈1.1主从复制:一主一......
  • nginx同步脚本
    检测nginx进程是否存在异常`#!/bin/bash收集nginx进程pidpid=$(ps-ef|grepnginx|grepworker|awk'{print$2}')收集第一个nginx进程的pid,打上时间戳pid0=$(ps-ef|grepnginx|grepworker|awk'{print$2}'|head-n1)starttime0=$(ps-olstart=-p$pid0)startti......
  • 当某个excel工作簿的某个单元格的值发生变动时, 自动执行python某脚本, 如何实现?
    要实现当Excel工作簿中的某个单元格值发生变化时自动执行Python脚本,你可以考虑以下步骤:监视单元格变化:首先,你需要实现监视Excel工作簿中的特定单元格是否发生了变化。这可以通过使用VBA(VisualBasicforApplications)宏来实现。打开Excel工作簿,按下ALT+F11打开VBA编辑器,然后......
  • redis分布式锁,setnx+lua脚本的java实现
    1前言在现在工作中,为保障服务的高可用,应对单点故障、负载量过大等单机部署带来的问题,生产环境常用多机部署。为解决多机房部署导致的数据不一致问题,我们常会选择用分布式锁。目前其他比较常见的实现方案我列举在下面:基于缓存实现分布式锁(本文主要使用redis实现)基于数据库实......
  • 连接redis后 ,报错: ERR wrong number of arguments for ‘hset‘ command“怎么解决
    原因:ERRwrongnumberofargumentsfor‘hset‘command触发代码 解决方法:可能是java不匹配我本地3.2版本的redis,我换一个更大版本的redis就解决了 ......
  • redis持久化
    目录一持久化1.1什么是持久化1.2持久化的实现方式二rdb方案2.1使用2.2RDB问题三AOF3.1AOF介绍3.2#AOF的三种策略3.3AOF重写实现方式AOF重写配置:自动触发时机(两个条件同时满足):重写流程aof配置7.3混合持久化一持久化1.1什么是持久化redis的所有数据保存在内存中,对数......
  • Redis简介
    文章目录一、Redis是什么?二、Redis优缺点?三、Redis应用场景四、Redis安装和使用五、Redis为什么这么快?1、为什么采用单线程2、Redis的I/O多路复用一、Redis是什么?Redis(RemoteDictionaryServer:远程字典服务)是一个开源的使用ANSIC语言编写、遵守BSD协议、支持网络、可基于......