【Redis】Java操作Redis:Jedis 基本操作及连接池

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();
	}
}
  •  

猜你喜欢

转载自blog.csdn.net/qq_33762302/article/details/114274720