gpt4 book ai didi

lua - Lua 脚本上的 Jedis/Redis SocketTimeout 异常

转载 作者:可可西里 更新时间:2023-11-01 11:34:03 24 4
gpt4 key购买 nike

我们正在使用 lua 脚本对数据库更新时的数据执行批量删除。 Jedis 使用管道执行 lua 脚本。

local result = redis.call('lrange',key,0,12470)
for i,k in ipairs(result) do
redis.call('del',k)
redis.call('ltrim',key,1,k)
end

try (Jedis jedis = jedisPool.getResource()) {
Pipeline pipeline = jedis.pipelined();
long len = jedis.llen(table);
String script = String.format(DELETE_LUA_SCRIPT, table, len);
LOGGER.info(script);
pipeline.eval(script);
pipeline.sync();
} catch (JedisConnectionException e) {
LOGGER.info(e.getMessage());
}

对于大范围,我们注意到 lua 脚本变慢并且我们得到 SocketTimeOutExceptions。

运行 redis-cli slowlog 仅显示执行时间过长的 lua 脚本。

有更好的方法吗?我的 lua 脚本阻塞了吗?

当我只使用管道进行批量删除时,slowlog 也会返回慢速查询。

try (Jedis jedis = jedisPool.getResource()) {
Pipeline pipeline = jedis.pipelined();
long len = jedis.llen(table);
List<String> queriesContainingTable = jedis.lrange(table,0,len);
if(queriesContainingTable.size() > 0) {
for (String query: queriesContainingTable) {
pipeline.del(query);
pipeline.lrem(table,1,query);
}
pipeline.sync();
}
} catch (JedisConnectionException e) {
LOGGER.info("CACHE INVALIDATE FAIL:"+e.getMessage());
}

最佳答案

slowlog 能够单独存储前 128 个 slowlog(可以在 redis.conf 中更改 slowlog-max-len 128)。因此,您使用 LUA 脚本的第一个模型肯定是一个阻塞模型。

如果您将这样的号码 (12470) 一个一个地删除,那肯定是阻塞的,因为它需要更多的时间才能完成。在 2 个模型中,第 2 个对我来说很好(使用管道),因为你避免了迭代,你所做的就是点击 del 查询 n 次。

您可以对每 100 或 1000 个键使用多个键的 del(经过小型测试后您认为最佳)。您可以将它们一起分组到一个管道中。

或者,如果您可以在没有原子性的情况下执行相同的操作,则可以在循环中一次删除每 100 或 1000 个键,这样就不会成为阻塞调用。

尝试使用不同的组合来获取指标并使用优化的指标。

关于lua - Lua 脚本上的 Jedis/Redis SocketTimeout 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37693565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com