【问题标题】:Saving / Retrieving list or records in/ from REDIS Cache在 REDIS 缓存中/从 REDIS 缓存中保存/检索列表或记录
【发布时间】:2020-07-16 11:59:57
【问题描述】:

我有一个存储在 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 控制器来通过 REST API 获取数据 代码:

@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'。我的要求是,当从浏览器调用 REST API 映射时,它应该显示具有给定 clientId 的多条记录。它应该显示所有的记录。

现在它只显示给定 clientId 的(单个)最后一条记录,这是可以理解的,因为根据哈希的概念,最后一条记录将覆盖前一条记录(因为 hashKey - 例如“AP”是相同的)并且它将显示一条且仅一条记录,该记录将是最新的。

现在如何解决这个问题?可以使用 hashOperations 解决吗?请提出解决上述要求的方法。

【问题讨论】:

  • 你考虑过使用 Redis List 吗?
  • @Guy:谢谢。我正要写一篇详细说明我如何使用 Redis List 解决问题的帖子。我已经回答了我的问题,详细说明了我是如何解决上述问题的。

标签: java caching redis


【解决方案1】:

我使用 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 控制器通过 REST API 代码获取数据。

@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;
     }

【讨论】:

    猜你喜欢
    • 2021-07-28
    • 2017-08-21
    • 2020-06-08
    • 2020-04-22
    • 1970-01-01
    • 2018-02-14
    • 2020-09-28
    • 1970-01-01
    • 2018-01-30
    相关资源
    最近更新 更多