|NO.Z.00028|——————————|BigDataEnd|——|Hadoop&Redis.V04|——|Redis.v04|lua脚本与Redis整合应用.v02|
一、EVAL/EVALSHA命令实现
### --- EVAL命令
~~~ 通过执行redis的eval命令,可以运行一段lua脚本
EVAL script numkeys key [key ...] arg [arg ...]
### --- 命令说明:
~~~ script参数:是一段Lua脚本程序,它会被运行在Redis服务器上下文中,这段脚本不必(也不应该)定义为一个Lua函数。
~~~ numkeys参数:用于指定键名参数的个数。
~~~ key [key ...]参数: 从EVAL的第三个参数开始算起,使用了numkeys个键(key),表示在脚本中
~~~ 所用到的那些Redis键(key),这些键名参数可以在Lua中通过全局变量KEYS数组,用1为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推)。
~~~ arg [arg ...]参数:可以在Lua中通过全局变量ARGV数组访问,访问的形式和KEYS变量类似(ARGV[1] 、 ARGV[2] ,诸如此类)。
127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
二、lua脚本中调用Redis命令
### --- redis.call():
~~~ 返回值就是redis命令执行的返回值
~~~ 如果出错,则返回错误信息,不继续执行
### --- redis.pcall():
~~~ 返回值就是redis命令执行的返回值
~~~ 如果出错,则记录错误信息,继续执行
### --- 注意事项
~~~ 在脚本中,使用return语句将返回值返回给客户端,如果没有return,则返回nil
127.0.0.1:6379> eval "return redis.call('set',KEYS[1],ARGV[1])" 1 n1 zhaoyun
OK
### --- EVALSHA
~~~ EVAL 命令要求你在每次执行脚本的时候都发送一次脚本主体(script body)。
~~~ Redis 有一个内部的缓存机制,因此它不会每次都重新编译脚本,不过在很多场合,
~~~ 付出无谓的带宽来传送脚本主体并不是最佳选择。
~~~ 为了减少带宽的消耗, Redis 实现了 EVALSHA 命令,它的作用和 EVAL 一样,
~~~ 都用于对脚本求值,但它接受的第一个参数不是脚本,而是脚本的 SHA1 校验和(sum)
### --- SCRIPT命令
~~~ SCRIPT FLUSH :清除所有脚本缓存
~~~ SCRIPT EXISTS :根据给定的脚本校验和,检查指定的脚本是否存在于脚本缓存
~~~ SCRIPT LOAD :将一个脚本装入脚本缓存,返回SHA1摘要,但并不立即运行它
### --- SCRIPT KILL :杀死当前正在运行的脚本
127.0.0.1:6379> eval "return redis.call('set',KEYS[1],ARGV[1])" 1 n1 zhaoyun
OK
127.0.0.1:6379> script load "return redis.call('set',KEYS[1],ARGV[1])"
"c686f316aaf1eb01d5a4de1b0b63cd233010e63d"
127.0.0.1:6379> evalsha c686f316aaf1eb01d5a4de1b0b63cd233010e63d 1 n2 caocao
OK
127.0.0.1:6379> get n2
"caocao"
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
分类:
bdv012-redis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通