当前位置: 首页 > 知识库问答 >
问题:

后端 - redis 使用 lua 的时候,怎么导入外部库?

卫高谊
2024-01-22

redis 使用 lua 的时候,怎么导入外部库

def get_cookie(hkey: str) -> str | None:    from core.redis.models import client    # Use Lua scripting to get a random field from the hash set    lua_script = """        local os = require("os")            math.randomseed(os.time())        local fields = redis.call('HKEYS', KEYS[1])        if #fields == 0 then            return nil        end        local random_index = math.random(1, #fields)        local field = fields[random_index]        return random_index    """    return client.eval(lua_script, 1, hkey)

我要导入 os 重置时间种子

运行会报错

    result = context.run(func, *args)             ^^^^^^^^^^^^^^^^^^^^^^^^  File "/home/pon/code/work/vobile/vt/account_console/api.py", line 75, in get_cookie_by_parser_name    return {"cookie": get_cookie(hkey)}                      ^^^^^^^^^^^^^^^^  File "/home/pon/code/work/vobile/vt/account_console/api.py", line 45, in get_cookie    return client.eval(lua_script, 1, hkey)           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File "/home/pon/.local/share/virtualenvs/account_console-Tc5w3Cdm/lib/python3.11/site-packages/redis/client.py", line 3131, in eval    return self.execute_command('EVAL', script, numkeys, *keys_and_args)           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File "/home/pon/.local/share/virtualenvs/account_console-Tc5w3Cdm/lib/python3.11/site-packages/redis/client.py", line 901, in execute_command    return self.parse_response(conn, command_name, **options)           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^  File "/home/pon/.local/share/virtualenvs/account_console-Tc5w3Cdm/lib/python3.11/site-packages/redis/client.py", line 915, in parse_response    response = connection.read_response()               ^^^^^^^^^^^^^^^^^^^^^^^^^^  File "/home/pon/.local/share/virtualenvs/account_console-Tc5w3Cdm/lib/python3.11/site-packages/redis/connection.py", line 756, in read_response    raise responseredis.exceptions.ResponseError: user_script:2: Script attempted to access nonexistent global variable 'require' script: 1243ed7643e4b791767acb3602ad454e6b9098a3, on @user_script:2.

共有1个答案

司空修贤
2024-01-22

看起来你在 Lua 脚本中使用了 require,这是 Node.js 的模块加载方式,而不是 Lua 的。在 Lua 中,如果你想使用外部库,你需要使用 require 的方式来加载。

然而,Redis 的 Lua 脚本环境并没有提供 require 函数来加载外部库。因此,你不能直接在 Redis 的 Lua 脚本中导入外部库。

如果你需要在 Redis 的 Lua 脚本中使用一些 Lua 库的功能,你需要做的是将这些功能集成到你的 Lua 脚本中,而不是尝试导入外部库。

在你的特定情况中,如果你需要使用 os 库的 time 函数来设置随机种子,你可以直接在 Lua 脚本中使用 os.time(),而不需要使用 require。你的代码应该像这样:

math.randomseed(os.time())

请注意,这需要在你的 Lua 环境中已经定义了 os 库。如果你在执行 Lua 脚本时遇到了问题,可能是因为你的 Lua 环境没有正确配置。在这种情况下,你可能需要检查你的 Lua 环境配置,或者考虑使用一个已经正确配置了 os 库的 Lua 环境。

 类似资料:
  • 问题内容: Redis使用哪个版本的Lua或如何找到它? 那图书馆呢?cjson,cmsgpack,bitop等。 问题答案: a 从Redis 2.6.0到2.6.12的Lua 5.1.4 从Redis 2.6.13开始的Lua 5.1.5 似乎没有进一步升级Lua的计划。 可以在antirez / redis 的Lua.h文件中验证Lua版本。 luajit 对数字进行按位运算。API 自Re

  • 本文向大家介绍L1不可导的时候该怎么办?相关面试题,主要包含被问及L1不可导的时候该怎么办?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 当损失函数不可导,梯度下降不再有效,可以使用坐标轴下降法,梯度下降是沿着当前点的负梯度方向进行参数更新,而坐标轴下降法是沿着坐标轴的方向,假设有m个特征个数,坐标轴下降法进参数更新的时候,先固定m-1个值,然后再求另外一个的局部最优解,从而避免损失函数

  • 我正在学习Vue JS,发现有时我们导入{},有时我们导入时没有{}。请问有什么区别? 非常感谢。

  • 问题内容: 我想知道什么时候应该包括外部脚本或将它们与html代码内联,以提高性能和简化维护。 一般做法是什么? 真实场景-我有几个需要客户端表单验证的html页面。为此,我使用了所有这些页面中都包含的jQuery插件。但是问题是,我是否: 编写代码位以内联方式配置此脚本? 在所有这些html页面之间共享的一个文件中包含所有位? 将每个位都包含在一个单独的外部文件中,每个html页面一个? 谢谢。

  • 问题内容: 奇怪的是: 似乎或多或少被定义为。通过这种方式很容易产生错误: 一些fname意外地以else块结尾。修复很简单,我们应该改用它,但是从表面上看,这似乎是一种不错的pythonic方式,并且比“正确”的方式更具可读性。 由于字符串是不可变的,所以为什么字符串错误是什么技术细节?什么时候进行身份检查更好,什么时候进行平等检查更好? 问题答案: 据我所知,检查对象身份是否相等。由于没有强制

  • 问题内容: 与 那两个工作正常。 使用连接池背后的想法是什么?什么时候使用? 问题答案: 从redis-py docs: 在后台,redis- py使用连接池来管理与Redis服务器的连接。默认情况下,您创建的每个Redis实例将依次创建自己的连接池。通过将已创建的连接池实例传递给Redis类的connection_pool参数,可以覆盖此行为并使用现有的连接池。您可以选择执行此操作,以实现客户端