【问题标题】:Redis Cache Query using multiple criteria使用多个条件的 Redis 缓存查询
【发布时间】:2021-07-18 09:44:54
【问题描述】:

我有来自以下电子商务的价格数据。每一行都被视为一个域对象让我们说 PriceInfo

+-----------+----------+-------+------------------+
| ProductId | Provider | Price |       Time       |
+-----------+----------+-------+------------------+
| iphone    | Amazon   |   200 | 13-12-2021 12:50 |
| iphone    | Ebay     |   201 | 13-12-2021 12:50 |
| iphone    | Alibaba  |   202 | 13-12-2021 12:50 |
| GalaxyX2  | Ebay     |   195 | 13-12-2021 12:50 |
| GalaxyX2  | Alibaba  |   196 | 13-12-2021 12:50 |
+-----------+----------+-------+------------------+

客户有兴趣从特定供应商处获取所有价格或从不同供应商处获取单个产品的价格

1.从Ebay获取价格

+-----------+----------+-------+------------------+
| ProductId | Provider | Price |       Time       |
+-----------+----------+-------+------------------+
| iphone    | Ebay     |   201 | 13-12-2021 12:50 |
| GalaxyX2  | Ebay     |   195 | 13-12-2021 12:50 |
+-----------+----------+-------+------------------+

2.获取iphone价格

+-----------+----------+-------+------------------+
| ProductId | Provider | Price |       Time       |
+-----------+----------+-------+------------------+
| iphone    | Amazon   |   200 | 13-12-2021 12:50 |
| iphone    | Ebay     |   201 | 13-12-2021 12:50 |
| iphone    | Alibaba  |   202 | 13-12-2021 12:50 |
+-----------+----------+-------+------------------+

如何定义我的 Redis 缓存键以及如何查询数据库以获得上述 2 个结果?

在保存 pojo 时,我在 java spring boot 项目中使用 Jedis 库进行以下操作:

    public void save(PricingInfo pricingInfo ) {
        template.opsForHash().put(HASH_KEY, pricingInfo.getProductId(), pricingInfo );
    }

【问题讨论】:

标签: java caching redis spring-data-redis


【解决方案1】:

您可以使用RedisReposiroty 来获取这些数据,在 Redis 存储库中您可以定义一个集合为

@RedisHash("productPrice")
public class ProductPrice implements Serializable {
    @Id private String id; // assign id as productId#provider
    @Indexed
    private String productId;
    @Indexed
    private String provider;
    private Double price;
    private Long timestamp;
}

我们在其中添加了两个索引,一个用于 productId,另一个用于 provider。

使用两种方法定义一个 Redis 存储库

@Repository
public interface ProductPriceRepository extends CrudRepository<ProductPrice, String>  {
    List<ProductPrice> findByProductId(String productId);
    List<ProductPrice> findByProvider(String provider);
} 

现在您可以在服务中autowired ProductPriceRepository。

要保存记录,您需要调用repository.save 方法。

【讨论】:

  • 非常感谢您。成功了!
  • 如何在特定时间后使特定条目过期?我可以看到我们可以在模板级别设置过期但使整个哈希过期。我希望哈希的每个条目都过期。
猜你喜欢
  • 1970-01-01
  • 2022-11-13
  • 2013-10-18
  • 2018-06-27
  • 1970-01-01
  • 2022-01-05
  • 2016-12-17
  • 2021-08-29
  • 1970-01-01
相关资源
最近更新 更多