java - 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,是否有办法防止创建此索引或删除存储的值?
任何帮助表示赞赏。
解决方案
我找到了解决问题的可能方法。您可以设置存储库选项来跟踪条目的 TTL 达到 0 的事件。
@EnableRedisRepositories(enableKeyspaceEvents
= EnableKeyspaceEvents.ON_STARTUP)
这将使 Spring Data Redis 跟踪被刷新的条目,因此它会更新作为索引的条目。
但是,这将在您的系统上引入一些额外的处理,因此您应该注意它并评估使用是否RedisRepository
有意义。
在我们的例子中,我们决定RedisTemplate
直接使用类,以避免任何额外的开销或不受控制的处理。
如果您有兴趣了解我们如何修复它的所有细节,您可以阅读我写的这篇文章。
https://engineering.salesforce.com/lessons-learned-using-spring-data-redis-f3121f89bff9
推荐阅读
- php - 计算php中的子数组
- ios - Swift - 将 Google AdMob 与我的应用程序集成时遇到问题
- python - 如何在 Tkinter Python 中的 .place() 几何方法中的条目小部件中使用 ipadx 和 ipady
- asp.net - 基于数据库查询asp.net vb从服务器中删除文件
- node.js - 使用正确的 oauth2 凭据通过 NodeJS 使用 Passport.js 连接到 AzureDevops
- python - 如何在 loc 返回的列中获取行的子字符串?
- r - 数据表 R 中的调色板
- typescript - TypeScript 中只读的不可变数据
- mysql - 使用 REPLACE 函数而不是 CASE 语句时 MySQL 查询运行缓慢
- jquery - Quill 编辑器和 Flexbox 元素