public Mono<Set<Long>> queryGroupMemberIds(@NotNull Long groupId, boolean preferCache) {
        try {
            Validator.notNull(groupId, "groupId");
        } catch (ResponseException e) {
            return Mono.error(e);
        }
        if (isMemberCacheEnabled) {
            if (preferCache) {
                Map<GroupMember.Key, GroupMember> keyToMember =
                        groupIdToMembersCache.getIfPresent(groupId);
                if (keyToMember != null) {
                    Collection<GroupMember> members = keyToMember.values();
                    Set<Long> memberIds = CollectionUtil.newSetWithExpectedSize(members.size());
                    for (GroupMember member : members) {
                        memberIds.add(member.getKey()
                                .getUserId());
                    }
                    return Mono.just(memberIds);
                }
            }
            return queryGroupMembers(groupId, false).map(members -> {
                Set<Long> memberIds = CollectionUtil.newSetWithExpectedSize(members.size());
                for (GroupMember member : members) {
                    memberIds.add(member.getKey()
                            .getUserId());
                }
                return memberIds;
            });
        }
        Recyclable<Set<Long>> recyclableSet = SetRecycler.obtain();
        return groupMemberRepository.findMemberIdsByGroupId(groupId)
                .collect(Collectors.toCollection(recyclableSet::getValue))
                .map(CollectionUtil::newSet)
                .doFinally(signalType -> recyclableSet.recycle());
    }
@return Possible codes: {@link ResponseStatusCode#OK}
        {@link ResponseStatusCode#SEND_MESSAGE_TO_MUTED_GROUP}
        {@link ResponseStatusCode#SEND_MESSAGE_TO_INACTIVE_GROUP}
        {@link ResponseStatusCode#MUTED_GROUP_MEMBER_SEND_MESSAGE}
turms-service/src/main/java/im/turms/service/domain/group/service/GroupMemberService.java