一、通過jedis連接配接redis單機版
1. 在taotao-content-service工程建立dao包,因為jedis是直接連接配接的資料庫,是以是dao
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的依賴
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. 測試
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
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. 測試
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();
}
}