Skip to content

Commit bed8b4f

Browse files
authored
feat(memories): support redis memory the underlying implementation of jedis, lettuce, and redisson in both standalone and cluster modes (alibaba#1934)
1 parent 569192e commit bed8b4f

25 files changed

+2407
-499
lines changed

auto-configurations/spring-ai-alibaba-autoconfigure-memory/pom.xml

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@
6969
<groupId>org.springframework.boot</groupId>
7070
<artifactId>spring-boot-starter-test</artifactId>
7171
<scope>test</scope>
72+
<exclusions>
73+
<exclusion>
74+
<groupId>org.objenesis</groupId>
75+
<artifactId>objenesis</artifactId>
76+
</exclusion>
77+
</exclusions>
7278
</dependency>
7379

7480
<dependency>
@@ -91,6 +97,19 @@
9197
<optional>true</optional>
9298
</dependency>
9399

100+
<dependency>
101+
<groupId>org.redisson</groupId>
102+
<artifactId>redisson</artifactId>
103+
<version>${redisson.version}</version>
104+
<optional>true</optional>
105+
</dependency>
106+
107+
<dependency>
108+
<groupId>io.lettuce</groupId>
109+
<artifactId>lettuce-core</artifactId>
110+
<optional>true</optional>
111+
</dependency>
112+
94113
<dependency>
95114
<groupId>com.alibaba.cloud.ai</groupId>
96115
<artifactId>spring-ai-alibaba-starter-memory-redis</artifactId>

auto-configurations/spring-ai-alibaba-autoconfigure-memory/src/main/java/com/alibaba/cloud/ai/autoconfigure/memory/RedisChatMemoryAutoConfiguration.java

Lines changed: 0 additions & 51 deletions
This file was deleted.

auto-configurations/spring-ai-alibaba-autoconfigure-memory/src/main/java/com/alibaba/cloud/ai/autoconfigure/memory/RedisChatMemoryProperties.java

Lines changed: 0 additions & 79 deletions
This file was deleted.
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright 2024-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.alibaba.cloud.ai.autoconfigure.memory.redis;
18+
19+
import com.alibaba.cloud.ai.autoconfigure.memory.ChatMemoryAutoConfiguration;
20+
import com.alibaba.cloud.ai.memory.redis.JedisRedisChatMemoryRepository;
21+
import org.slf4j.Logger;
22+
import org.slf4j.LoggerFactory;
23+
import org.springframework.boot.autoconfigure.AutoConfiguration;
24+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
26+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
27+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
28+
import org.springframework.context.annotation.Bean;
29+
import redis.clients.jedis.Jedis;
30+
31+
/**
32+
* Auto-configuration for Redis Chat Memory using Jedis.
33+
*
34+
* @author Jast
35+
* @author benym
36+
*/
37+
@AutoConfiguration(before = ChatMemoryAutoConfiguration.class)
38+
@ConditionalOnClass({ JedisRedisChatMemoryRepository.class, Jedis.class })
39+
@EnableConfigurationProperties(RedisChatMemoryProperties.class)
40+
@ConditionalOnProperty(name = "spring.ai.memory.redis.client-type", havingValue = "jedis")
41+
public class JedisRedisChatMemoryConnectionAutoConfiguration
42+
extends RedisChatMemoryConnectionAutoConfiguration<JedisRedisChatMemoryRepository> {
43+
44+
private static final Logger logger = LoggerFactory.getLogger(JedisRedisChatMemoryConnectionAutoConfiguration.class);
45+
46+
public JedisRedisChatMemoryConnectionAutoConfiguration(RedisChatMemoryProperties properties,
47+
RedisChatMemoryConnectionDetails connectionDetails) {
48+
super(properties, connectionDetails);
49+
}
50+
51+
@Override
52+
@Bean
53+
@ConditionalOnMissingBean
54+
protected JedisRedisChatMemoryRepository buildRedisChatMemoryRepository() {
55+
return super.buildRedisChatMemoryRepository();
56+
}
57+
58+
@Override
59+
protected JedisRedisChatMemoryRepository createStandaloneChatMemoryRepository(
60+
RedisChatMemoryStandaloneConfiguration standaloneConfiguration) {
61+
logger.info("Configuring Redis Standalone chat memory repository using Jedis");
62+
return JedisRedisChatMemoryRepository.builder()
63+
.host(standaloneConfiguration.hostName())
64+
.port(standaloneConfiguration.port())
65+
.username(standaloneConfiguration.username())
66+
.password(standaloneConfiguration.password())
67+
.timeout(standaloneConfiguration.timeout())
68+
.build();
69+
}
70+
71+
@Override
72+
protected JedisRedisChatMemoryRepository createClusterChatMemoryRepository(
73+
RedisChatMemoryClusterConfiguration clusterConfiguration) {
74+
logger.info("Configuring Redis Cluster chat memory repository using Jedis");
75+
return JedisRedisChatMemoryRepository.builder()
76+
.nodes(clusterConfiguration.nodeAddresses())
77+
.username(clusterConfiguration.username())
78+
.password(clusterConfiguration.password())
79+
.timeout(clusterConfiguration.timeout())
80+
.build();
81+
}
82+
83+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright 2023-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.alibaba.cloud.ai.autoconfigure.memory.redis;
17+
18+
import com.alibaba.cloud.ai.autoconfigure.memory.ChatMemoryAutoConfiguration;
19+
import com.alibaba.cloud.ai.memory.redis.LettuceRedisChatMemoryRepository;
20+
import io.lettuce.core.RedisClient;
21+
import org.slf4j.Logger;
22+
import org.slf4j.LoggerFactory;
23+
import org.springframework.boot.autoconfigure.AutoConfiguration;
24+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
26+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
27+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
28+
import org.springframework.context.annotation.Bean;
29+
30+
/**
31+
* Auto-configuration for Redis Chat Memory using Lettuce.
32+
*
33+
* @author benym
34+
* @date 2025/7/31 16:23
35+
*/
36+
@AutoConfiguration(before = ChatMemoryAutoConfiguration.class)
37+
@ConditionalOnClass({ LettuceRedisChatMemoryRepository.class, RedisClient.class })
38+
@EnableConfigurationProperties(RedisChatMemoryProperties.class)
39+
@ConditionalOnProperty(name = "spring.ai.memory.redis.client-type", havingValue = "lettuce")
40+
public class LettuceRedisChatMemoryConnectionAutoConfiguration
41+
extends RedisChatMemoryConnectionAutoConfiguration<LettuceRedisChatMemoryRepository> {
42+
43+
private static final Logger logger = LoggerFactory
44+
.getLogger(LettuceRedisChatMemoryConnectionAutoConfiguration.class);
45+
46+
public LettuceRedisChatMemoryConnectionAutoConfiguration(RedisChatMemoryProperties properties,
47+
RedisChatMemoryConnectionDetails connectionDetails) {
48+
super(properties, connectionDetails);
49+
}
50+
51+
@Override
52+
@Bean
53+
@ConditionalOnMissingBean
54+
protected LettuceRedisChatMemoryRepository buildRedisChatMemoryRepository() {
55+
return super.buildRedisChatMemoryRepository();
56+
}
57+
58+
@Override
59+
protected LettuceRedisChatMemoryRepository createStandaloneChatMemoryRepository(
60+
RedisChatMemoryStandaloneConfiguration standaloneConfiguration) {
61+
logger.info("Configuring Redis Standalone chat memory repository using Lettuce");
62+
return LettuceRedisChatMemoryRepository.builder()
63+
.host(standaloneConfiguration.hostName())
64+
.port(standaloneConfiguration.port())
65+
.username(standaloneConfiguration.username())
66+
.password(standaloneConfiguration.password())
67+
.timeout(standaloneConfiguration.timeout())
68+
.build();
69+
}
70+
71+
@Override
72+
protected LettuceRedisChatMemoryRepository createClusterChatMemoryRepository(
73+
RedisChatMemoryClusterConfiguration clusterConfiguration) {
74+
logger.info("Configuring Redis Cluster chat memory repository using Lettuce");
75+
return LettuceRedisChatMemoryRepository.builder()
76+
.nodes(clusterConfiguration.nodeAddresses())
77+
.username(clusterConfiguration.username())
78+
.password(clusterConfiguration.password())
79+
.timeout(clusterConfiguration.timeout())
80+
.build();
81+
}
82+
83+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Copyright 2023-2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package com.alibaba.cloud.ai.autoconfigure.memory.redis;
17+
18+
import org.springframework.boot.autoconfigure.AutoConfiguration;
19+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
20+
import org.springframework.boot.autoconfigure.data.redis.RedisConnectionDetails;
21+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
22+
import org.springframework.context.annotation.Bean;
23+
import org.springframework.context.annotation.Import;
24+
25+
/**
26+
* Auto-configuration for Redis Memory support.
27+
*
28+
* @author benym
29+
* @date 2025/7/30 23:35
30+
*/
31+
@AutoConfiguration
32+
@EnableConfigurationProperties(RedisChatMemoryProperties.class)
33+
@Import({ JedisRedisChatMemoryConnectionAutoConfiguration.class,
34+
LettuceRedisChatMemoryConnectionAutoConfiguration.class,
35+
RedissonRedisChatMemoryConnectionAutoConfiguration.class })
36+
public class RedisChatMemoryAutoConfiguration {
37+
38+
@Bean
39+
@ConditionalOnMissingBean(RedisConnectionDetails.class)
40+
RedisChatMemoryConnectionDetails redisChatMemoryConnectionDetails(RedisChatMemoryProperties properties) {
41+
return new RedisChatMemoryConnectionDetails(properties);
42+
}
43+
44+
}

0 commit comments

Comments
 (0)