zhentao 1 week ago
parent
commit
1bef9ec3a6

+ 73 - 0
src/main/java/com/zhentao/information/cache/GroupChannelCache.java

@@ -0,0 +1,73 @@
+package com.zhentao.information.cache;
+
+import io.netty.channel.group.ChannelGroup;
+import io.netty.channel.group.DefaultChannelGroup;
+import io.netty.util.concurrent.GlobalEventExecutor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 群聊Channel缓存管理类
+ * 用于管理群聊ChannelGroup
+ */
+@Slf4j
+@Component
+public class GroupChannelCache {
+    
+    /**
+     * 群ID和ChannelGroup的映射关系
+     * key: 群ID
+     * value: ChannelGroup
+     */
+    private static final Map<Long, ChannelGroup> GROUP_CHANNEL_MAP = new ConcurrentHashMap<>();
+
+    /**
+     * 添加群聊ChannelGroup
+     * @param groupId 群ID
+     * @return ChannelGroup
+     */
+    public ChannelGroup addGroup(Long groupId) {
+        ChannelGroup channelGroup = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
+        GROUP_CHANNEL_MAP.put(groupId, channelGroup);
+        log.info("群 {} 的ChannelGroup已创建", groupId);
+        return channelGroup;
+    }
+
+    /**
+     * 获取群聊ChannelGroup
+     * @param groupId 群ID
+     * @return ChannelGroup
+     */
+    public ChannelGroup getGroup(Long groupId) {
+        return GROUP_CHANNEL_MAP.get(groupId);
+    }
+
+    /**
+     * 移除群聊ChannelGroup
+     * @param groupId 群ID
+     */
+    public void removeGroup(Long groupId) {
+        GROUP_CHANNEL_MAP.remove(groupId);
+        log.info("群 {} 的ChannelGroup已移除", groupId);
+    }
+
+    /**
+     * 获取所有群聊ChannelGroup
+     * @return 群聊ChannelGroup映射Map
+     */
+    public Map<Long, ChannelGroup> getAllGroups() {
+        return GROUP_CHANNEL_MAP;
+    }
+
+    /**
+     * 判断群聊是否存在
+     * @param groupId 群ID
+     * @return 是否存在
+     */
+    public boolean exists(Long groupId) {
+        return GROUP_CHANNEL_MAP.containsKey(groupId);
+    }
+} 

+ 97 - 0
src/main/java/com/zhentao/information/cache/GroupMemberCache.java

@@ -0,0 +1,97 @@
+package com.zhentao.information.cache;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 群成员缓存管理类
+ * 用于缓存群ID和群成员ID的映射关系
+ */
+@Slf4j
+@Component
+public class GroupMemberCache {
+    
+    /**
+     * 群ID和群成员ID列表的映射关系
+     * key: 群ID
+     * value: 群成员ID列表
+     */
+    private final Map<Long, List<Long>> groupMemberMap = new ConcurrentHashMap<>();
+
+    /**
+     * 更新群成员缓存
+     * @param groupId 群ID
+     * @param memberIds 群成员ID列表
+     */
+    public void updateGroupMembers(Long groupId, List<Long> memberIds) {
+        groupMemberMap.put(groupId, memberIds);
+        log.info("群 {} 的成员缓存已更新,成员数:{}", groupId, memberIds.size());
+    }
+
+    /**
+     * 获取群成员列表
+     * @param groupId 群ID
+     * @return 群成员ID列表
+     */
+    public List<Long> getGroupMembers(Long groupId) {
+        return groupMemberMap.get(groupId);
+    }
+
+    /**
+     * 添加群成员
+     * @param groupId 群ID
+     * @param userId 用户ID
+     */
+    public void addGroupMember(Long groupId, Long userId) {
+        List<Long> members = groupMemberMap.get(groupId);
+        if (members != null && !members.contains(userId)) {
+            members.add(userId);
+            log.info("用户 {} 已添加到群 {} 的成员缓存", userId, groupId);
+        }
+    }
+
+    /**
+     * 移除群成员
+     * @param groupId 群ID
+     * @param userId 用户ID
+     */
+    public void removeGroupMember(Long groupId, Long userId) {
+        List<Long> members = groupMemberMap.get(groupId);
+        if (members != null) {
+            members.remove(userId);
+            log.info("用户 {} 已从群 {} 的成员缓存移除", userId, groupId);
+        }
+    }
+
+    /**
+     * 判断用户是否在群中
+     * @param groupId 群ID
+     * @param userId 用户ID
+     * @return 是否在群中
+     */
+    public boolean isUserInGroup(Long groupId, Long userId) {
+        List<Long> members = groupMemberMap.get(groupId);
+        return members != null && members.contains(userId);
+    }
+
+    /**
+     * 获取所有群成员映射
+     * @return 群成员映射Map
+     */
+    public Map<Long, List<Long>> getAllGroupMembers() {
+        return groupMemberMap;
+    }
+
+    /**
+     * 清除群成员缓存
+     * @param groupId 群ID
+     */
+    public void clearGroupMembers(Long groupId) {
+        groupMemberMap.remove(groupId);
+        log.info("群 {} 的成员缓存已清除", groupId);
+    }
+} 

+ 57 - 0
src/main/java/com/zhentao/information/service/GroupInitService.java

@@ -0,0 +1,57 @@
+package com.zhentao.information.service;
+
+import com.zhentao.groups.dto.GroupDto;
+import com.zhentao.groups.service.GroupsService;
+import com.zhentao.information.cache.GroupMemberCache;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 群聊初始化服务
+ * 用于初始化群成员缓存
+ */
+@Slf4j
+@Service
+public class GroupInitService {
+
+    @Resource
+    private GroupsService groupsService;
+
+    @Resource
+    private GroupMemberCache groupMemberCache;
+
+    /**
+     * 在应用启动时初始化群成员缓存
+     */
+    @PostConstruct
+    public void init() {
+        try {
+            List<GroupDto> groupList = groupsService.getList();
+            groupList.forEach(group -> {
+                groupMemberCache.updateGroupMembers(group.getGroupId(), group.getUid());
+            });
+            log.info("群成员缓存初始化完成,共 {} 个群", groupList.size());
+        } catch (Exception e) {
+            log.error("群成员缓存初始化失败", e);
+        }
+    }
+
+    /**
+     * 刷新群成员缓存
+     */
+    public void refreshGroupMemberCache() {
+        try {
+            List<GroupDto> groupList = groupsService.getList();
+            groupList.forEach(group -> {
+                groupMemberCache.updateGroupMembers(group.getGroupId(), group.getUid());
+            });
+            log.info("群成员缓存刷新完成,共 {} 个群", groupList.size());
+        } catch (Exception e) {
+            log.error("群成员缓存刷新失败", e);
+        }
+    }
+}