【发布时间】:2016-10-08 04:39:49
【问题描述】:
我们正在使用 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 脚本被阻塞了吗?
当我只使用管道进行批量删除时,慢日志也会返回慢查询。
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());
}
【问题讨论】: