将通用 Redis 代码转换为 Azure Redis 缓存
Converting generic redis code to Azure Cache for Redis
我有以下 Spring 会话代码:
@Bean
public LettuceConnectionFactory connectionFactory() {
String hostName = AcmeProperty.getProperty("spring.redis.host", "localhost");
int port = Integer.parseInt(AcmeProperty.getProperty("spring.redis.port", "6379"));
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(hostName, port);
return new LettuceConnectionFactory(redisStandaloneConfiguration);
}
当我在本地 运行 redis 时,使用以下设置工作得很好:
spring.redis.host=localhost
spring.redis.port=6379
然而,当我使用 Azure Cache for Redis 时设置如下:
spring.redis.host=acmedev.redis.cache.windows.net
spring.redis.port=6380
我收到此警告并且应用挂起:
WARN (org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration:166) || - Unable to obtain SessionCookieConfig: Section 4.4 of the Servlet 3.0 specification does not permit this method to be called from a ServletContextListener that was not defined in web.xml, a web-fragment.xml file nor annotated with @WebListener
我需要更改什么才能使其与 Azure Redis 缓存一起使用?
我试过 this code,但同样的事情发生了:
@Bean
public JedisConnectionFactory connectionFactory() {
String hostName = AcmeProperty.getProperty("spring.redis.host", "localhost");
int port = Integer.parseInt(AcmeProperty.getProperty("spring.redis.port", "6379"));
String password = AcmeProperty.getProperty("spring.redis.password");
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLParameters sslParameters = new SSLParameters();
sslParameters.setEndpointIdentificationAlgorithm("HTTPS");
sslParameters.setProtocols(new String[]{"TLSv1.2"});
String uriStr = String.format("rediss://%s:%s", hostName, port);
URI uri = URI.create(uriStr);
JedisShardInfo shardInfo = new JedisShardInfo(uri, sslSocketFactory, sslParameters, null);
shardInfo.setPassword(password);
return new JedisConnectionFactory(shardInfo);
}
您需要使用XML Spring配置; Java 配置将不起作用。参见 "Unable to obtain SessionCookieConfig"。
<util:constant id="configureRedisAction"
static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>
<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"
p:configureRedisAction-ref="configureRedisAction"/>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="200" />
<property name="maxIdle" value="50" />
<property name="maxWaitMillis" value="30000" />
<property name="minIdle" value="10"/>
</bean>
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${spring.redis.host}" />
<property name="port" value="${spring.redis.port}" />
<property name="poolConfig" ref="jedisPoolConfig" />
<property name="usePool" value="true" />
<property name="useSsl" value="${spring.redis.ssl}"/>
<property name="password" value="${spring.redis.password}"/>
</bean>
我有以下 Spring 会话代码:
@Bean
public LettuceConnectionFactory connectionFactory() {
String hostName = AcmeProperty.getProperty("spring.redis.host", "localhost");
int port = Integer.parseInt(AcmeProperty.getProperty("spring.redis.port", "6379"));
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(hostName, port);
return new LettuceConnectionFactory(redisStandaloneConfiguration);
}
当我在本地 运行 redis 时,使用以下设置工作得很好:
spring.redis.host=localhost
spring.redis.port=6379
然而,当我使用 Azure Cache for Redis 时设置如下:
spring.redis.host=acmedev.redis.cache.windows.net
spring.redis.port=6380
我收到此警告并且应用挂起:
WARN (org.springframework.session.config.annotation.web.http.SpringHttpSessionConfiguration:166) || - Unable to obtain SessionCookieConfig: Section 4.4 of the Servlet 3.0 specification does not permit this method to be called from a ServletContextListener that was not defined in web.xml, a web-fragment.xml file nor annotated with @WebListener
我需要更改什么才能使其与 Azure Redis 缓存一起使用?
我试过 this code,但同样的事情发生了:
@Bean
public JedisConnectionFactory connectionFactory() {
String hostName = AcmeProperty.getProperty("spring.redis.host", "localhost");
int port = Integer.parseInt(AcmeProperty.getProperty("spring.redis.port", "6379"));
String password = AcmeProperty.getProperty("spring.redis.password");
SSLSocketFactory sslSocketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
SSLParameters sslParameters = new SSLParameters();
sslParameters.setEndpointIdentificationAlgorithm("HTTPS");
sslParameters.setProtocols(new String[]{"TLSv1.2"});
String uriStr = String.format("rediss://%s:%s", hostName, port);
URI uri = URI.create(uriStr);
JedisShardInfo shardInfo = new JedisShardInfo(uri, sslSocketFactory, sslParameters, null);
shardInfo.setPassword(password);
return new JedisConnectionFactory(shardInfo);
}
您需要使用XML Spring配置; Java 配置将不起作用。参见 "Unable to obtain SessionCookieConfig"。
<util:constant id="configureRedisAction"
static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>
<context:annotation-config/>
<bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"
p:configureRedisAction-ref="configureRedisAction"/>
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="200" />
<property name="maxIdle" value="50" />
<property name="maxWaitMillis" value="30000" />
<property name="minIdle" value="10"/>
</bean>
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${spring.redis.host}" />
<property name="port" value="${spring.redis.port}" />
<property name="poolConfig" ref="jedisPoolConfig" />
<property name="usePool" value="true" />
<property name="useSsl" value="${spring.redis.ssl}"/>
<property name="password" value="${spring.redis.password}"/>
</bean>