Java Spring数据Redis、Expiring和Redis集群
我有一个应用程序使用Java Spring数据Redis、Expiring和Redis集群,java,redis,spring-data-redis,jedis,Java,Redis,Spring Data Redis,Jedis,我有一个应用程序使用 Spring Boot 2.2.6.RELEASE(Spring Boot starter数据redis) 绝地武士3.1.0 我有一个Redis 5.0.7集群,包含6个节点:3个主节点和3个从节点,复制127.0.0.1:7000-7005(只是示例值) 我已按以下方式配置了我的应用程序: @Configuration @EnableRedisRepositories(basePackages = "my.package.of.dtos", en
- Spring Boot 2.2.6.RELEASE(Spring Boot starter数据redis)
- 绝地武士3.1.0
@Configuration
@EnableRedisRepositories(basePackages = "my.package.of.dtos", enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfiguration {
@Bean
JedisConnectionFactory jedisConnectionFactory() {
return new JedisConnectionFactory(
new RedisClusterConfiguration(List.of(
"127.0.0.1:7000",
"127.0.0.1:7001",
"127.0.0.1:7002",
"127.0.0.1:7003",
"127.0.0.1:7004",
"127.0.0.1:7005")));
}
@Bean
public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(jedisConnectionFactory);
return template;
}
}
和存储库:
@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
List<Foo> findByFooIndexedField(String fooIndexedField);
}
不幸的是,给出了相同的结果。尝试使用Redisson库的更多功能和缓存管理、调度 我特别在分布式任务事务中使用它
这里列出了所有功能:结果表明,SpringDataRedis对我来说并不合适。 我对Spring Data Redis的体验:
- 将部分数据过期进程从Redis委托给使用它的应用程序
- 仅当来自一个哈希的数据位于同一群集节点上时才有效
- 当应用程序水平缩放时,它无法正常工作
- 与实际数据大小相比,峰值内存使用量增加了一倍,这是因为它可以保存数据和数据
- 主索引和辅助索引可能会变得非常昂贵
- 将Redis库更改为Jedis,并在此基础上实现了我自己的非常简单的客户端
- 将保存的数据限制到最低限度
- 手动控制所有保存数据的TTL
- 使用
手动控制实体开槽(例如,{PART\u of_KEY}
存在于多个键上,要求所有键都在一个槽上)
- 将单个数据大小从~60KB减少到~60B,消除了所有索引、重复等,从而使我可以瞬间保存比以前多几个数量级的数据
- 利用Redis优化的数据过期功能,没有TTL就不会保存任何数据,因此瞬时内存使用始终是准确的
- 由于只有在需要时才进行选择性的时隙设置,我仍然可以利用集群中的所有节点,但同时我可以利用所有以性能为中心的Redis调用-我从不在多个键上循环Redis调用,因为所有这些调用都可以在具有多个参数的单个调用中完成
免责声明:当我开始做这项工作时,我只知道有关Redis的流行语,我没有意识到它的真正潜力,也没有意识到它的开发人员所设想的用途。起初,这一切似乎都是逆潮流而动,但我越是根据Redis提供的功能调整代码,就越能感受到重新编写代码的效果。我认为Spring Data Read是用于快速原型制作的一个非常棒的工具,但我觉得它的ORM类方法就像是反对AdvyRead提供的。正如您所建议的,我使用ReaSpring Spring DATA22版本3.3.5,创建了<代码> CONFIG/<代码>,用<代码> UECULSTECSEVER()/<代码>设置,添加了带有<代码>地址的节点。"redis://127.0.0.1:7000“,…)并创建了
新RedisonConnectionFactory(config)
bean。然后我用它创建了RedisTemplate
bean。效果是一样的-哈希过期后,我仍然有相同的孤立键剩余。
@Repository
public interface FooRepository extends CrudRepository<Foo, String> {
List<Foo> findByFooIndexedField(String fooIndexedField);
}
@Configuration
@EnableRedisRepositories(basePackages = "my.package.of.dtos", enableKeyspaceEvents = RedisKeyValueAdapter.EnableKeyspaceEvents.ON_STARTUP)
public class RedisConfiguration {
@Bean
public RedissonConnectionFactory redissonConnectionFactory() {
Config config = new Config();
config.useClusterServers().addNodeAddress("redis://127.0.0.1:7000", "redis://127.0.0.1:7001", "redis://127.0.0.1:7002", "redis://127.0.0.1:7003", "redis://127.0.0.1:7004", "redis://127.0.0.1:7005");
return new RedissonConnectionFactory(config);
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedissonConnectionFactory redissonConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redissonConnectionFactory);
return template;
}
}