You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java Core实现跨REST API调用维持内存用户列表状态?

内存跨REST API维持用户列表的实现方案

一、用单例类存储用户列表

你考虑用单例类是完全可行的,因为单例在JVM内是全局唯一的,能保证不同API调用共享同一套数据。这里推荐用枚举实现单例(JVM原生保证线程安全和实例唯一性,比双重检查锁更可靠),同时搭配线程安全的集合来存储用户,避免多线程并发调用时出问题。

示例代码:

import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

// 枚举单例的用户存储类
public enum UserStorage {
    INSTANCE; // 全局唯一实例

    // 用CopyOnWriteArrayList保证多线程下的安全读写(适合读多写少的场景)
    private final List<User> userList = new CopyOnWriteArrayList<>();

    // 添加用户方法
    public void addUser(User user) {
        userList.add(user);
    }

    // 获取所有用户:返回不可变副本,避免外部直接修改内部集合
    public List<User> getAllUsers() {
        return List.copyOf(userList);
    }

    // 可选:根据ID查询单个用户
    public User getUserById(String userId) {
        return userList.stream()
                .filter(user -> user.getId().equals(userId))
                .findFirst()
                .orElse(null);
    }
}

// 简单的User实体类
class User {
    private String id;
    private String name;

    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }

    // getter方法
    public String getId() { return id; }
    public String getName() { return name; }
}

二、在REST API中集成单例存储

以Spring Boot的接口为例,写两个核心API:保存用户和查询用户列表,直接调用单例的方法即可实现状态共享。

示例Controller代码:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {

    // 保存用户的POST接口
    @PostMapping("/users")
    public String addUser(@RequestBody User user) {
        UserStorage.INSTANCE.addUser(user);
        return "用户添加成功";
    }

    // 查询所有用户的GET接口
    @GetMapping("/users")
    public List<User> getAllUsers() {
        return UserStorage.INSTANCE.getAllUsers();
    }
}

调用POST /users添加用户后,再调用GET /users就能获取到之前添加的所有用户,实现跨API调用的状态维持。

三、关键注意事项

  • 线程安全必须重视:绝对不能用普通的ArrayList,多线程并发修改会抛出异常,推荐用CopyOnWriteArrayList或ConcurrentHashMap(如果用ID做键存储)。
  • 数据会随应用重启丢失:这种内存存储是临时的,应用重启后所有用户数据都会清空,如果需要持久化,得搭配数据库或Redis。
  • 集群部署不适用:如果你的服务是多实例集群部署,每个JVM都有自己的单例数据,实例间无法共享,这种情况要改用分布式缓存或数据库来统一存储。
  • 内存容量限制:如果用户量过大,内存存储可能导致OOM,需要定期清理过期数据或扩容JVM内存。

内容的提问来源于stack exchange,提问作者sadia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:12:06