成都网站制作成都网站制作,html网页制作案例,企业所得税怎样计算,小程序开发公司谁知道lua 菜鸟教程#xff1a;https://www.runoob.com/lua/lua-tutorial.html
在 Redis 使用 lua 脚本的好处#xff1a;
减少网络开销。可以将多个请求通过脚本的形式一次发送#xff0c;减少网络时延及开销原子性操作。Redis会将整个脚本作为一个整体执行#xff0c;中间不会…lua 菜鸟教程https://www.runoob.com/lua/lua-tutorial.html
在 Redis 使用 lua 脚本的好处
减少网络开销。可以将多个请求通过脚本的形式一次发送减少网络时延及开销原子性操作。Redis会将整个脚本作为一个整体执行中间不会被其他请求插入。因此在脚本运行过程中无需担心会出现竞态条件无需使用事务复用。客户端发送的脚本会永久存在redis中这样其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑
1. 常用命令
EVAL将脚本 script 添加到脚本缓存中并且立即执行这个脚本 语法EVAL script numkeys key [key …] arg [arg …]参数含义 script是 Lua5.1 脚本程序。此Lua脚本不需要也不应该定义函数它运行在 Redis 服务器中numkeys键名参数的个数。即key [key …] 中 key 的个数。如没有 key则为 0key[]键名参数表示在脚本中所用到的那些 Redis 键(key)这些键名参数可以在 lua 中通过全局变量 KEYS 数组。在 lua 脚本中通过 KEYS[1]KEYS[2] 获取arg [arg …] 不是键名参数的附加参数可以在 lua 中通过全局变量 ARGV 数组访问。在 lua 脚本中通过 ARGV[1]ARGV[2] 获取 案例 调用 set 方法EVAL return redis.call(set, name, bob) 0调用 set 方法使用参数EVAL return redis.call(set, KEYS[1], ARGV[1]) 1 name jack EVALSHA根据给定的 sha1 校验码执行缓存在服务器中的脚本。将脚本缓存到服务器的操作可以通过 SCRIPT LOAD 命令进行。这个命令的其他地方比如参数的传入方式都和 EVAL 命令一样 语法EVALSHA sha1 numkeys key [key ...] arg [arg ...] SCRIPT LOAD将脚本 script 添加到脚本缓存中但并不立即执行这个脚本。 在脚本被加入到缓存之后通过 EVALSHA 命令可以使用脚本的 SHA1 校验和来调用这个脚本。 脚本可以在缓存中保留无限长的时间直到执行 SCRIPT FLUSH 为止 语法SCRIPT LOAD script。返回脚本的 SHA1 校验和 SCRIPT EXISTS校验指定的脚本是否已经被保存在缓存当中 语法SCRIPT EXISTS sha1 [sha1 ...] SCRIPT FLUSH清除 Redis 服务端所有 lua 脚本缓存SCRIPT KILL用于杀死当前正在运行的 lua 脚本当且仅当这个脚本没有执行过任何写操作时这个命令才生效。这个命令主要用于终止运行时间过长的脚本比如一个因为 BUG 而发生无限循环的脚本
案例
redis 127.0.0.1:6379 SCRIPT LOAD return hello moto # 载入一个脚本
232fd51614574cf0867b83d384a5e898cfd24e5aredis 127.0.0.1:6379 SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 1redis 127.0.0.1:6379 SCRIPT FLUSH # 清空缓存
OKredis 127.0.0.1:6379 SCRIPT EXISTS 232fd51614574cf0867b83d384a5e898cfd24e5a
1) (integer) 02. 具体业务使用案例
基于 Redis 的分布式锁
释放锁的流程
获取锁中的线程标识判断是否与指定的标识当前线程标识一致如果一致则删除否则什么都不做
unlock.lua 如下resources/unlock.lua
-- 比较线程标示与锁中的标示是否一致
if(redis.call(get, KEYS[1]) ARGV[1]) then-- 释放锁 del keyreturn redis.call(del, KEYS[1])
end
return 0在 Java 中调用
// 初始化 lua 脚本文件
private static final DefaultRedisScriptLong UNLOCK_SCRIPT;
static {UNLOCK_SCRIPT new DefaultRedisScript();//lua脚本位置UNLOCK_SCRIPT.setLocation(new ClassPathResource(unlock.lua));//返回值类型UNLOCK_SCRIPT.setResultType(Long.class);
}// 使用 lua 脚本释放锁
public void unlock(String lockKey,String lockValue){// 调用lua脚本redisTemplate.execute(UNLOCK_SCRIPT,Collections.singletonList(lockKey),lockValue);
}