天天看點

淘淘商城20_redis的使用03_通過jedis連接配接redis一、通過jedis連接配接redis單機版二、jedis與spring整合三、通過jedis連接配接redis叢集版

一、通過jedis連接配接redis單機版

1. 在taotao-content-service工程建立dao包,因為jedis是直接連接配接的資料庫,是以是dao

淘淘商城20_redis的使用03_通過jedis連接配接redis一、通過jedis連接配接redis單機版二、jedis與spring整合三、通過jedis連接配接redis叢集版

2. 建立接口JedisClient.java和實作類JedisClientSingle.java

JedisClient.java

package com.taotao.content.dao;

public interface JedisClient {
	//set方法
	public String set(String key, String value);
	//get方法
	public String get(String key);
	//删除key      del
	public long del(String key);
	//hset方法
	public long hset(String hkey, String key, String value);
	//hget方法
	public String hget(String hkey, String key);
	//删除Hashkey    hdel
	public long hdel(String hkey, String key);
	//生命周期
	public long expire(String key, int second);
	//查詢剩餘生命周期
	public long ttl(String key);
	//自增
	public long incr(String key);
    //判斷key是否存在
	public boolean exists(String key);
}
           

JedisClientSingle.java 

package com.taotao.content.dao.impl;

import org.springframework.beans.factory.annotation.Autowired;

import com.taotao.content.dao.JedisClient;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class JedisClientSingle implements JedisClient {

	@Autowired
	private JedisPool jedisPool;
	
	/**
	 * set
	 */
	@Override
	public String set(String key, String value) {
		Jedis jedis = jedisPool.getResource();
		String str = jedis.set(key, value);
		jedis.close();
		return str;
	}

	/**
	 * get
	 */
	@Override
	public String get(String key) {
		Jedis jedis = jedisPool.getResource();
		String str = jedis.get(key);
		jedis.close();
		return str;
	}

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

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

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

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

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

	/**
	 * 删除key
	 */
	@Override
	public long del(String key) {
		Jedis jedis = jedisPool.getResource();
		Long ss = jedis.del(key);
		jedis.close();
		return ss;
	}

	/**
	 * 删除hashkey
	 */
	@Override
	public long hdel(String hkey, String key) {
		Jedis jedis = jedisPool.getResource();
		Long ss = jedis.hdel(hkey, key);
		jedis.close();
		return ss;
	}

    /**
	 * 判斷key是否存在
	 */
	@Override
	public boolean exists(String key) {
		Jedis jedis = jedisPool.getResource();
		boolean boo = jedis.exists(key);
		jedis.close();
		return boo;
	}

}
           

3. 添加jedis的依賴

淘淘商城20_redis的使用03_通過jedis連接配接redis一、通過jedis連接配接redis單機版二、jedis與spring整合三、通過jedis連接配接redis叢集版

4.測試(jedis沒有與spring整合)

package com.taotao.test;

import org.junit.Test;

import redis.clients.jedis.Jedis;

public class JedisTest {
	// 測試單機版
	@Test
	public void testJedisSingle() {
		// 建立jedis的對象
		Jedis jedis = new Jedis("192.168.1.105", 6379);
		// 建立jedis對象的方法,方法名稱和redis的指令一緻
		jedis.set("key1", "jedis test");
		String js = jedis.get("key1");
		System.out.println(js);
		// 關閉jedis
		jedis.close();
	}
}
           

5.外部連接配接不上redis的解決方法

由于linux防火牆預設開啟,redis的服務端口6379并不在開放規則之内,所有需要将此端口開放通路或者關閉防火牆。

關閉防火牆指令:sevice iptables stop

如果是修改防火牆規則,可以修改:vim /etc/sysconfig/iptables檔案,添加redis的端口

6. 使用連接配接池連接配接

通過單執行個體連接配接redis不能對redis連接配接進行共享,可以使用連接配接池對redis連接配接進行共享,提高資源使用率,使用jedisPool連接配接redis服務,如下代碼:

// 使用連接配接池連接配接redis
	@Test
	public void testJedisPool() {
		// 建立連接配接池
		JedisPool pool = new JedisPool("192.168.1.105", 6379);
		// 擷取jedis對象
		Jedis jedis = pool.getResource();
		// 擷取資料
		String string = jedis.get("key1");
		System.out.println(string);
		// 關閉jedis
		jedis.close();
		// 關閉連接配接池
		pool.close();
	}
           

7. 使用jedis連接配接redis叢集

開啟redis叢集服務,關閉防火牆測試

/**
	 * 叢集測試
	 * <p>
	 * Title: testJedisClster
	 * </p>
	 * <p>
	 * Description:
	 * </p>
	 */
	@Test
	public void testJedisCluster() {
		HashSet<HostAndPort> nodes = new HashSet<>();
		nodes.add(new HostAndPort("192.168.1.105", 7001));
		nodes.add(new HostAndPort("192.168.1.105", 7002));
		nodes.add(new HostAndPort("192.168.1.105", 7003));
		nodes.add(new HostAndPort("192.168.1.105", 7004));
		nodes.add(new HostAndPort("192.168.1.105", 7005));
		nodes.add(new HostAndPort("192.168.1.105", 7006));
		// 放入多個節點
		JedisCluster cluster = new JedisCluster(nodes);
		cluster.set("key2", "1000");
		String string = cluster.get("key2");
		System.out.println(string);
		cluster.close();// 關閉
	}
           

二、jedis與spring整合

1. 建立配置檔案applicationContext-jedis.xml 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
	
	     <!-- 連接配接池配置 可以不加-->
	    <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.1.105"></constructor-arg>
			<constructor-arg name="port" value="6379"></constructor-arg>
	        <constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
		</bean>
		
		<bean id="jedisClient" class="com.taotao.content.dao.impl.JedisClientSingle"/>
</beans>
           

2. 測試

淘淘商城20_redis的使用03_通過jedis連接配接redis一、通過jedis連接配接redis單機版二、jedis與spring整合三、通過jedis連接配接redis叢集版

JedisClientSingleTest

package com.taotao.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.taotao.content.dao.impl.JedisClientSingle;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class JedisClientSingleTest {

	@Test
	public void JedisClientSingleTest(){
		ApplicationContext context = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-*.xml");
		JedisPool pool =  (JedisPool) context.getBean("redisClient");
		Jedis jedis = pool.getResource();
		jedis.set("text", "10000");
		System.out.println(jedis.get("text"));
		jedis.close();
		pool.close();
	}
}
           

三、通過jedis連接配接redis叢集版

1. applicationContext-jedis.xml (可以單機版放到一起)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
	http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
	http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
	http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">
	
	<!-- 連接配接池配置 -->
	    <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>
		
	     	<!-- 叢集版搭建 -->
 	<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.1.105"></constructor-arg>
					<constructor-arg name="port" value="7001"></constructor-arg>
				</bean>
				<bean  class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.1.105"></constructor-arg>
					<constructor-arg name="port" value="7002"></constructor-arg>
				</bean>
				<bean  class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.1.105"></constructor-arg>
					<constructor-arg name="port" value="7003"></constructor-arg>
				</bean>
				<bean  class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.1.105"></constructor-arg>
					<constructor-arg name="port" value="7004"></constructor-arg>
				</bean>
				<bean  class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.1.105"></constructor-arg>
					<constructor-arg name="port" value="7005"></constructor-arg>
				</bean>
				<bean class="redis.clients.jedis.HostAndPort">
					<constructor-arg name="host" value="192.168.1.105"></constructor-arg>
					<constructor-arg name="port" value="7006"></constructor-arg>
				</bean>
			</set>
		</constructor-arg>
		<constructor-arg name="poolConfig" ref="jedisPoolConfig"></constructor-arg>
	</bean> 

	<bean id="jedisClientCluster" class="com.taotao.content.dao.impl.JedisClientCluster"></bean>
	     
</beans>
           

2. JedisClientCluster.java

淘淘商城20_redis的使用03_通過jedis連接配接redis一、通過jedis連接配接redis單機版二、jedis與spring整合三、通過jedis連接配接redis叢集版
package com.taotao.content.dao.impl;

import org.springframework.beans.factory.annotation.Autowired;

import com.taotao.content.dao.JedisClient;

import redis.clients.jedis.JedisCluster;

public class JedisClientCluster implements JedisClient {

	@Autowired
	private JedisCluster jedisCluster;
	
	// 叢集版本不用關閉jedis
	@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 long hset(String hkey, String key, String value) {
		return jedisCluster.hset(hkey, key, value);
	}
	
	@Override
	public String hget(String hkey, String key) {
		return jedisCluster.hget(hkey, key);
	}
	
	@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);
	}
	
	@Override
	public long del(String key) {
		return jedisCluster.del(key);
	}
	
	@Override
	public long hdel(String hkey, String key) {
		return jedisCluster.hdel(hkey, key);
	}

}
           

3. 測試

淘淘商城20_redis的使用03_通過jedis連接配接redis一、通過jedis連接配接redis單機版二、jedis與spring整合三、通過jedis連接配接redis叢集版
package com.taotao.test;

import java.io.IOException;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.taotao.content.dao.impl.JedisClientSingle;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPool;

public class JedisClientClusterTest {

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

繼續閱讀