TheStarBoss 2023-02-02 10:49 采纳率: 0%
浏览 22

使用org.redisson.api.RScript 如何在lua脚本中进行阻塞等待

问题遇到的现象和发生背景

使用org.redisson.api.RScript 如何在lua脚本中进行阻塞等待
如果不进行阻塞 会造成服务cpu超限 并且会给redis集群带来很大压力

遇到的现象和发生背景,请写出第一个错误信息

类似实现RateLimiter的acquire 需要阻塞等待下

用代码块功能插入代码,请勿粘贴截图
String script = LuaScript.getTokenBucketRateLimiterScript();
        List<Long> results = rScript.eval(RScript.Mode.READ_WRITE, script, RScript.ReturnType.MULTI, keys, rule.getRate(), rule.getBucketCapacity(), rule.getRequestedTokens());

script部分脚本

local requested = tonumber(ARGV[3])
local now = redis.call('TIME')[1]
local delta = math.max(0, now-last_refreshed)
local filled_tokens = math.min(capacity, last_tokens+(delta*rate))
local allowed = filled_tokens >= requested
while(not(allowed))
do
   now = redis.call('TIME')[1]
   delta = math.max(0, now-last_refreshed)
   filled_tokens = math.min(capacity, last_tokens+(delta*rate))
   allowed = filled_tokens >= requested
end
运行结果及详细报错内容

运行结果ok

我的解答思路和尝试过的方法

尝试在while中添加 os.execute("sleep " .. 1)
while(not(allowed))
do
os.execute("sleep " .. 1)
now = redis.call('TIME')[1]
delta = math.max(0, now-last_refreshed)
filled_tokens = math.min(capacity, last_tokens+(delta*rate))
allowed = filled_tokens >= requested
end

但发生了报错
ERR Error running script (call to f_005cecb2922feef769db26c02a1a73b5ed10082f): @enable_strict_lua:15: user_script:23: Script attempted to access nonexistent global variable 'os'.

请问下该如何解决呢

  • 写回答

1条回答 默认 最新

  • m0_54204465 2023-02-02 10:58
    关注

    在 Redis Lua 脚本中,os 函数不可用。因此,无法使用 os.execute 来暂停脚本的执行。为了避免这种情况,可以使用 redis.call('sleep', time) 来替代。请更改如下:

    while(not(allowed))
    do
    redis.call('sleep', 1)
    now = redis.call('TIME')[1]
    delta = math.max(0, now-last_refreshed)
    filled_tokens = math.min(capacity, last_tokens+(delta*rate))
    allowed = filled_tokens >= requested
    end
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 2月2日

悬赏问题

  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 目详情-五一模拟赛详情页
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b