spring-mvc中通过JedisSentinelPool配置redis数据库.
1、配置单节点的reidis服务器
<beans >
<bean id ="jedisPoolConfig" class ="redis.clients.jedis.JedisPoolConfig" >
<property name ="maxTotal" value ="${redis.pool.maxTotal}" />
<property name ="maxIdle" value ="${redis.pool.maxIdle}" />
<property name ="numTestsPerEvictionRun" value ="${redis.pool.numTestsPerEvictionRun}" />
<property name ="timeBetweenEvictionRunsMillis" value ="${redis.pool.timeBetweenEvictionRunsMillis}" />
<property name ="minEvictableIdleTimeMillis" value ="${redis.pool.minEvictableIdleTimeMillis}" />
<property name ="softMinEvictableIdleTimeMillis" value ="${redis.pool.softMinEvictableIdleTimeMillis}" />
<property name ="maxWaitMillis" value ="${redis.pool.maxWaitMillis}" />
<property name ="testOnBorrow" value ="${redis.pool.testOnBorrow}" />
<property name ="testWhileIdle" value ="${redis.pool.testWhileIdle}" />
<property name ="blockWhenExhausted" value ="${redis.pool.blockWhenExhausted}" />
</bean >
<bean id ="jedisConnectionFactory" class ="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
<property name ="hostName" value ="${redis.host1}" />
<property name ="port" value ="${redis.port1}" />
<property name ="timeout" value ="${redis.timeout}" />
<property name ="password" value ="${redis.password}" />
<property name ="poolConfig" ref ="jedisPoolConfig" />
</bean >
<bean id ="jedisTemplate" class ="org.springframework.data.redis.core.RedisTemplate" >
<property name ="connectionFactory" ref ="jedisConnectionFactory" />
</bean >
<bean id ="redisCacheService" class =" com.can.core.service.RedisCacheService" >
<property name ="redisTemplate" ref ="jedisTemplate" />
</bean >
</beans >
2、配置主从配置的reidis服务器
同单节点配置相差不多,主要是
jedisConnectionFactory 中有所不同
注意:
主从redis配置中从节点配置的并不是从redis的服务器信息,而是sentiles哨兵的配置信息
<bean id ="sentinelConfiguration" class ="org.springframework.data.redis.connection.RedisSentinelConfiguration" >
<property name ="master" >
<bean class ="org.springframework.data.redis.connection.RedisNode" >
<property name ="name" value ="${redis.host1.hostname}" />
</bean >
</property >
<property name ="sentinels" >
<set >
<bean class ="org.springframework.data.redis.connection.RedisNode" >
<constructor-arg value ="${redis.host1.sentinels.host1}" > </constructor-arg >
<constructor-arg value ="${redis.host1.sentinels.port1}" > </constructor-arg >
</bean >
</set >
</property >
</bean >
<bean id ="jedisConnectionFactory" class ="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" >
<property name ="hostName" value ="${redis.host1}" />
<property name ="port" value ="${redis.port1}" />
<property name ="timeout" value ="${redis.timeout}" />
<property name ="password" value ="${redis.password}" />
<constructor-arg ref ="sentinelConfiguration" />
<constructor-arg ref ="jedisPoolConfig" />
</bean >
<bean id ="jedisTemplate" class ="org.springframework.data.redis.core.RedisTemplate" >
<property name ="connectionFactory" ref ="jedisConnectionFactory" />
</bean >
<bean id ="redisCacheService" class =" com.can.core.service.RedisCacheService" >
<property name ="redisTemplate" ref ="jedisTemplate" />
</bean >
总结:
第一次配置Jedis主从节点时特别容易将sentils配置成从节点的redis服务器信息,这样导致的后果运行的程序错误,提示“
Cannot get master address from sentinel running @ 192.168.. :6380. ”或者“
All sentinels down, cannot determine where is master master is running “。猜测可能原因是Jedis执行了哨兵模式中
sentinel get-master-addr-by-name 获取主redis信息导致的。我是在两台机器上分别配置了主redis和从redis,并在从redis服务器上设定了sentinel服务,在程序运行之前,请确保sentinel服务在运行,确保那个shell窗口没有关掉。