一、通过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();
}
}