我需要根据客户端的用户名从netty服务器向客户端发送消息。 因此,我需要使用用户名映射频道,并在每次发送消息时找到频道。
我脑子里有两种方法,问题是: 哪种方法更好,就服务器端的性能而言。你有更好的想法吗?
在hashmap中使用用户名映射通道。
//Send userName from client side in first request
//Get userName in server side and put it in a map
Map<String, Channel> userMap = new ConcurrentHashMap<String,Channel>();
//loop over userMap to find specific client
使用用户名设置附件。
//Set the attachment in client side
ctx.getChannel().setAttachment(username);
//Put all channels to a default channel group
//Get all channels, search in their attachments to find specific client
答案 0 :(得分:1)
从您的代码中我怀疑第二个选项使用线性搜索来查找特定频道。第一个选项可以简单地执行get。 (但在这种情况下密钥必须是字符串)
平均线性搜索时间:O(n / 2)
平均hashmap访问时间:O(1)! (有关详细信息,请参阅此posting)
这意味着如果您有更多频道,线性搜索会变得更糟。 hashmap选项更稳定,您可以期待几乎恒定的时间访问。
你能做的是&#34;融合&#34;两个选项,所以你有地图可以轻松访问频道和ChannelGroup来处理困难的东西。您需要做的是在关闭时从地图中删除该通道。
答案 1 :(得分:0)
如何创建一个“UserInfo”对象,该对象包含用户名和相关频道?