前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >lua脚本-redis批量设置key并且带TTL-两种方案

lua脚本-redis批量设置key并且带TTL-两种方案

原创
作者头像
王宝
发布2024-11-25 10:03:06
发布2024-11-25 10:03:06
11700
代码可运行
举报
运行总次数:0
代码可运行

lua脚本

根据传入参数的方式不同,可实现不同批量设置key的lua脚本

以下script为脚本数据,用于生成【sha】

代码语言:javascript
代码运行次数:0
复制
redis.ScriptLoad(ctx, Script).Result()

以下执行脚本,获取返回值

代码语言:javascript
代码运行次数:0
复制
redis.EvalSha(ctx, Sha, keys, args...).Result()

以下两种lua脚本:

方案一:

KEYS: ["my:key:::1","my:key:::2","my:key:::3"]

ARGV:["value1","value2","value3","expire1","expire2","expire3"]

代码语言:txt
复制
func MSetWithTtl() string {
	script := `
		if #KEYS < 1 or #ARGV < 1 then
			return -1
		end
		local keyNum = #KEYS
		local argNum = #ARGV
		local resVal = 0
		local expVal = 0
		if 2 * keyNum ~= argNum then
			return -1
		end
		for id, key in pairs(KEYS) do
			expVal = ARGV[id + keyNum]
			if expVal == 0 then
				resVal = redis.call('set', key, ARGV[id])
			else
				resVal = redis.call('set', key, ARGV[id], 'EX', expVal)
			end
			if resVal == false then
				return -1
			end
		end
		return 1
`
	return script
}

方案二:

KEYS:批量设置多个key的数量,比如3个key

ARGV:["my:key:::1","value1","expire1","my:key:::2","value2","expire2","my:key:::3","value3","expire3"]

代码语言:txt
复制
func MSetWithTtl() string {
	script := `
		local count = tonumber(KEYS[1])
		for i=1,count do
			local expireTime = tonumber(ARGV[3*(i-1)+3])
			if expireTime == -1 then
			redis.call('set',ARGV[3*(i-1)+1],ARGV[3*(i-1)+2])
			else
			redis.call('set',ARGV[3*(i-1)+1],ARGV[3*(i-1)+2],'ex',expireTime)
			end
		end
		return 1
	`
	return script
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • lua脚本
  • 方案一:
  • 方案二:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档