java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java Jedis使用

Java中Jedis基本使用

作者:三分恶

Redis的Java实现的客户端,本文主要介绍了Java中Jedis基本使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

在前面我们已经学习了Redis命令行客户端redis-cli的使用,接下来我们了解一下Redis基于Java编程语言的客户端。

在Java语言体系下,有三个常用的Redis客户端JedisRedissonLettuce。三者各有特点,各有适用的场景。

Java Redis客户端

好了,我们开始学习Jedis的使用吧。

1、Jedis的基本使用

创建Maven工程,在项目中添加Jedis依赖。

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

Jedis的使用方法非常简单,只要三行代码就可以实现基本的set/get功能:

        //1.生成一个Jedis对象,这个对象负责和指定Redis实例进行通信
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        // 2.jedis执行set操作
        jedis.set("hello", "world");
        //3.jedis执行get操作,value="world"
        String value = jedis.get("hello");

初始化Jedis需要两个参数:Redis实例的IP和端口,除了这两个参数外,还有一个包含了四个参数的构造函数是比较常用的:

Jedis(final String host, final int port, final int connectionTimeout, final int soTimeout)

参数说明:

可以打印输出一下上面程序的结果:

运行结果

和JDBC类似,一般涉及到这种网络I/O的操作,最好使用try catch finally的形式,稍微修改一下上面的例子:

        Jedis jedis = null;
        try {
            jedis = new Jedis("127.0.0.1", 6379);
            jedis.get("hello");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                jedis.close();
            }
        }

接下来我们看一下Jedis对各种基本数据类型的操作:

字符串

        jedis.set("hello", "world");
        //结果 world
        System.out.println(jedis.get("hello"));
       //结果 1
        System.out.println(jedis.incr("counter"));

hash

        jedis.hset("myhash", "f1", "v1");
        jedis.hset("myhash", "f2", "v2");
        //运行结果 {f2=v2, f1=v1}
        System.out.println(jedis.hgetAll("myhash"));

list

        jedis.rpush("mylist", "1");
        jedis.rpush("mylist", "2");
        jedis.rpush("mylist", "3");
        //运行结果 [1, 2, 3]
        System.out.println(jedis.lrange("mylist",0,-1));

set

        jedis.sadd("myset", "a");
        jedis.sadd("myset", "b");
        jedis.sadd("myset", "a");
        //运行结果 [b, a]
        System.out.println(jedis.smembers("myset"));

zset

        Jedis jedis = new Jedis("127.0.0.1", 6379);
        jedis.zadd("thezset", 99, "tom");
        jedis.zadd("thezset", 66, "peter");
        jedis.zadd("thezset", 33, "james");
        //运行结果 james 33.0 peter 66.0 tom 99.0
        jedis.zrangeWithScores("thezset",0,-1).stream().forEach(s->{
            System.out.print(s.getElement()+" "+s.getScore()+" ");
        });

2、序列化

在Java中,存储对象一般会进行序列化和反序列化,Jedis本身并不支持序列化。可以引入游戏额第三方的序列化工具,例如XML、Json、谷歌的Protobuf、Facebook的Thrift等等。

我们以protostuff(Protobuf的Java客户端)为例来进行学习:

引入protostuff依赖

   <properties>
        <protostuff.version>1.0.11</protostuff.version>
    </properties>
    
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-runtime</artifactId>
            <version>${protostuff.version}</version>
        </dependency>
        <dependency>
            <groupId>com.dyuproject.protostuff</groupId>
            <artifactId>protostuff-core</artifactId>
            <version>${protostuff.version}</version>
        </dependency>    

定义实体类

public class Club implements Serializable {
    private int id; // id
    private String name; // 名称
    private String info; // 描述
    private Date createDate; // 创建日期
    private int rank; // 排名
    //省略getter/setter等
}    

测试序列化和反序列化

        // 1.生成序列化工具类
        ProtostuffSerializer protostuffSerializer = new ProtostuffSerializer();
        // 2.生成Jedis对象
        Jedis jedis = new Jedis("127.0.0.1", 6379);
        // 3.序列化
        String key = "club:1";
        // 定义实体对象
        Club club = new Club(1, "AC", "米兰", new Date(), 1);
        // 序列化
        byte[] clubBtyes = protostuffSerializer.serialize(club);
        jedis.set(key.getBytes(), clubBtyes);
        // 4.反序列化
        byte[] resultBtyes = jedis.get(key.getBytes());
        Club resultClub = protostuffSerializer.deserialize(resultBtyes);
        //结果 Club{id=1, name='AC', info='米兰', createDate=Sat May 15 22:21:42 CST 2021, rank=1}
        System.out.println(resultClub.toString());

3、Jedis连接池

在上面我们使用的是Jedis的直连方式,每次都会新建TCP 连接,使用后再断开连接。

这种频繁的连接/断开连接的过程显然是对资源的一种浪费。

Jedis直连Redis

和数据库连接池一样,同样可以引入池化技术,将Jedis连接存在池子(JedisPool)里,每次去池子里取,而不用重新创建。

Jedis连接池使用

连接池的方式是可以预先初始化好Jedis连接,所以每次只需要从 Jedis连接池借用即可,而借用和归还操作是在本地进行的,只有少量的并发同步开销,远远小于新建TCP连接的开销。

Jedis提供了JedisPool这个类作为对Jedis的连接池,同时使用了Apache的通用对象池工具common-pool作为资源的管理工具。

使用JedisPool操 作Redis示例如下:

1)Jedis连接池(通常JedisPool是单例的):

        // common-pool连接池配置,这里使用默认配置
        GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
        // 初始化Jedis连接池
        JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);

2)获取Jedis对象不再是直接生成一个Jedis对象进行直连,而是从连接池直接获取:

        Jedis jedis = null;
        try {
            // 1. 从连接池获取jedis对象 
            jedis = jedisPool.getResource();
            // 2. 执行操作 
            jedis.get("hello");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                // 如果使用JedisPool,close操作不是关闭连接,代表归还连接池 
                jedis.close();
            }
        }

面GenericObjectPoolConfig使用的是默认配置,实际它提供有很多参数,例如池子中最大连接数、最大空闲连接数、最小空闲连接数、连接活性检测,等等。

参考:

【1】:《Redis开发与运维》

【2】:redis几种java客户端比较

到此这篇关于Java中Jedis基本使用的文章就介绍到这了,更多相关Java Jedis使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文