文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java中Jedis基本使用

2024-04-02 19:55

关注

在前面我们已经学习了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使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯