Skip to content

Latest commit

 

History

History
99 lines (56 loc) · 1.91 KB

28.百万级别聊天室,服务端channel是如何存放的(3).md

File metadata and controls

99 lines (56 loc) · 1.91 KB

28.百万级别聊天室,服务端channel是如何存放的(3)

百万级别聊天室,服务端channel是如何存放的 ???

channel能不能存到Redis ?

channel不可以存储到Redis,它的底层是操作系统文件描述符,还会设计到TCP的链路。

那存到Redis里面的是什么呢?

是channel的坐标,机器IP和端口,以及channel双向绑定的session id

public class SessionCache implements Serializable {

   private String userId;

   private String sessionId;

   private ImNode node;
}

这个Session就是存放在redis中的数据。

当然了,用户可能不止一个通道,

public class UserCache {

    private String userId;

    // session id
    private Map<String, SessionCache> map = new LinkedHashMap<String, SessionCache>(10);
}

如何操作这些Session ?

操作SessionCache的接口

public interface SessionCacheDAO {

    void save(SessionCache s);

    SessionCache get(String sessionId);

    void remove(String sessionId);
}

操作UserCache的接口

public interface UserCacheDAO {

    void save(UserCache u);

    void remove(String userId, String sessionId);

    void addSession(String userId, SessionCache s);

    UserCache get(String userId);
}

使用分布式Session的场景

1. 登录成功之后,添加Session

  • 创建本地Session
  • 创建SessionCache (sessionId, node)
  • 创建UserCache (userId, sessionCache)

2. 用户下线时,删除Session

几乎和上面👆创建Session相关 :

  • 删除UserCache中的SessionCache: removeSession(userId, sessionId)
  • 删除Redis中的SessionCache: remove(sessionId)
  • 删除本地Session: clear(sessionId)

3. 消息转发

  • 根据用户id,找到所有服务器上的该用户的会话列表
  • 为每一个会话转发消息

其他

如果是千万级别,服务端的Channel存储应该做什么优化呢?