• Redis客户端——Jedis的使用


    本文介绍基于Java语言的Redis客户端——Jedis的使用,包括Jedis简介、获取Jedis、Jedis直连、Jedis连接池以及二者的对比的选择。

    Jedis简介

    Jedis 是 Redis 官方首选的基于Java语言的客户端开发包。Jedis功能强大,提供了完整Redis命令,与 Redis 2.8.x, 3.x.x及以上版本完全兼容。而且使用简单方便,绝对是Java语言的首选客户端。

    获取Jedis

    获取Jedis可以在 http://github.com/xetorthio/jedis/releases下载最新的版本;或者引入Maven依赖:

         <dependency>
             <groupId>redis.clients</groupId>
             <artifactId>jedis</artifactId>
             <version>3.0.1</version>
             <type>jar</type>
             <scope>compile</scope>
         </dependency>

    Jedis直连

    Jedis直连需要生成Jedis对象,这个对象负责和指定Redis节点进行通信。
    Jedis jedis = new Jedis("127.0.0.1",6379);

    然后就可以进行基本操作:

    • string
    jedis.set("hello","world");
    jedis.get("hello");
    jedis.incr("counter");
    • hash
    jedis.hset("myhash","f1","v1");
    jedis.hset("myhash","f2","v2");
    jedis.hgetAll("myhash");
    • list
    jedis.rpush("mylist","1");
    jedis.rpush("mylist","2");
    jedis.rpush("mylist","3");
    jedis.lrange("mylist",0,-1);
    • set
    jedis.sadd("myset","a");
    jedis.sadd("myset","b");
    jedis.sadd("myset","a");
    jedis.smember("myset");
    • zset
    jedis.zadd("myzset",99,"alan");
    jedis.zadd("myzset",88,"paul");
    jedis.zadd("myzset",77,"077");
    jedis.zrangeWithScores("myzset",0,-1);

    Jedis连接池

    什么是连接池?举个类比,线程池是把线程放到便于统一管理的容器里面,那么连接池就是把连接放到一个容器里面,方便连接的管理和使用,达到节省系统资源开销和时间的效果。

    如果没有连接池,在实际应用开发中,每一次Jedis请求都必须经历生成Jedis对象、Jedis执行命令、Jedis返回执行结果和关闭Jedis连接等步骤,而新建Jedis对象,然后新建连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃。如果运用池化技术,将连接作为对象存储在一个容器中(连接池),一旦连接池建立后,这些连接是共享的,极大地节省系统资源和时间,这就是Jedis连接池。如果之前已经了解过线程池,我想这儿看着会相当轻松写意。

    Jedis连接池使用主要有以下几个步骤:创建连接池池、向连接池借Jedis对象、Jedis执行命令、返回执行结果、归还Jedis对象给连接池。具体代码如下:

    创建Jedis连接池并初始化:

    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    JedisPool jedisPool = new JedisPool(poolConfig,"127.0.0.1",6739);

    可以看到,JedisPool大部分配置都在GenericObjectPoolConfig中完成的,GenericObjectPoolConfig参数说明如下表:

    参数
    参数说明
    maxTotal
    最大连接数,默认8个。
    maxIdle
    最大空闲连接数, 默认8个。
    minIdle
    最小空闲连接数,默认0个。
    maxWaitMillis
    当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException。
    testOnBorrow
    在borrow一个jedis实例时,是否提前检查连接可用性(ping())操作;如果为true,则得到的jedis实例均是可用的。默认为false。
    blockWhenExhausted
    连接耗尽时是否阻塞, false报异常,ture阻塞直到超时, 默认true。
    testOnReturn
    在return一个jedis实例时,是否检查连接可用性(ping()),默认为false。
    testWhileIdle
    如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉。
    这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义。
    minEvictableIdleTimeMillis
    表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐。这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义。
    JedisPoolConfig中默认设置为60000。
    timeBetweenEvictionRunsMillis
     
    表示idle object evitor两次扫描之间要sleep的毫秒数,默认设置为30000。

    创建和初始化Jedis连接池以后,可以从Jedis连接池中获取Jedis对象,进而进行操作:

    Jedis jedis = null;
    try{
        //1.从连接池获取jedis对象
        jedis = jedisPool.getResource();
        //2.执行操作
        jedis.set("hello","world");
    }catch(Exception e){
        e.printStackTrace();
    }finally{
        if(jedis != null){
            //归还连接池
            jedis.close();
        }
    }

    如何选择

    Jedis直连和使用Jedis连接池各有所长,可以根据生产环境的需要因地制宜。

    如果是少量的连接,并且每次连接时间较长,适合使用Jedis直连的方式。

    如果是较为频繁的连接则使用Jedis连接池。

      优点 缺点
    直连
    • 简单方便
    • 用于少量长期连接的场景
    • 每次新建/关闭TCP开销较大
    • 资源无法控制,存在连接泄漏的可能
    • Jedis对象线程不安全
    连接池
    • Jedis预先生成,降低开销使用
    • 连接池的形式保护和控制资源的使用
    • 相对于直连,使用相对麻烦,尤其在资源的管理上需要很多参数来保证,一旦规划不合理也会出现问题
  • 相关阅读:
    Grid表格的js触发事件
    C# 在获得鼠标点击事件时,如何判断Control键,Shift键被按下
    纠错《COM技术内幕》之ProgID
    C# 日期格式化
    C# 操作系统防火墙
    C# 开发和调用Web Service
    谓侠
    高维FWT
    单位根反演
    容斥 反演
  • 原文地址:https://www.cnblogs.com/sgh1023/p/10351096.html
Copyright © 2020-2023  润新知