Сохранение / получение списка или записей в / из REDIS Cache - PullRequest
1 голос
/ 04 апреля 2020

У меня есть данные (как указано ниже), которые хранятся в POJO (EquityFeeds):

externalTransactionId,clientId,transactionType,transactionDate,marketValue,sourceSystem,priorityFlag,processingFee
SAPEXTXN1,GS,BUY,23/11/13,101.9,BLO,Y,0
SAPEXTXN2,AS,SELL,20/11/13,121.9,BLO,N,0
SAPEXTXN3,AP,DEPOSIT,19/11/13,120,BLO,Y,0
SAPEXTXN4,HJ,WITHDRAW,30/11/13,230,BLO,N,0
SAPEXTXN5,GS,WITHDRAW,26/11/13,330,BLO,Y,0
SAPEXTXN6,AP,SELL,25/11/13,100,BLO,Y,0
SAPEXTXN7,AS,BUY,06/11/13,121.1,BLO,N,0

Я храню данные в моем основном приложении в кеше REDIS. Код:

@Override
 public void saveClientId(EquityFeeds equityFeeds) {
        System.out.println("Saving ClientId in RedisCache : "+equityFeeds.getClientId());
        hashOperations.put("CLIENTID", equityFeeds.getClientId(), equityFeeds);
 }

 @Override
 public List<EquityFeeds> findByClientId(String clientId) {
        System.out.println("Client Id search in REDIS repository: "+clientId);
        return (List<EquityFeeds>) hashOperations.multiGet("CLIENTID", Arrays.asList(clientId));

 }

Теперь я создал контроллер REST для получения данных через API REST. Код:

@GetMapping("/getByClientId/{clientId}")
public Optional<List<EquityFeeds>> getByClientId(@PathVariable("clientId") final String clientId) {

Optional<List<EquityFeeds>> cId = Optional.ofNullable(equityFeedsRedisRepositoryImpl.findByClientId(clientId));

        if(cId.isPresent()) {
            return cId;
        } else {
            cId.orElseThrow(() -> new RuntimeException("Client Id not found"));
        }
      return cId;
 }

Проблема: Теперь проблема в том, что у меня может быть несколько строк с то же самое clientId для, например, в примере данных из CSV, показанном выше, у меня есть 2 записи с одинаковым clientId 'AP'. Мое требование состоит в том, чтобы он отображал несколько записей с заданным clientId при вызове сопоставления API REST из браузера. Он должен показать все записи, которые там есть.

Сейчас он показывает ТОЛЬКО (одну) последнюю запись для данного clientId, что понятно, так как по концепции ha sh последняя запись будет перезаписывать предыдущую запись (поскольку hashKey - например, «AP» одно и то же), и он будет показывать одну и ТОЛЬКО одну запись, которая будет самой последней.

Теперь, как решить эту проблему? Можно ли это решить с помощью hashOperations? Просьба предложить способ решения вышеуказанного требования.

1 Ответ

1 голос
/ 06 апреля 2020

Я решил вышеупомянутую проблему, используя RedisList. Ниже приведен код:

private ListOperations listOperations;

 public EquityFeedsRedisRepositoryImpl(RedisTemplate<String, EquityFeeds> redisTemplate) {
        this.redisTemplate = redisTemplate;
        this.hashOperations = redisTemplate.opsForHash();
        this.listOperations = redisTemplate.opsForList();
 }

@Override
public void saveClientId(EquityFeeds equityFeeds) {
 System.out.println("Saving ClientId in RedisCache : "+equityFeeds.getClientId());
 listOperations.rightPush(equityFeeds.getClientId(), equityFeeds);
}

@Override
public List<EquityFeeds> findByClientId(String clientId) {
    System.out.println("Client Id search in REDIS repository: "+clientId);
    return (List<EquityFeeds>) listOperations.range(clientId, 0, -1);
}

REST Controller для получения данных через код API REST.

@GetMapping("/getByClientId/{clientId}")
 public Optional<List<EquityFeeds>> getByClientId(@PathVariable("clientId") final String clientId) {

  Optional<List<EquityFeeds>> cId = Optional.ofNullable(equityFeedsRedisRepositoryImpl.findByClientId(clientId));

        if(cId.isPresent()) {
            return cId;
        } else {
            cId.orElseThrow(() -> new RuntimeException("Client Id not found"));
        }

        return cId;
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...