首页 > 解决方案 > CRUDRepository 的 Spring Data Redis 问题

问题描述

我和我的团队正在使用带有 Redis 的 CRUD 存储库对其执行一些操作。问题是 Redis 中有一个条目作为索引生成,该索引存储与 Redis 条目关联的键,并且该条目永远不会删除在 TTL 达到 0 时已经刷新的条目。

这是我们使用的代码示例。

@RedisHash("rate")
public class RateRedisEntry implements Serializable {
    @Id
    private String tenantEndpointByBlock; // A HTTP end point
    ...
}

// CRUD repository.
@Repository
public interface RateRepository extends CrudRepository<RateRedisEntry, String> {}

这会在 Redis 中生成条目rate,这是我之前提到的 Set 对象。

当我们检查它的内存使用情况时,它一直在不断增长,直到内存使用量达到 Redis 中可用的 100%。

> MEMORY USAGE "rate"
(integer) 153034
.
.
> MEMORY USAGE "rate"
(integer) 153876
.
.
> MEMORY USAGE "rate"
(integer) 163492

一旦条目的 TTL 达到 0,是否有办法防止创建此索引或删除存储的值?

任何帮助表示赞赏。

标签: javaspringredisspring-dataspring-data-redis

解决方案


我找到了解决问题的可能方法。您可以设置存储库选项来跟踪条目的 TTL 达到 0 的事件。

@EnableRedisRepositories(enableKeyspaceEvents 
    = EnableKeyspaceEvents.ON_STARTUP)

这将使 Spring Data Redis 跟踪被刷新的条目,因此它会更新作为索引的条目。

但是,这将在您的系统上引入一些额外的处理,因此您应该注意它并评估使用是否RedisRepository有意义。

在我们的例子中,我们决定RedisTemplate直接使用类,以避免任何额外的开销或不受控制的处理。

如果您有兴趣了解我们如何修复它的所有细节,您可以阅读我写的这篇文章。

https://engineering.salesforce.com/lessons-learned-using-spring-data-redis-f3121f89bff9


推荐阅读