1. 程式人生 > >redis的哨兵和cluster在java程式碼中的配置

redis的哨兵和cluster在java程式碼中的配置

1.哨兵: applicationContext.xml:

<!-- redis sentinel 配置 -->
	<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">  
        <property name="maxTotal" value="${im.hs.server.redis.maxTotal}" />  
        <property name="minIdle" value="${im.hs.server.redis.minIdle}" />  
        <property name="maxWaitMillis" value="${im.hs.server.redis.maxWaitTime}" />  
        <property name="maxIdle" value="${im.hs.server.redis.maxIdle}" />  
        <property name="testOnBorrow" value="${im.hs.server.redis.testOnBorrow}" />  
        <property name="testOnReturn" value="true" />  
        <property name="testWhileIdle" value="true" />  
    </bean>  
  
    <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="${im.hs.server.redis.sentinel.masterName}"></property>  
            </bean>  
        </property>  
        <property name="sentinels">  
            <set>  
                <bean class="org.springframework.data.redis.connection.RedisNode">  
                    <constructor-arg name="host"  
                        value="${im.hs.server.redis.sentinel1.host}"></constructor-arg>  
                    <constructor-arg name="port"  
                        value="${im.hs.server.redis.sentinel1.port}"></constructor-arg>  
                </bean>  
                <bean class="org.springframework.data.redis.connection.RedisNode">  
                    <constructor-arg name="host"  
                        value="${im.hs.server.redis.sentinel2.host}"></constructor-arg>  
                    <constructor-arg name="port"  
                        value="${im.hs.server.redis.sentinel2.port}"></constructor-arg>  
                </bean>  
                <bean class="org.springframework.data.redis.connection.RedisNode">  
                    <constructor-arg name="host"  
                        value="${im.hs.server.redis.sentinel3.host}"></constructor-arg>  
                    <constructor-arg name="port"  
                        value="${im.hs.server.redis.sentinel3.port}"></constructor-arg>  
                </bean>  
            </set>  
        </property>  
    </bean>  
  
    <bean id="sentinelConnectionFactory"  
        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">  
        <property name="password" value="${im.hs.server.redis.sentinel.password}"></property> 
        <constructor-arg name="sentinelConfig" ref="sentinelConfiguration"></constructor-arg>  
        <constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>  
    </bean>
	<!-- redis sentinel 配置結束 -->

redis-sentinel.properties:

# Redis settings  
#sentinel1的IP和埠  
im.hs.server.redis.sentinel1.host=192.168.126.131
im.hs.server.redis.sentinel1.port=26379
#sentinel2的IP和埠  
im.hs.server.redis.sentinel2.host=192.168.126.132
im.hs.server.redis.sentinel2.port=26380
#sentinel3的IP和埠  
im.hs.server.redis.sentinel3.host=192.168.126.133
im.hs.server.redis.sentinel3.port=26381
#sentinel的鑑權密碼  
im.hs.server.redis.sentinel.masterName=mymaster
im.hs.server.redis.sentinel.password=12345678
#最大閒置連線數  
im.hs.server.redis.maxIdle=500
#最大連線數,超過此連線時操作redis會報錯  
im.hs.server.redis.maxTotal=5000
im.hs.server.redis.maxWaitTime=1000
im.hs.server.redis.testOnBorrow=true
#最小閒置連線數,spring啟動的時候自動建立該數目的連線供應用程式使用,不夠的時候會申請。  
im.hs.server.redis.minIdle=300

測試:

package com.shidebin.mongodb.spring_redis;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.DefaultTypedTuple;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.ListOperations;
import org.springframework.data.redis.core.SetOperations;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.data.redis.core.ZSetOperations.TypedTuple;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.CollectionUtils;

import com.alibaba.fastjson.JSON;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RedisSentinelTest {
	@Autowired
	public ValueOperations<String,String> stringRedisTemplate;
	@Autowired
	public HashOperations<String,String,String> hashRedisTemplate;
	@Autowired
	public ListOperations<String,String> listRedisTemplate;
	@Autowired
	public SetOperations<String,String> setRedisTemplate;
	@Autowired
	public ZSetOperations<String,String> zSetRedisTemplate;
	@Test
	public void set() {
		//set name shidebin
		stringRedisTemplate.set("name", "shidebin");	
		//儲存物件
		User user = User.getUserBuilder().name("shidebin").age(29).sex("男").build();
		String jsonString = JSON.toJSONString(user);
		stringRedisTemplate.set("user:1", jsonString);
		//儲存list
		List<String> list = new ArrayList<String>();
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");
		String listJson = JSON.toJSONString(list);
		stringRedisTemplate.set("list", listJson);
		//儲存map
		Map<String,String> map = new HashMap<String,String>();
		map.put("name", "shidebin");
		map.put("age", "29");
		map.put("phone", "18615412359");
		String mapJson = JSON.toJSONString(map);
		stringRedisTemplate.set("map", mapJson);
		//mset country china city beijing
		stringRedisTemplate.multiSet(map);
	}
	@SuppressWarnings("unchecked")
	@Test
	public void get() {
		//取string
		String name = stringRedisTemplate.get("name");
		System.out.println(name);
		//取物件
		String userStr = stringRedisTemplate.get("user:1");
		User parseObject = JSON.parseObject(userStr, User.class);
		System.out.println(userStr);
		System.out.println(parseObject);
		//取list
		String listStr = stringRedisTemplate.get("list");
		List<String> parseObject2 = JSON.parseArray(listStr, String.class);
		System.out.println(listStr);
		System.out.println(parseObject2);
		//取map
		String mapStr = stringRedisTemplate.get("map");
		Map<String,String> parseObject3 = JSON.parseObject(mapStr, Map.class);
		System.out.println(mapStr);
		System.out.println(parseObject3);
		//mget country city address
		List<String> multiGet = stringRedisTemplate.multiGet(Arrays.asList("name","age","phone"));
		System.out.println(multiGet);
	}
	//hash
	@Test
	public void hSet() {
		Map<String,String> map = new HashMap<String,String>();
		map.put("name", "shidebin");
		map.put("age", "29");
		map.put("phone", "18615412359");
		hashRedisTemplate.putAll("user:2", map);
	}
	@Test
	public void hGet() {
		Map<String, String> entries = hashRedisTemplate.entries("user:2");
		System.out.println(entries);
	}
	//list
	@Test
	public void lpush() {
		List<String> list = new ArrayList<String>();
		list.add("aaa");
		list.add("bbb");
		list.add("ccc");
		listRedisTemplate.leftPushAll("list:1", list);
	}
	@Test
	public void lget() {
		List<String> range = listRedisTemplate.range("list:1", 0, -1);
		System.out.println(range);
	}
	//list
		@Test
		public void sset() {
			List<String> list = new ArrayList<String>();
			list.add("aaa");
			list.add("bbb");
			list.add("ccc");
			setRedisTemplate.add("set:1", list.toArray(new String[] {}));
		}
		@Test
		public void sget() {
			Set<String> members = setRedisTemplate.members("set:1");
			System.out.println(members);
		}
		//list
		@Test
		public void zpush() {
			Set<TypedTuple<String>> set = new HashSet<TypedTuple<String>>();
			TypedTuple<String> tt = new DefaultTypedTuple<String>("shidebin",Double.valueOf(23));
			set.add(tt);
			zSetRedisTemplate.add("zset",set);
		}
		@Test
		public void zget() {
			Set<TypedTuple<String>> rangeWithScores = zSetRedisTemplate.rangeWithScores("zset", 0, -1);
			rangeWithScores.stream().forEach(action -> {
				System.out.println(action.getScore());
				System.out.println(action.getValue());
			});
		}
}

cluster配置: applicationContext.xml:

<!-- cluster 叢集配置 -->
	 <bean id="genericObjectPoolConfig" class="org.apache.commons.pool2.impl.GenericObjectPoolConfig">
        <property name="maxTotal" value="${maxTotal}" />
        <property name="minIdle" value="${minIdle}" />
        <property name="maxIdle" value="${maxIdle}" />
        <property name="maxWaitMillis" value="${maxWaitMillis}" />
        <property name="testOnBorrow" value="${testOnBorrow}" />
    </bean>
	<bean id="jedisCluster" class="com.shidebin.mongodb.spring_redis.JedisClusterFactory">
        <property name="addressConfig" value="classpath:redis-cluster.properties"/>
        <property name="addressKeyPrefix" value="address" />
        <property name="timeout" value="${timeout}" />
        <!--代表叢集有幾臺redis-->
        <property name="maxRedirections" value="${maxRedirections}" />
        <property name="genericObjectPoolConfig" ref="genericObjectPoolConfig" />
    </bean>
	<!-- redis cluster 叢集配置結束 -->

redis_cluster.properties:

address1=192.168.126.128:6379
address2=192.168.126.129:6380
address3=192.168.126.130:6381
address4=192.168.126.131:6389
address5=192.168.126.132:6390
address6=192.168.126.133:6391
#最大連線數
maxTotal=1024
#客戶端超時時間單位是毫秒
timeout=300000
#最大連線數
maxActive=1024
#最小空閒數
minIdle=8
#最大空閒數
maxIdle=100
#最大建立連線等待時間
maxWaitMillis=1000
#redis叢集單位數
maxRedirections=6
testOnBorrow=true

測試:

package com.shidebin.mongodb.spring_redis;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import redis.clients.jedis.JedisCluster;



@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class RedisClusterTest {
	 @Autowired
	 JedisClusterFactory jf;
	 @Test
	 public void testCluster() {
		 JedisCluster jedisCluster = jf.getJedisCluster();
		 String set = jedisCluster.set("abd".getBytes(), "fasdfjklasd".getBytes());
		 System.out.println(set);
	 }
	 
}