使用 LUA 脚本在 Redis 中修改对象
2021-3-31 8:35:1
收藏:0
阅读:152
评论:2
请帮忙出出主意,关于在 Redis 中使用 LUA 脚本修改对象的问题。 我有一个 Redis 列表,其中包含以下实体:
{
"@class": "com.myproject.model.Book",
"bookId": "someId",
"author": "someAuthor"
}
现在,我需要更改实体以允许为某些书籍拥有多个作者,并创建迁移脚本:
{
"@class": "com.myproject.model.Book",
"bookId": "someId",
"authors": [
"java.util.ArrayList",
[
"someAuthor"
]
]
}
我认为我需要在 LUA 中执行以下操作:
local book
local cacheName --缓存名称
local authorId;
local size = redis.call('LLEN', cacheName)
if size == 0
then
return -1
end
while size > 0
do
book = redis.call('LPOP', cacheName)
-- 在这里修改实体
affectedEntitiesCount = affectedEntitiesCount + 1
redis.call('RPUSH', cacheName, book)
size = size - 1
end
return affectedEntitiesCount
但我不知道如何根据要求修改书籍对象。 能否有人帮忙看一下并提供建议?
点赞
用户3160475
由于您似乎在列表中存储了 JSON 编码的值,您可以使用嵌入在 Redis Lua 引擎中的 cjson 库。
例如:
...
book = cjson.decode(redis.call('LPOP', cacheName))
book['bookId'] = book['bookId']..'foo' -- 将 'foo' 拼接到 bookId
...
redis.call('RPUSH', cacheName, cjson.encode(book))
注意:还要确保使用 KEYS 输入数组来参数化脚本的输入键名(例如 local cacheName = KEYS[1])。
2021-03-31 16:43:29
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

local book local cacheName local authorPattern= '"author":"[^"]*"' local authorId local replacementAuthors = '"authors":["java.util.ArrayList",["%s"]]' local size = redis.call('LLEN', cacheName) if size == 0 then return -1 end while size > 0 do book = redis.call('LPOP', cacheName) authorId = string.match(string.match(book, authorPattern), [["authorId":"([^"]+)]]) replacedAuthors = string.format(replacedAuthors , authorId) book = string.gsub(book, authorPattern, replacedAuthors) affectedEntitiesCount = affectedEntitiesCount + 1 redis.call('RPUSH', cacheName, book) size = size - 1 end return affectedEntitiesCount本地书籍
本地缓存名称
作者模式 ='"作者":"[^"]*"'
作者 ID
替代作者 ='"作者":["java.util.ArrayList",["%s"]]'
大小= redis 调用('LLEN',cacheName)
如果大小为0,那么
返回-1
结束
当大小> 0 时
做
书=redis调用('LPOP',cacheName)
作者Id=字符串匹配(字符串匹配(书,作者模式),[["作者Id":"([^"]+)]])
替代作者=字符串格式化(替代作者,作者Id)
书=字符串替换(书,作者模式,替代作者)
受影响的实体计数=受影响的实体计数 + 1
redis调用('RPUSH',cacheName,书)
大小=大小-1
结束
返回受影响的实体计数