Jedis 客户端

Jedis 客户端

Jedis 简介

Jedis 是一款使用 Java 语言操作 Redis 的客户端,也是 Redis 官方推荐的 Java 客户端。

使用 Jedis 非常简单,首先引入 Jedis 的 jar 包,这里给出 Maven 坐标

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.9.0</version>
</dependency>

使用 Jedis 类似于 JDBC,但是比原生 JDBC 简单很多

  1. 获取连接
Jedis jedis = new Jedis("localhost",6379); // 参数是 Redis 服务器的 IP 地址和 Redis 的端口号,如果不填写,则默认连接本机 Redis,默认端口号 6379
  1. 操作 Redis,Jedis 操作 Redis 的方法名与 Redis 命令行相同,所以使用非常方便
jedis.set("username","zhangsan"); // 存入字符串类型数据
  1. 关闭连接
jedis.close();

Jedis 基本使用

String

Jedis jedis = new Jedis();
jedis.set("username","zhangsan");
String username = jedis.get("username");
jedis.setex("token",30,"zhangsan"); // 设置带有过期时间的过期时间key,单位是秒
jedis.close();

Hash

Jedis jedis = new Jedis();
jedis.hset("myhash","name","zhangsan");
jedis.hset("myhash","age",25); // 虽然传入一个整型,但是实际上的接收参数是 String 类型
String name = jedis.hget("myhash","name");
String age = jedis.hget("myhash","age"); // 注意该方法的返回值类型为 String
Map<String,String> map=jedis.hgetAll("myhash"); // 该方法的返回值是一个 Map,别忘了加泛型
// 遍历打印 map
Set<String> keys = map.keySet();
for(String k : keys) {
    System.out.pringtln(map.get(k));
}
jedis.close();

List

Jedis jedis = new Jedis();
jedis.lpush("mylist","a","b","c");
jedis.rpush("mylist","a","b","c");
List<String> list = jedis.lrange("mylist",0,-1); // 获取 List 中存储的数据
String lstr = jedis.lpop("mylist"); // 弹出 List 最左侧的元素
String rstr = jedis.rpop("mylist"); // 弹出 List 最右侧的元素
jedis.close();

Set

Jedis jedis = new Jedis();
jedis.sadd("myset","zhangsan","lisi");
Set<String> set = jedis.smembers("myset"); // 返回值是一个 Set 集合
// 打印
for(String s : set) {
    System.out.println(s);
}
jedis.close();

SortedSet

Jedis jedis = new Jedis();
// 添加元素,并指定 score
jedis.zadd("zset",60,"zhangsan");
jedis.zadd("zset",100,"lisi");
jedis.zadd("zset",40,"wangwu");
// 获取不带有分数的 set 集合
Set<String> zset1 = jedis.zrange("zset",0,-1);
/*
获取带有分数的 set 集合:Tuple 集合
Tuple 的底层数据结构:
private byte[] element;
private Double score;
*/

Set<Tuple> zset2 = jedis.zrangeWithScores("zset",0,-1);
// 遍历获取分数和元素
for(Tuple t : z) {
    double score = t.getScore();
    String ele = t.getElement();
    System.out.println("score:"+score+",element:"+ele);
}
jedis.close();

Jedis 连接池

与其他池化技术一样,比如 JDBC 连接池,线程池,Jedis 连接池可以提高 Jedis 性能,不用每一次连接都想系统申请,而是直接从连接池中获取,调用 close() 时也是向连接池归还,而不是直接关闭连接

使用 JedisPool 连接池

  1. 创建 JedisPool 连接池对象
  2. 调用 JedisPool 对象的 getResource() 方法获取 Jedis 连接
  3. 使用 Jedis 连接操作 Redis
  4. 调用 Jedis 对象的 close() 方法归还连接
// JedisPoolConfig 对象,可以对 Jedis 连接池进行配置
JedisPoolConfig config = new JedisPoolConfig();
// 连接池最大连接数
config.setMaxTotal(100);
// 连接池最大空闲连接数
config.setMaxIdle(10);

// 创建连接池
JedisPool jedisPool = new JedisPool(config,"localhost",6379);
// 获取连接
Jedis jedis = jedisPool.getResource();

// 操作数据库
Set<String> zset = jedis.zrange("zset",0,-1);
for(String s : zset) {
    System.out.println(s);
}

// 归还连接
jedis.close();

连接池工具类

可以看到每次使用连接池,会有很多重复代码,而且连接池的配置写死在了代码中,可以考虑封装一个工具类,并且连接池的配置可以从文件中读取

package cool.yzt.jedis.utils;

import redis.clients.jedis.*;
import java.io.IOException;
import java.util.Properties;

public class JedisUtils {
    private static JedisPool pool;

    // 静态代码块,加载配置文件
    static {
        Properties pros = new Properties();

        try {
            pros.load(JedisUtils.class.getClassLoader().getResourceAsStream("jedis.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 配置连接池
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(Integer.parseInt(pros.getProperty("maxTotal")));
        config.setMaxIdle(Integer.parseInt(pros.getProperty("maxIdle")));
        String host = pros.getProperty("host");
        int port = Integer.parseInt(pros.getProperty("port"));
        pool = new JedisPool(config,host,port);
    }

    public static Jedis getJedis() {
        return pool.getResource();
    }
}

使用连接池

Jedis jedis = JedisUtils.getJedis();
/*
操作 Redis 数据库
*/
jedis.close();

连接池极简配置文件

host=127.0.0.1
port=6379
maxTotal=200
maxIdle=20

参考