Predixy完美的实现了对redis单例模式及集群模式的支持,几乎完整的实现了redis原生的所有用于客户端的命令。多key命令、列表阻塞操作、发布订阅、脚本、扫描等高级功能全支持,在使用redis单例模式下也支持事物。
简单来说 Predixy代理redis优点很多,但是因为安全性的原因Predixy会禁用一些redis的命令,比如:

当你的服务启动时或者运行时使用了redis以上命令,就会抛出以下异常:
Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'enableRedisKeyspaceNotificationsInitializer' defined in class path resource [org/springframework/session/data/redis/config/annotation/web/http/RedisHttpSessionConfiguration.class]:Invocation of init method failed; nested exception is java.lang.IllegalStateException: Unable to configure Redis to keyspace notifications.See http://docs.spring.io/spring-session/docs/current/reference/html5/#api-redisoperationssessionrepository-sessiondestroyedeventCaused by: redis.clients.jedis.exceptions.JedisDataException: ERR unknown command config
如果redis不使用Predixy代理时,遇到此问题只需要在redis服务命令行中执行
redis-cli configsetnotify-keyspace-events Egx
即可解决。
但使用了Predixy代理时,再设置服务端就自相矛盾了,那只能想办法让spring session不再执行config命令,解决办法:需要在Spring配置文件中加上一个配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <bean class="org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration"/>
<bean class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="localhost" />
<property name="password" value="your-password" />
<property name="port" value="6379" />
<property name="database" value="10" />
</bean>
<!-- 让Spring Session不再执行config命令 -->
<util:constant static-field="org.springframework.session.data.redis.config.ConfigureRedisAction.NO_OP"/>
</beans>
这时有的同学就开始骂娘了,我们现在都使用springboot了,没人配置spring的配置文件了,都使用spring bean容器托管了,那该怎么在代码中实现呢?
那我们就把这个constant放到bean中去托管
@Configuration
public class RedisHttpSessionConfiguration{
@Bean
public ConfigureRedisAction getConfigureRedisAction (){ return ConfigureRedisAction.NO_OP}
}