POM文件:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.5.2.RELEASE</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
代码片段演示基于junit进行 。
场景一:单机Redis部署,使用Jedis
配置片段:
<bean id="jedis" class="redis.clients.jedis.Jedis"> <constructor-arg name="host" value="192.168.0.200" /> <constructor-arg name="port" value="6379" /> </bean>
代码片段:
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:spring/scm-cache-redis-config1.xml");
Jedis jedis = (Jedis) context.getBean("jedis");
/**
* 设置连接密码
*/
//jedis.auth("123456");
jedis.set("jedis", "jedis test");
assertEquals("jedis test", jedis.get("jedis"));
场景二:集群Redis部署(主从+读写分离),使用Jedis连接池(JedisPool)
配置片段:
<!--Jedis连接池的相关配置 --> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--新版是maxTotal,旧版是maxActive --> <property name="maxTotal"> <value>1000</value> </property> <property name="maxIdle"> <value>50</value> </property> <property name="testOnBorrow" value="true" /> <property name="testOnReturn" value="true" /> </bean> <!-- Jedis连接池 --> <bean id="jedisPool" class="redis.clients.jedis.JedisPool"> <constructor-arg name="poolConfig" ref="jedisPoolConfig" /> <constructor-arg name="host" value="192.168.0.200" /> <constructor-arg name="port" value="6379" type="int" /> <constructor-arg name="timeout" value="5000" type="int" /> <!--密码和数据库索引配置 <constructor-arg name="password" value="123456" /> <constructor-arg name="database" value="0" type="int" /> --> </bean>
代码片段:
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:spring/scm-cache-redis-config1.xml");
JedisPool jedisPool=(JedisPool) context.getBean("jedisPool");
Jedis jedis=jedisPool.getResource();
jedis.set("jedis pool", "jedis pool test");
assertEquals("jedis pool test", jedis.get("jedis pool"));
场景三:集群Redis部署(主从+读写分离)+哨兵集群
说明:使用spring提供的客户端模板(RedisTemplate)进行数据操作,依赖spring的spring-data-redis-1.5.2.RELEASE.jar
配置片段:
<!-- Jedis连接池的相关配置 --> <bean id="jedisPoolConfig2" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="1024" /> <property name="maxIdle" value="200" /> <property name="numTestsPerEvictionRun" value="1024" /> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <property name="minEvictableIdleTimeMillis" value="30000" /> <property name="softMinEvictableIdleTimeMillis" value="10000" /> <property name="maxWaitMillis" value="1000" /> <property name="testOnBorrow" value="true" /> </bean> <!-- 哨兵配置 --> <bean id="sentinelConfiguration" class="org.springframework.data.redis.connection.RedisSentinelConfiguration"> <property name="master"> <bean class="org.springframework.data.redis.connection.RedisNode"> <!--这个值要和Sentinel中指定的master的值一致,不然启动时找不到Sentinel会报错的 --> <property name="name" value="m1"></property> </bean> </property> <!--记住了,这里是指定Sentinel的IP和端口,不是Master和Slave的 --> <property name="sentinels"> <set> <bean class="org.springframework.data.redis.connection.RedisNode"> <constructor-arg name="host" value="192.168.0.200"></constructor-arg> <constructor-arg name="port" value="26379"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisNode"> <constructor-arg name="host" value="192.168.0.201"></constructor-arg> <constructor-arg name="port" value="26379"></constructor-arg> </bean> <bean class="org.springframework.data.redis.connection.RedisNode"> <constructor-arg name="host" value="192.168.0.202"></constructor-arg> <constructor-arg name="port" value="26379"></constructor-arg> </bean> </set> </property> </bean> <!-- 连接工厂 --> <bean id="redisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"></constructor-arg> <constructor-arg name="poolConfig" ref="jedisPoolConfig2"></constructor-arg> </bean> <!-- redis模板工具类 --> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="redisConnectionFactory"></property> <!-- 解决使用RedisTemplate乱码问题 --> <property name="keySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> </bean>
代码片段:
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:spring/scm-cache-redis-config1.xml");
RedisTemplate redisTemplate=(RedisTemplate) context.getBean("redisTemplate");
redisTemplate.opsForValue().set("xa", "西安");
assertEquals("西安",redisTemplate.opsForValue().get("xa"));
场景四:集群Redis部署(主从+读写分离)+哨兵集群
说明:使用Jedis自带的哨兵池(JedisSentinelPool)进行Jedis资源的管理(类似于JedisPool)
配置片段:
<!-- Jedis连接池的相关配置 --> <bean id="jedisPoolConfig3" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="1024" /> <property name="maxIdle" value="200" /> <property name="numTestsPerEvictionRun" value="1024" /> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <property name="minEvictableIdleTimeMillis" value="30000" /> <property name="softMinEvictableIdleTimeMillis" value="10000" /> <property name="maxWaitMillis" value="1000" /> <property name="testOnBorrow" value="true" /> </bean> <!-- JedisSentinelPool池配置 --> <bean id="jedisSentinelPool" class="redis.clients.jedis.JedisSentinelPool"> <!--这个值要和Sentinel中指定的master的值一致,不然启动时找不到Sentinel会报错的 --> <constructor-arg index="0" value="m1" /> <constructor-arg index="1"> <set> <value>192.168.0.200:26379</value> <value>192.168.0.201:26379</value> <value>192.168.0.202:26379</value> </set> </constructor-arg> <constructor-arg index="2" ref="jedisPoolConfig3" /> </bean>
代码片段:
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:spring/scm-cache-redis-config1.xml");
JedisSentinelPool jedisSentinelPool=(JedisSentinelPool) context.getBean("jedisSentinelPool");
Jedis jedis = null;
try {
jedis = jedisSentinelPool.getResource();
jedis.set("bj", "北京");
assertEquals("北京", jedis.get("bj"));
} catch (Exception e) {
e.printStackTrace();
} finally {
jedisSentinelPool.returnBrokenResource(jedis);
}
jedisSentinelPool.close();
场景五:分片(多Master,独立)+一致性HASH
配置片段:
<!-- Jedis连接池的相关配置 --> <bean id="jedisPoolConfig4" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxTotal" value="1024" /> <property name="maxIdle" value="200" /> <property name="numTestsPerEvictionRun" value="1024" /> <property name="timeBetweenEvictionRunsMillis" value="30000" /> <property name="minEvictableIdleTimeMillis" value="30000" /> <property name="softMinEvictableIdleTimeMillis" value="10000" /> <property name="maxWaitMillis" value="1000" /> <property name="testOnBorrow" value="true" /> </bean> <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool"> <constructor-arg index="0" ref="jedisPoolConfig4" /> <constructor-arg index="1"> <list> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg name="host" value="192.168.0.200" /> <constructor-arg name="name" value="master:200" /> <constructor-arg name="port" value="6379" /> <constructor-arg name="timeout" value="5000" /> <constructor-arg name="weight" value="1" /> <!-- <property name="password" value="123456" /> --> </bean> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg name="host" value="192.168.0.201" /> <constructor-arg name="name" value="master:201" /> <constructor-arg name="port" value="6379" /> <constructor-arg name="timeout" value="5000" /> <constructor-arg name="weight" value="1" /> <!-- <property name="password" value="123456" /> --> </bean> <bean class="redis.clients.jedis.JedisShardInfo"> <constructor-arg name="host" value="192.168.0.202" /> <constructor-arg name="name" value="master:202" /> <constructor-arg name="port" value="6379" /> <constructor-arg name="timeout" value="5000" /> <constructor-arg name="weight" value="1" /> <!-- <property name="password" value="123456" /> --> </bean> </list> </constructor-arg> </bean>
代码片段:
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:spring/scm-cache-redis-config1.xml");
ShardedJedisPool shardedJedisPool=(ShardedJedisPool) context.getBean("shardedJedisPool");
ShardedJedis shardedJedis = shardedJedisPool.getResource();;
try {
shardedJedis.set("cw", "宠物");
assertEquals("宠物", shardedJedis.get("cw"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if(shardedJedis!=null) {
shardedJedis.close();
}
}
场景六:redis+cluster
配置片段:
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg index="0"> <!-- 集群中的任意节点,个数不限 --> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.0.200"/> <constructor-arg name="port" value="7000"/> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.0.200"/> <constructor-arg name="port" value="7001"/> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.0.201"/> <constructor-arg name="port" value="7000"/> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.0.201"/> <constructor-arg name="port" value="7001"/> </bean> </set> </constructor-arg> </bean>
代码片段:
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:spring/scm-cache-redis-config1.xml");
JedisCluster jedisCluster=(JedisCluster) context.getBean("jedisCluster");
try {
jedisCluster.set("mary", "麦瑞");
assertEquals("麦瑞", jedisCluster.get("mary"));
} catch (Exception e) {
e.printStackTrace();
} finally {
if(jedisCluster!=null) {
try {
jedisCluster.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}