From 0b4d2173030df8228f667cd0ddc6fd42b5ffa5e7 Mon Sep 17 00:00:00 2001 From: cnr Date: Mon, 26 Dec 2016 22:34:09 -0700 Subject: [PATCH] Reduce number of redis requests by communities --- .../core/communities/CommunityManager.java | 13 +--- .../storage/CommunityRepository.java | 61 +++++++++++-------- .../serverdata/data/DataRepository.java | 3 +- .../serverdata/redis/RedisDataRepository.java | 13 ++-- 4 files changed, 48 insertions(+), 42 deletions(-) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityManager.java b/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityManager.java index c465a7ce8..509c65f57 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/communities/CommunityManager.java @@ -84,9 +84,7 @@ public class CommunityManager extends MiniDbClientPlugin private boolean _us; private volatile boolean _cycling = false; - - private volatile boolean _updateJoinRequests = false; - + @SuppressWarnings("deprecation") public CommunityManager(JavaPlugin plugin, CoreClientManager clientManager) { @@ -141,13 +139,8 @@ public class CommunityManager extends MiniDbClientPlugin LinkedList communities = new LinkedList<>(); _loadedCommunities.values().forEach(community -> communities.add(community)); - _repo.updateMembers(communities); - if (_updateJoinRequests) - { - _repo.updateJoinRequests(communities); - } - _updateJoinRequests = !_updateJoinRequests; - }, 0L, 20 * 7); + _repo.updateMembersAndJoinRequests(communities); + }, 0L, 20 * 10); Bukkit.getScheduler().scheduleSyncRepeatingTask(plugin, () -> { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/communities/storage/CommunityRepository.java b/Plugins/Mineplex.Core/src/mineplex/core/communities/storage/CommunityRepository.java index 8c86d5b86..0e4844cf3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/communities/storage/CommunityRepository.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/communities/storage/CommunityRepository.java @@ -2,13 +2,13 @@ package mineplex.core.communities.storage; import java.sql.Connection; import java.sql.SQLException; -import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.bukkit.plugin.java.JavaPlugin; @@ -143,22 +143,32 @@ public class CommunityRepository extends MinecraftRepository e.printStackTrace(); } } - - public void updateMembers(LinkedList communities) + + public void updateMembersAndJoinRequests(List communities) { if (communities.isEmpty()) { return; } - TimingManager.start("member elements"); + + TimingManager.start("members + join requests"); + Map statuses = _repo.getElementsMap( + Stream.concat( + communities.stream().flatMap(community -> community.getMembers().keySet().stream()), + communities.stream().flatMap(community -> community.getJoinRequests().keySet().stream()) + ) + .distinct() + .map(UUID::toString) + .collect(Collectors.toList()) + ); + for (Community c : communities) { - List members = new ArrayList<>(c.getMembers().values()); - List statuses = _repo.getElementsSequential(members.stream().map(info -> info.UUID.toString()).collect(Collectors.toList())); - for (int i = 0; i < members.size(); i++) + // Update member player status + for (Map.Entry entry : c.getMembers().entrySet()) { - CommunityMemberInfo info = members.get(i); - PlayerStatus status = statuses.get(i); + CommunityMemberInfo info = entry.getValue(); + PlayerStatus status = statuses.get(entry.getKey().toString()); boolean online = false; String server = ""; @@ -180,25 +190,13 @@ public class CommunityRepository extends MinecraftRepository } } } - } - TimingManager.stop("member elements"); - } - - public void updateJoinRequests(LinkedList communities) - { - if (communities.isEmpty()) - { - return; - } - TimingManager.start("request elements"); - for (Community c : communities) - { - List requests = new ArrayList<>(c.getJoinRequests().values()); - List statuses = _repo.getElementsSequential(requests.stream().map(info -> info.UUID.toString()).collect(Collectors.toList())); - for (int i = 0; i < requests.size(); i++) + + // Update join request names + for (Map.Entry entry : c.getJoinRequests().entrySet()) { - CommunityJoinRequestInfo info = requests.get(i); - PlayerStatus status = statuses.get(i); + + CommunityJoinRequestInfo info = entry.getValue(); + PlayerStatus status = statuses.get(entry.getKey().toString()); if (status != null) { @@ -209,6 +207,15 @@ public class CommunityRepository extends MinecraftRepository } } } + TimingManager.stop("members + join requests"); + } + + public void updateJoinRequests(LinkedList communities) + { + if (communities.isEmpty()) + { + return; + } TimingManager.stop("request elements"); } diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DataRepository.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DataRepository.java index cdac8d117..03500ca2a 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DataRepository.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/data/DataRepository.java @@ -2,6 +2,7 @@ package mineplex.serverdata.data; import java.util.Collection; import java.util.List; +import java.util.Map; /** * DataRepository is used to store {@link Data} objects in a central database @@ -19,7 +20,7 @@ public interface DataRepository public Collection getElements(Collection dataIds); - public List getElementsSequential(List dataIds); + public Map getElementsMap(List dataIds); public void addElement(T element, int timeout); diff --git a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisDataRepository.java b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisDataRepository.java index 46e74fc6b..55f3a2d58 100644 --- a/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisDataRepository.java +++ b/Plugins/Mineplex.ServerData/src/mineplex/serverdata/redis/RedisDataRepository.java @@ -2,8 +2,10 @@ package mineplex.serverdata.redis; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; import mineplex.serverdata.Region; @@ -104,9 +106,9 @@ public class RedisDataRepository extends RedisRepository impleme } @Override - public List getElementsSequential(List dataIds) + public Map getElementsMap(List dataIds) { - List elements = new ArrayList<>(); + Map elements = new HashMap<>(); try(Jedis jedis = getResource(false)) { @@ -121,12 +123,15 @@ public class RedisDataRepository extends RedisRepository impleme // Block until all requests have received pipelined responses pipeline.sync(); - for (Response response : responses) + for (int i = 0; i < responses.size(); i++) { + String key = dataIds.get(i); + + Response response = responses.get(i); String serializedData = response.get(); T element = deserialize(serializedData); - elements.add(element); + elements.put(key, element); } }