Манипулировать с кешем, как с коллекцией в Spring

Я много чего просматривал в интернете, но не нашел решения для своих нужд.

Вот пример кода, который не работает, но показывает мои требования для лучшего понимания.

@Service
public class FooCachedService {

    @Autowired
    private MyDataRepository dataRepository;

    private static ConcurrentHashMap<Long, Object> cache = new ConcurrentHashMap<>();

    public void save(Data data) {
        Data savedData = dataRepository.save(data);
        if (savedData.getId() != null) {
            cache.put(data.getRecipient(), null);
        }
    }

    public Data load(Long recipient) {
        Data result = null;

        if (!cache.containsKey(recipient)) {
            result = dataRepository.findDataByRecipient(recipient);
            if (result != null) {
                cache.remove(recipient);
                return result;
            }
        }

        while (true) {
            try {
                if (cache.containsKey(recipient)) {
                    result = dataRepository.findDataByRecipient(recipient);
                    break;
                }
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        return result;
    }
}

и объект данных:

public class Data {
    private Long id;
    private Long recipient;
    private String payload;

    // getters and setters
}

Как видно из приведенного выше кода, мне нужен сервис, который будет хранить новые данные в базе данных, а также в кеше.

Весь алгоритм должен выглядеть примерно так:

Некоторые пользователи создают запрос POST к моему контроллеру для хранения данных и запускают метод сохранения моего сервиса.

Другой пользователь B, вошедший в систему, отправляет запрос GET на мой контроллер, который запускает метод загрузки моего сервиса. В этом методе сравнивается идентификатор зарегистрированного пользователя, который отправил запрос, с идентификаторами получателей на карте. Если карта содержит данные для этого пользователя, они выбираются с помощью репозитория, иначе алгоритм проверяет каждую секунду, есть ли новые данные для этого пользователя (эта проверка будет через некоторое время, например, 30 с, а после 30 с запрос вернет пустые данные, и пользователь создаст новый ПОЛУЧИТЬ запрос и тд...)

Можете ли вы сказать мне, если это возможно, сделать это каким-то элегантным способом и как? Как использовать кеш для этого или какова лучшая практика для этого? Я новичок в этой области, поэтому буду благодарен за любые советы.

0 ответов

Другие вопросы по тегам