【Redis破障之途】四:Jedis基本上应用

在前面大家早已学了Rediscmd手机客户端redis-cli的应用,下面大家了解一下Redis根据Java计算机语言的手机客户端。

在Java语言表达管理体系下,有三个常见的Redis手机客户端JedisRedissonLettuce。三者各有特色,都有可用的情景。

Java Redis客户端

  • Jedis:Redis的Java完成的手机客户端,其API给予了较为全方位的Redis指令的适用;

    Jedis中的方式 启用是较为最底层的曝露的Redis的API,也即Jedis中的Java方式 基本上和Redis的API维持着一致,掌握Redis的API,也就能娴熟的应用Jedis。

  • Redisson:完成了分布式系统和可拓展的Java算法设计,给予许多 分布式系统有关实际操作服务项目,比如,分布式锁,分布式系统结合,可根据Redis适用延迟时间序列。和Jedis对比,作用比较简单,不兼容字符串数组实际操作,不兼容排列、事务管理、管路、系统分区等Redis特点。Redisson的服务宗旨是推动使用人对Redis的关心分离出来,进而让使用人可以将活力更聚集地放到解决领域模型上。

    Redisson中的方式 则是开展较为高的抽象性,每一个方式 启用很有可能开展了一个或好几个Redis方式 启用。

  • Lettuce:高級Redis手机客户端,用以线程安全同歩,多线程和回应应用,适用群集,Sentinel,管路和伺服电机。是SpringBoot2.x版本号默认设置的手机客户端。

好啦,大家开始学习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必须2个主要参数:Redis案例的IP和端口号,除开这两个主要参数外,还有一个包括了四个主要参数的构造方法是较为常见的:

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

主要参数表明:

  • host:Redis案例的所属设备的IP
  • port:Redis案例的端口号
  • connectionTimeout:手机客户端网络连接超时
  • 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、Google的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>    
  • 界定dao层
public class Club implements Serializable {
    private int id; // id
    private String name; // 名字
    private String info; // 叙述
    private Date createDate; // 建立日期
    private int rank; // 排行
    //省去getter/setter等
}    
  • 检测实例化和反序列化
        // 1.转化成实例化java工具
        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手机客户端较为

评论(0条)

刀客源码 游客评论