覆盖@cacheable注释,因为redis实现内存泄漏

时间:2018-12-04 20:16:40

标签: java spring-boot redis

所以我一直在使用Jedis客户端连接到Java应用程序中的Redis服务器,在生产环境中流量非常高。

问题是springboot的redis实现不适用于redis,我认为hacks redis的工作方式是实现接口,这会导致应用程序内存泄漏。

例如,我使用常见的springboot方法通过@Cacheable注释以这种方式缓存sql查询输出。

  @Cacheable("Catalog")
  @Override
  public Map<Integer, String> getAllTermsOfUse() {
    final MapSqlParameterSource parameters = new MapSqlParameterSource();
    parameters.addValue("language_code", this.userContext.getLocale());

    return this
        .getNamedParameterJdbcTemplate()
        .query(SELECT_ALL_TERMS, parameters, this.termsOfUseResultSetExtractor);
  }

为了具有不同的缓存(在本例中为Catalog缓存),redis创建一个具有名称值的zset(在本例中为Catalog〜keys),并将每个键放入zset中,以保持每个键的映射在目录。

我遇到的问题是我们有无限数量的用uuid创建的键,并且defaultExpiration设置为2分钟。目录键永远不会在一天中的某个时间过期,因为从来没有2分钟的时间间隔未设置键。这会导致明显的内存泄漏。

这是我可能的解决方法:

  1. 不使用@Cacheable。对我来说,这意味着大量的开发工作,我将不得不实现新的注释,重构每个存储库。
  2. 将此zset的到期时间设置为1秒。这些时间可能会在1秒的时间内消失
  3. 使用我自己的实现覆盖@Cacheable(我不知道如何覆盖我一直在寻找有关此信息的注释...
  4. 找出一种不使用缓存名称的方法,就像springboot将它们用于redis一样。

欢迎提出任何建议。

0 个答案:

没有答案