Java 操作 Redis 主要有两种方式:Jedis 和 RedisTemplate。Jedis 是 Redis 官方推荐的面向 Java 操作 Redis 的客户端开发Jar包;而 RedisTemplate 是 Spring 框架对 Jedis API 的进行了高度封装,支持连接池自动管理。
PS:redis-cli.exe是Redis官方提供的客户端,可以看作一个shell程序,它可以发送命令对redis进行操作;对于Jedis而言,同理是使用Java语言操作Redis,相当于Mysql驱动。Jedis提供了很多接口供Java语言调用。可以在Redis官网下载,当然还有一些开源爱好者提供的客户端,如Jredis、SRP等等。
本篇我们先来看 Jedis。简单来说,Jedis就是Redis官方推荐的Java连接开发工具。在Java中,Redis对应于Jedis就相当于关系数据库对应于JDBC。
Jedis的依赖如下:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
1.基本操作
使用Jedis连接Redis的简单示例
// 连接Redis(第一个参数是Redis的IP地址,第二个参数是Redis的端口号)
Jedis jedis = new Jedis("localhost", 6379);
// 在redis中放入一个字符串
jedis.set("msg", "Hello World!");
// 在redis获取一个字符串
String msg = jedis.get("msg");
System.out.println(msg); // 打印"Hello World!"
// 关闭Redis连接
jedis.close();
方法 | 解释 |
---|---|
new Jedis(host, port) | 创建jedis对象,参数host是redis服务器地址,参数port是redis服务端口 |
set(key,value) | 设置字符串类型的数据 |
get(key) | 获得字符串类型的数据 |
hset(key,field,value) | 设置哈希类型的数据 |
hget(key,field) | 获得哈希类型的数据 |
lpush(key,values) | 设置列表类型的数据 |
lpop(key) | 列表左面弹栈 |
rpop(key) | 列表右面弹栈 |
sadd(key, value) | 设置Set类型数据 |
zadd(key, score,value) | 设置ZSet类型数据 |
del(key) | 删除指定的key |
更多示例可以参考这篇…
2.连接池 JedisPool
因为资源的创建与销毁是很消耗程序性能的,所以Jedis提供了连接池机制。在生产环境中需要向Jedis连接池获取对Redis的连接,Jedis的连接池类为redis.clients.jedis.JedisPool
。
public static void main(String[] args){
// 1、获得连接池配置对象,设置配置项
JedisPoolConfig config = new JedisPoolConfig();
config.setMaxTotal(20); // 最大连接数
config.setMaxIdle(10); // 最大空闲连接数
config.setMaxWaitMillis(3000); // 最大等待时间
// 2.初始化连接池
// 注:这里也可以省略ip和port不写,默认是localhost和6379
JedisPool jedisPool = new JedisPool(config,"43.105.136.120",6379);
// 3.从连接池中获取到一个连接
Jedis jedis = jedisPool.getResource();
// 4.操作函数同上
jedis.set("hello","world");
System.out.println(jedis.get("hello"));
// 5.关闭当前连接,返回连接池
jedis.close();
}
这里再说一下JedisPool的属性配置(JedisPoolConfig):
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 连接超时时是否阻塞,false时报异常,ture阻塞直到超时, 默认true
jedisPoolConfig.setBlockWhenExhausted(true);
// 逐出策略(默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数))
jedisPoolConfig.setEvictionPolicyClassName("org.apache.commons.pool2.impl.DefaultEvictionPolicy");
// 最大空闲连接数, 默认8个
jedisPoolConfig.setMaxIdle(8);
// 最大连接数, 默认8个
jedisPoolConfig.setMaxTotal(8);
// 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
jedisPoolConfig.setMaxWaitMillis(-1);
// 逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
jedisPoolConfig.setMinEvictableIdleTimeMillis(1800000);
// 最小空闲连接数, 默认0
jedisPoolConfig.setMinIdle(0);
// 每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
jedisPoolConfig.setNumTestsPerEvictionRun(3);
// 对象空闲多久后逐出, 当空闲时间>该值 且 空闲连接>最大空闲数 时直接逐出,不再根据MinEvictableIdleTimeMillis判断 (默认逐出策略)
jedisPoolConfig.setSoftMinEvictableIdleTimeMillis(1800000);
// 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
jedisPoolConfig.setMaxWaitMillis(100);
// 对拿到的connection进行validateObject校验
jedisPoolConfig.setTestOnBorrow(true);
// 在进行returnObject对返回的connection进行validateObject校验
jedisPoolConfig.setTestOnReturn(true);
// 定时对线程池中空闲的链接进行validateObject校验
jedisPoolConfig.setTestWhileIdle(true);
3.自定义 JedisUtil
# jedisConf.properties
jedis.host=43.105.136.120
jedis.port=6379
jedis.maxTotal=30
jedis.maxIdle=10
public class JedisUtils {
private static JedisPool jp;
static {
// 加载Jedis连接池配置参数。这里需要提前写好配置文件 jedisConf.properties
InputStream is = JedisUtils.class.getResourceAsStream("jedisConf.properties");
Properties prop = new Properties();
try {
prop.load(is);
} catch (IOException e) {
e.printStackTrace();
}
String host = prop.getProperty("jedis.host");
int port = Integer.parseInt(prop.getProperty("jedis.port"));
int maxTotal = Integer.parseInt(prop.getProperty("jedis.maxTotal"));
int maxIdle = Integer.parseInt(prop.getProperty("jedis.maxIdle"));
// 设置Jedis连接池参数
JedisPoolConfig jpc = new JedisPoolConfig();
jpc.setMaxTotal(maxTotal);
jpc.setMaxIdle(maxIdle);
// 初始化Jedis连接池
jp = new JedisPool(jpc, host, port);
}
// 从Jedis连接池获取连接
public static Jedis getJedis() {
return jp.getResource();
}
}