1
+ package com .redis .romsmultiaclaccount .config ;
2
+
3
+ import java .time .Duration ;
4
+
5
+ import org .apache .commons .logging .Log ;
6
+ import org .apache .commons .logging .LogFactory ;
7
+ import org .springframework .beans .factory .annotation .Qualifier ;
8
+ import org .springframework .boot .autoconfigure .condition .ConditionalOnThreading ;
9
+ import org .springframework .boot .autoconfigure .data .redis .RedisProperties ;
10
+ import org .springframework .boot .autoconfigure .thread .Threading ;
11
+ import org .springframework .boot .context .properties .EnableConfigurationProperties ;
12
+ import org .springframework .context .annotation .Bean ;
13
+ import org .springframework .context .annotation .Configuration ;
14
+ import org .springframework .context .annotation .Primary ;
15
+ import org .springframework .core .task .SimpleAsyncTaskExecutor ;
16
+ import org .springframework .data .redis .connection .RedisStandaloneConfiguration ;
17
+ import org .springframework .data .redis .connection .jedis .JedisClientConfiguration ;
18
+ import org .springframework .data .redis .connection .jedis .JedisConnectionFactory ;
19
+ import org .springframework .data .redis .core .RedisOperations ;
20
+ import org .springframework .data .redis .core .StringRedisTemplate ;
21
+ import org .springframework .data .redis .core .mapping .RedisMappingContext ;
22
+ import org .springframework .lang .Nullable ;
23
+
24
+ import com .google .gson .GsonBuilder ;
25
+ import com .redis .om .spring .CustomRedisKeyValueTemplate ;
26
+ import com .redis .om .spring .RedisJSONKeyValueAdapter ;
27
+ import com .redis .om .spring .RedisOMProperties ;
28
+ import com .redis .om .spring .client .RedisModulesClient ;
29
+ import com .redis .om .spring .indexing .RediSearchIndexer ;
30
+ import com .redis .om .spring .ops .RedisModulesOperations ;
31
+ import com .redis .om .spring .vectorize .Embedder ;
32
+
33
+ @ Configuration
34
+ @ EnableConfigurationProperties (
35
+ { RedisProperties .class }
36
+ )
37
+ public class RedisConnectionFactoryConfig {
38
+
39
+ private static final Log logger = LogFactory .getLog (RedisConnectionFactoryConfig .class );
40
+
41
+ private final RedisProperties redisProperties ;
42
+
43
+ public RedisConnectionFactoryConfig (RedisProperties redisProperties ) {
44
+ this .redisProperties = redisProperties ;
45
+ }
46
+
47
+ @ Bean (
48
+ name = "writeJedisConnectionFactory"
49
+ )
50
+ @ ConditionalOnThreading (
51
+ Threading .PLATFORM
52
+ )
53
+ public JedisConnectionFactory writeJedisConnectionFactory () {
54
+ return createJedisConnectionFactory ("userA" , "passwordA" );
55
+ }
56
+
57
+ @ Bean (
58
+ name = "writeJedisConnectionFactoryVirtual"
59
+ )
60
+ @ ConditionalOnThreading (
61
+ Threading .VIRTUAL
62
+ )
63
+ public JedisConnectionFactory writeJedisConnectionFactoryVirtual () {
64
+ JedisConnectionFactory factory = createJedisConnectionFactory ("userA" , "passwordA" );
65
+ SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor ("redis-write-" );
66
+ executor .setVirtualThreads (true );
67
+ factory .setExecutor (executor );
68
+ return factory ;
69
+ }
70
+
71
+ @ Primary
72
+ @ Bean (
73
+ name = "readJedisConnectionFactory"
74
+ )
75
+ public JedisConnectionFactory readJedisConnectionFactory () {
76
+ return createJedisConnectionFactory ("userB" , "passwordB" );
77
+ }
78
+
79
+ private JedisConnectionFactory createJedisConnectionFactory (String username , String password ) {
80
+ RedisStandaloneConfiguration config = new RedisStandaloneConfiguration (redisProperties .getHost (), redisProperties
81
+ .getPort ());
82
+ config .setDatabase (redisProperties .getDatabase ());
83
+ config .setUsername (username );
84
+ config .setPassword (password );
85
+
86
+ JedisClientConfiguration clientConfig = JedisClientConfiguration .builder ().connectTimeout (Duration .ofMillis (
87
+ redisProperties .getTimeout ().toMillis ())).build ();
88
+
89
+ return new JedisConnectionFactory (config , clientConfig );
90
+ }
91
+
92
+ @ Bean (
93
+ name = "writeRedisModulesClient"
94
+ )
95
+ public RedisModulesClient writeRedisModulesClient (@ Qualifier (
96
+ "writeJedisConnectionFactory"
97
+ ) JedisConnectionFactory factory , @ Qualifier (
98
+ "omGsonBuilder"
99
+ ) GsonBuilder builder ) {
100
+ return new RedisModulesClient (factory , builder );
101
+ }
102
+
103
+ @ Bean (
104
+ name = "readRedisModulesClient"
105
+ )
106
+ public RedisModulesClient readRedisModulesClient (@ Qualifier (
107
+ "readJedisConnectionFactory"
108
+ ) JedisConnectionFactory factory , @ Qualifier (
109
+ "omGsonBuilder"
110
+ ) GsonBuilder builder ) {
111
+ return new RedisModulesClient (factory , builder );
112
+ }
113
+
114
+ @ Bean (
115
+ name = "writeRedisModulesOperations"
116
+ )
117
+ public RedisModulesOperations <?> writeRedisModulesOperations (@ Qualifier (
118
+ "writeRedisModulesClient"
119
+ ) RedisModulesClient client , @ Qualifier (
120
+ "writeJedisConnectionFactory"
121
+ ) JedisConnectionFactory factory , @ Qualifier (
122
+ "omGsonBuilder"
123
+ ) GsonBuilder builder ) {
124
+ return new RedisModulesOperations <>(client , new StringRedisTemplate (factory ), builder );
125
+ }
126
+
127
+ @ Bean (
128
+ name = "readRedisModulesOperations"
129
+ )
130
+ public RedisModulesOperations <?> readRedisModulesOperations (@ Qualifier (
131
+ "readRedisModulesClient"
132
+ ) RedisModulesClient client , @ Qualifier (
133
+ "readJedisConnectionFactory"
134
+ ) JedisConnectionFactory factory , @ Qualifier (
135
+ "omGsonBuilder"
136
+ ) GsonBuilder builder ) {
137
+ return new RedisModulesOperations <>(client , new StringRedisTemplate (factory ), builder );
138
+ }
139
+
140
+ @ Bean (
141
+ name = "writeRedisOperations"
142
+ )
143
+ public RedisOperations <String , String > writeRedisOperations (@ Qualifier (
144
+ "writeJedisConnectionFactory"
145
+ ) JedisConnectionFactory factory ) {
146
+ return new StringRedisTemplate (factory );
147
+ }
148
+
149
+ @ Bean (
150
+ name = "readRedisOperations"
151
+ )
152
+ public RedisOperations <String , String > readRedisOperations (@ Qualifier (
153
+ "readJedisConnectionFactory"
154
+ ) JedisConnectionFactory factory ) {
155
+ return new StringRedisTemplate (factory );
156
+ }
157
+
158
+ @ Bean (
159
+ name = "writeKeyValueTemplate"
160
+ )
161
+ public CustomRedisKeyValueTemplate getWriteRedisJSONKeyValueTemplate (@ Qualifier (
162
+ "writeRedisOperations"
163
+ ) RedisOperations <?, ?> redisOps , @ Qualifier (
164
+ "writeRedisModulesOperations"
165
+ ) RedisModulesOperations <?> redisModulesOperations , @ Qualifier (
166
+ "redisEnhancedMappingContext"
167
+ ) RedisMappingContext mappingContext , RediSearchIndexer indexer , @ Qualifier (
168
+ "omGsonBuilder"
169
+ ) GsonBuilder gsonBuilder , RedisOMProperties properties , @ Nullable @ Qualifier (
170
+ "featureExtractor"
171
+ ) Embedder embedder ) {
172
+ return new CustomRedisKeyValueTemplate (new RedisJSONKeyValueAdapter (redisOps , redisModulesOperations ,
173
+ mappingContext , indexer , gsonBuilder , embedder , properties ), mappingContext );
174
+ }
175
+
176
+ @ Bean (
177
+ name = "readKeyValueTemplate"
178
+ )
179
+ public CustomRedisKeyValueTemplate getReadRedisJSONKeyValueTemplate (@ Qualifier (
180
+ "readRedisOperations"
181
+ ) RedisOperations <?, ?> redisOps , @ Qualifier (
182
+ "readRedisModulesOperations"
183
+ ) RedisModulesOperations <?> redisModulesOperations , @ Qualifier (
184
+ "redisEnhancedMappingContext"
185
+ ) RedisMappingContext mappingContext , RediSearchIndexer indexer , @ Qualifier (
186
+ "omGsonBuilder"
187
+ ) GsonBuilder gsonBuilder , RedisOMProperties properties , @ Nullable @ Qualifier (
188
+ "featureExtractor"
189
+ ) Embedder embedder ) {
190
+ return new CustomRedisKeyValueTemplate (new RedisJSONKeyValueAdapter (redisOps , redisModulesOperations ,
191
+ mappingContext , indexer , gsonBuilder , embedder , properties ), mappingContext );
192
+ }
193
+
194
+ @ Primary
195
+ @ Bean (
196
+ name = "redisModulesOperations"
197
+ )
198
+ public RedisModulesOperations <?> redisModulesOperationsAlias (@ Qualifier (
199
+ "readRedisModulesOperations"
200
+ ) RedisModulesOperations <?> readOps ) {
201
+ return readOps ;
202
+ }
203
+ }
0 commit comments