1. 程式人生 > >jedis整合spring單機版和叢集版

jedis整合spring單機版和叢集版

1.1.1  Redis-cli

自帶客戶端。使用最多的。

1.1.1  圖形化介面客戶端


只支援單機版,不支援叢集。


1.1.1  Jedis客戶端

1.1.1.1        單機版


public class JedisTest {

	@Test
	public void testJedisSingle() {
		//建立一個jedis的物件。
		Jedis jedis = new Jedis("192.168.25.153", 6379);
		//呼叫jedis物件的方法,方法名稱和redis的命令一致。
		jedis.set("key1", "jedis test");
		String string = jedis.get("key1");
		System.out.println(string);
		//關閉jedis。
		jedis.close();
	}
	
	/**
	 * 使用連線池
	 */
	@Test
	public void testJedisPool() {
		//建立jedis連線池
		JedisPool pool = new JedisPool("192.168.25.153", 6379);
		//從連線池中獲得Jedis物件
		Jedis jedis = pool.getResource();
		String string = jedis.get("key1");
		System.out.println(string);
		//關閉jedis物件
		jedis.close();
		pool.close();
	}
}


1.1.1.1        叢集版

@Test
	public void testJedisCluster() {
		HashSet<HostAndPort> nodes = new HashSet<>();
		nodes.add(new HostAndPort("192.168.25.153", 7001));
		nodes.add(new HostAndPort("192.168.25.153", 7002));
		nodes.add(new HostAndPort("192.168.25.153", 7003));
		nodes.add(new HostAndPort("192.168.25.153", 7004));
		nodes.add(new HostAndPort("192.168.25.153", 7005));
		nodes.add(new HostAndPort("192.168.25.153", 7006));
		
		JedisCluster cluster = new JedisCluster(nodes);
		
		cluster.set("key1", "1000");
		String string = cluster.get("key1");
		System.out.println(string);
		
		cluster.close();
	}

1  業務邏輯中新增快取

需要在taotao-rest工程中新增快取。

1.1   jedis整合spring

1.1.1  單機版整合

1.1.1.1        配置

<!-- 連線池配置 -->

      <bean id="jedisPoolConfig"class="redis.clients.jedis.JedisPoolConfig">

           <!-- 最大連線數-->

           <property name="maxTotal"value="30"/>

           <!-- 最大空閒連線數 -->

           <property name="maxIdle"value="10"/>

           <!-- 每次釋放連線的最大數目 -->

           <property name="numTestsPerEvictionRun"value="1024"/>

           <!-- 釋放連線的掃描間隔(毫秒) -->

           <property name="timeBetweenEvictionRunsMillis"value="30000"/>

           <!-- 連線最小空閒時間 -->

           <property name="minEvictableIdleTimeMillis"value="1800000"/>

           <!-- 連線空閒多久後釋放, 當空閒時間>該值 且 空閒連線>最大空閒連線數時直接釋放 -->

           <property name="softMinEvictableIdleTimeMillis"value="10000"/>

           <!-- 獲取連線時的最大等待毫秒數,小於零:阻塞不確定的時間,預設-1 -->

           <property name="maxWaitMillis"value="1500"/>

           <!-- 在獲取連線的時候檢查有效性, 預設false -->

           <property name="testOnBorrow"value="true"/>

           <!-- 在空閒時檢查有效性, 預設false -->

           <property name="testWhileIdle"value="true"/>

           <!-- 連線耗盡時是否阻塞, false報異常,ture阻塞直到超時, 預設true -->

           <property name="blockWhenExhausted"value="false"/>

      </bean>   

      <!-- jedis客戶端單機版 -->

      <bean id="redisClient"class="redis.clients.jedis.JedisPool">

           <constructor-arg name="host"value="192.168.25.153"></constructor-arg>

           <constructor-arg name="port"value="6379"></constructor-arg>

           <constructor-arg name="poolConfig"ref="jedisPoolConfig"></constructor-arg>

      </bean>

1.1.1.1        測試

/**
	 * 單機版測試
	 * <p>Title: testSpringJedisSingle</p>
	 * <p>Description: </p>
	 */
	@Test
	public void testSpringJedisSingle() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
		JedisPool pool = (JedisPool) applicationContext.getBean("redisClient");
		Jedis jedis = pool.getResource();
		String string = jedis.get("key1");
		System.out.println(string);
		jedis.close();
		pool.close();
	}

1.1.1  叢集版整合

1.1.1.1        配置

<bean id="redisClient" class="redis.clients.jedis.JedisCluster">

           <constructor-arg name="nodes">

                 <set>

                      <bean class="redis.clients.jedis.HostAndPort">

                            <constructor-arg name="host"value="192.168.25.153"></constructor-arg>

                            <constructor-arg name="port"value="7001"></constructor-arg>

                      </bean>

                      <bean class="redis.clients.jedis.HostAndPort">

                            <constructor-arg name="host"value="192.168.25.153"></constructor-arg>

                            <constructor-arg name="port"value="7002"></constructor-arg>

                      </bean>

                      <bean class="redis.clients.jedis.HostAndPort">

                            <constructor-arg name="host"value="192.168.25.153"></constructor-arg>

                            <constructor-arg name="port"value="7003"></constructor-arg>

                      </bean>

                      <bean class="redis.clients.jedis.HostAndPort">

                            <constructor-arg name="host"value="192.168.25.153"></constructor-arg>

                            <constructor-arg name="port"value="7004"></constructor-arg>

                      </bean>

                      <bean class="redis.clients.jedis.HostAndPort">

                            <constructor-arg name="host"value="192.168.25.153"></constructor-arg>

                            <constructor-arg name="port"value="7005"></constructor-arg>

                      </bean>

                      <bean class="redis.clients.jedis.HostAndPort">

                            <constructor-arg name="host"value="192.168.25.153"></constructor-arg>

                            <constructor-arg name="port"value="7006"></constructor-arg>

                      </bean>

                 </set>

           </constructor-arg>

           <constructor-arg name="poolConfig"ref="jedisPoolConfig"></constructor-arg>

      </bean>

1.1.1.1        測試

@Test
	public void testSpringJedisCluster() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
		JedisCluster jedisCluster =  (JedisCluster) applicationContext.getBean("redisClient");
		String string = jedisCluster.get("key1");
		System.out.println(string);
		jedisCluster.close();
	}

1.1   新增jedis dao

1.1.1  單機版


public class JedisClientSingle implements JedisClient{
	
	@Autowired
	private JedisPool jedisPool; 
	
	@Override
	public String get(String key) {
		Jedis jedis = jedisPool.getResource();
		String string = jedis.get(key);
		jedis.close();
		return string;
	}

	@Override
	public String set(String key, String value) {
		Jedis jedis = jedisPool.getResource();
		String string = jedis.set(key, value);
		jedis.close();
		return string;
	}

	@Override
	public String hget(String hkey, String key) {
		Jedis jedis = jedisPool.getResource();
		String string = jedis.hget(hkey, key);
		jedis.close();
		return string;
	}

	@Override
	public long hset(String hkey, String key, String value) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.hset(hkey, key, value);
		jedis.close();
		return result;
	}

	@Override
	public long incr(String key) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.incr(key);
		jedis.close();
		return result;
	}

	@Override
	public long expire(String key, int second) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.expire(key, second);
		jedis.close();
		return result;
	}

	@Override
	public long ttl(String key) {
		Jedis jedis = jedisPool.getResource();
		Long result = jedis.ttl(key);
		jedis.close();
		return result;
	}

}

Spring配置檔案


1.1.1  叢集版

public class JedisClientCluster implements JedisClient {

	@Autowired
	private JedisCluster jedisCluster;
	
	@Override
	public String get(String key) {
		return jedisCluster.get(key);
	}

	@Override
	public String set(String key, String value) {
		return jedisCluster.set(key, value);
	}

	@Override
	public String hget(String hkey, String key) {
		return jedisCluster.hget(hkey, key);
	}

	@Override
	public long hset(String hkey, String key, String value) {
		return jedisCluster.hset(hkey, key, value);
	}

	@Override
	public long incr(String key) {
		return jedisCluster.incr(key);
	}

	@Override
	public long expire(String key, int second) {
		return jedisCluster.expire(key, second);
	}

	@Override
	public long ttl(String key) {
		return jedisCluster.ttl(key);
	}

}

1.1   把快取新增到業務邏輯

注意:快取的新增不能影響正常的業務邏輯。


@Override
	public List<TbContent> getContentList(long contentCid) {
		//從快取中取內容
		try {
			String result = jedisClient.hget(INDEX_CONTENT_REDIS_KEY, contentCid + "");
			if (!StringUtils.isBlank(result)) {
				//把字串轉換成list
				List<TbContent> resultList = JsonUtils.jsonToList(result, TbContent.class);
				return resultList;
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		//根據內容分類id查詢內容列表
		TbContentExample example = new TbContentExample();
		Criteria criteria = example.createCriteria();
		criteria.andCategoryIdEqualTo(contentCid);
		//執行查詢
		List<TbContent> list = contentMapper.selectByExample(example);
		
		//向快取中新增內容
		try {
			//把list轉換成字串
			String cacheString = JsonUtils.objectToJson(list);
			jedisClient.hset(INDEX_CONTENT_REDIS_KEY, contentCid + "", cacheString);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return list;
	}