Манипулировать с кешем, как с коллекцией в 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 с запрос вернет пустые данные, и пользователь создаст новый ПОЛУЧИТЬ запрос и тд...)
Можете ли вы сказать мне, если это возможно, сделать это каким-то элегантным способом и как? Как использовать кеш для этого или какова лучшая практика для этого? Я новичок в этой области, поэтому буду благодарен за любые советы.