From d54238023d64c3be01f6c9a5492e90b91688a172 Mon Sep 17 00:00:00 2001 From: Tux Date: Mon, 22 Jun 2015 00:13:58 -0400 Subject: [PATCH] Squeezed the last bits I possibly can out of the Lua implementation. Performance enhancements beyond what I've done are welcome. --- .../minecraft/redisbungee/RedisBungee.java | 19 +++++++++++++------ src/main/resources/lua/server_to_players.lua | 14 ++++---------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java index 2484451..9a2e2be 100644 --- a/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java +++ b/src/main/java/com/imaginarycode/minecraft/redisbungee/RedisBungee.java @@ -30,7 +30,6 @@ import com.google.common.base.Functions; import com.google.common.collect.*; import com.google.common.io.ByteStreams; import com.google.gson.Gson; -import com.google.gson.reflect.TypeToken; import com.imaginarycode.minecraft.redisbungee.events.PubSubMessageEvent; import com.imaginarycode.minecraft.redisbungee.util.LuaManager; import com.imaginarycode.minecraft.redisbungee.util.NameFetcher; @@ -55,7 +54,6 @@ import redis.clients.jedis.exceptions.JedisConnectionException; import redis.clients.jedis.exceptions.JedisException; import java.io.*; -import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicInteger; @@ -138,13 +136,22 @@ public final class RedisBungee extends Plugin { final Multimap serversToPlayers() { if (usingLua) { - String string = (String) serverToPlayersScript.eval(ImmutableList.of(), getServerIds()); - Map> deserialized = gson.fromJson(string, new TypeToken>>() {}.getType()); + Collection data = (Collection) serverToPlayersScript.eval(ImmutableList.of(), getServerIds()); ImmutableMultimap.Builder builder = ImmutableMultimap.builder(); - for (Map.Entry> entry : deserialized.entrySet()) { - builder.putAll(entry.getKey(), entry.getValue()); + // TODO: This seems pretty slow, but execution times over the long term seem to stay below that of the + // Java implementation, at least. If you have a better idea, I want to see it! + String key = null; + + for (String s : data) { + if (key == null) { + key = s; + continue; + } + + builder.put(key, UUID.fromString(s)); + key = null; } return builder.build(); diff --git a/src/main/resources/lua/server_to_players.lua b/src/main/resources/lua/server_to_players.lua index 7ba84f6..21196a1 100644 --- a/src/main/resources/lua/server_to_players.lua +++ b/src/main/resources/lua/server_to_players.lua @@ -1,5 +1,3 @@ --- This script needs all active proxies available specified as args. -local insert = table.insert local call = redis.call local serverToData = {} @@ -9,15 +7,11 @@ for _, proxy in ipairs(ARGV) do for _, player in ipairs(players) do local server = call("HGET", "player:" .. player, "server") if server then - local map = serverToData[server] - if not map then - map = {} - serverToData[server] = map - end - insert(map, player) + local sz = #serverToData + serverToData[sz + 1] = server + serverToData[sz + 2] = player end end end --- Redis can't map Lua associative tables back, so we have to send it as JSON. -return cjson.encode(serverToData) \ No newline at end of file +return serverToData \ No newline at end of file