我平时在工作中一般使用java来操作redis,java中操作redis的资源叫做jedis和redis-cli一样都是客户端,jedis的版本和redis的版本并不对应,本例中redis是3.0而jedis是2.8,jedis也可以操作集群。
如果使用java操作redis需要注意两点:
1:所连接的服务器上的防火墙必须关闭
2:如果redis.conf中设置了ip绑定则java所在服务器的ip地址必须在绑定的范围之内
一:pom.xml中的配置。
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.8.0</version>
</dependency>
直接创建一个jedis
/**
* 单链接
*/
@Test
public void testJedis() {
//获取redis链接
Jedis jedis = new Jedis(host, port);
//通过命令来操作redis
jedis.set("name", "jack");
String name = jedis.get("name");
//:关闭redis链接
jedis.close();
}
连接池
使用单实例来创建管理jedis
package online.redis;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisTools {
/**
* 私有构造器
*/
private RedisTools(){};
private static JedisPool JEDIS_POOL = null;
/**
* 从连接池中获取链接
* @return
*/
public static synchronized Jedis getJedis()
{
if(null == JEDIS_POOL)
{
//1:获取连接池类
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//2:设置最大空闲连接数
jedisPoolConfig.setMaxIdle(10);
//3:设置最大连接数
jedisPoolConfig.setMaxTotal(100);
//4:设置创建链接的超时时间
jedisPoolConfig.setMaxWaitMillis(3000);
//5:设置创建连接时是否会测试链接是否可用
jedisPoolConfig.setTestOnBorrow(true);
//6:获取连接池,在其中指定ip和端口
JEDIS_POOL = new JedisPool(jedisPoolConfig, "192.168.79.128", 6379);
}
//7:从连接池中获取一个链接
return JEDIS_POOL.getResource();
}
/**
* 返回链接
* @param jedis
*/
public static void returnResource(Jedis jedis)
{
if(null != jedis)
{
jedis.close();
}
}
}
使用junit调用redis从连接池获取链接并使用
@Test
public void testJedisPool()
{
//1:从jedis连接池中获取链接
Jedis jedis = RedisTools.getJedis();
//2:操作redis数据库
jedis.set("name", "Tom1");
jedis.expireAt("name", 1471849200);
System.out.println(jedis.get("name") + " " + jedis.ttl("name")/(3600*24) + " days");
//3:返回链接资源
RedisTools.returnResource(jedis);
}
close方法
此方法被调用时如果是从连接池中获取的连接则返回此连接,如果是new的jedis连接则关闭。
@Override
public void close() {
if (dataSource != null) {
if (client.isBroken()) {
this.dataSource.returnBrokenResource(this);
} else {
this.dataSource.returnResource(this);
}
} else {
client.close();
}
}