前言:最近有个Java项目需要用到redis,但在网上找了一圈基本都是写在Spring boot项目中怎么配置的,那其实和在纯Java项目中配置还是有些区别的,因为Spring boot会帮忙做一些配置工作,而且有些配置属性名还和JedisPool原属性名还不一样,因此在这里记录一下吧

redis是一个支持高并发的非关系型数据库(key-value存储),常用来做缓存系统,怎么安装这里就不赘述了网上很多教程,直接进入正题——使用jedis库在maven项目中连接redis

旁白:jedis是一个用来维护与redis的tcp连接池以及操作redis数据的库,类似于Druid之于MySQL

一、在Maven的pom文件中引入jedis库依赖

jedis库maven地址:https://mvnrepository.com/artifact/redis.clients/jedis
选择一个合适的版本引入pom文件就行了,例如:

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

jedis文档地址:https://javadoc.io/doc/redis.clients/jedis/2.9.0/redis/clients/jedis

二、在Resources目录下添加jedis配置文件

在项目的Resources目录下新建一个redis.properties,写入如下配置属性,其中除了host和port,其余属性都是可选的,属性值也可以按照自己的情况进行设置,不配置的话JedisPool就自动使用默认值。

#Reids地址
host=127.0.0.1
#Reids服务器端口
port=6379

#连接池最大连接数
maxTotal=200
#最大空闲连接数
maxIdle=200
#最小空闲连接数
minIdle=10
#当连接池连接用尽后,调用者的最大等待时间(单位:ms)。如果超过此时间将接到异常。设为-1表示无限制。
maxWaitMillis=1000
#在向连接池借用连接是否先做连接有效验证(ping),无效连接会被移除,高并发下建议关闭,因为验证会额外消耗时间
testOnBorrow=true
#向连接池归还连接时是否做连接有效验证,无效连接会被移除
testOnReturn=true
#空闲连接的检测周期(单位为毫秒)。-1表示不检测
timeBetweenEvictionRunsMillis=30000
#连接池中连接的最小空闲时间(单位为毫秒),达到此值后空闲资源将被移除。
minEvictableIdleTimeMillis=180000
#做空闲资源检测时,每次检测资源的个数。-1就是对所有连接做空闲监测
numTestsPerEvictionRun=-1

当然也可以不写这个配置文件,在JedisPool初始化代码里直接set属性值,不过通过配置文件读取属性值还是更加优雅一些

三、在代码中初始化JedisPool

在项目中新建一个类,读取redis.properties配置文件,初始化一个JedisPool连接池。代码如下

import java.util.Properties;

/**
 * Redis连接池
 */
public class JedisDBPool {

    public static JedisPool jedisPool;

    static {
        try {
            Properties properties = new Properties();
            InputStream in = CommonUtils.readResourceFile("redis.properties");
            properties.load(in);
            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            jedisPoolConfig.setMaxTotal(Integer.valueOf(properties.getProperty("maxTotal")));
            jedisPoolConfig.setMaxIdle(Integer.valueOf(properties.getProperty("maxIdle")));
            jedisPoolConfig.setMinIdle(Integer.valueOf(properties.getProperty("minIdle")));
            jedisPoolConfig.setMaxWaitMillis(Integer.valueOf(properties.getProperty("maxWaitMillis")));
            jedisPoolConfig.setTestOnBorrow(Boolean.valueOf(properties.getProperty("testOnBorrow")));
            jedisPoolConfig.setTestOnReturn(Boolean.valueOf(properties.getProperty("testOnReturn")));
            jedisPoolConfig.setTimeBetweenEvictionRunsMillis(Integer.valueOf(properties.getProperty("timeBetweenEvictionRunsMillis")));
            jedisPoolConfig.setMinEvictableIdleTimeMillis(Integer.valueOf(properties.getProperty("minEvictableIdleTimeMillis")));
            jedisPoolConfig.setNumTestsPerEvictionRun(Integer.valueOf(properties.getProperty("numTestsPerEvictionRun")));
            jedisPool = new JedisPool(jedisPoolConfig,properties.getProperty("host"),Integer.valueOf(properties.getProperty("port")));
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    
    public static Jedis getConnectJedis() {
        return jedisPool.getResource();
    }
}

有同学可能会发现了,在Spring boot中还可以配置timeout、password等属性值,这个JedisPoolConfig里咋没有呢,当然是有的,不过是在JedisPool的构造方法里设置,我们可以点开JedisPool类的源码(或者直接去官方文档看),可以发现里面除了我们上面的代码中三个参数的构造方法外,还有茫茫多的构造方法,如果还需要配置timeout、password等属性值,调对应的构造方法按顺序传值就行了
在这里插入图片描述

不过我个人觉得这个设计太不优雅了,为什么不直接放到JedisPoolConfig里配置呢,可能jedis最新版本有改动吧我也没去看

四、使用jedis库对Redis数据库进行增删改查

Redis中默认有db0~db15共十六个数据库,就不需要我们像使用关系型数据库一样去自己建库建表了(有需求的话当然也可以自己建),直接使用jedis的API进行读写就完了,默认是写在db0的,也可以自己去配置。增删改查代码如下:

import redis.clients.jedis.Jedis;

/**
 * Redis数据库操作方法封装
 */
public class RedisQuery {

    /**
     * 添加数据,相同key会覆盖数据,所以也相当于改
     */
    public static void set(String key, String value) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        jedis.set(key, value);
        //Jedis3.0版本后jedisPool.returnResource(final Jedis resource)方法已被弃用,用jedis.close()代替 来归还连接
        jedis.close();
    }


    /**
     * 添加数据,带超时时间,超时自动销毁
     */
    public static void setex(String key, String value, int seconds){
        Jedis jedis = JedisDBPool.getConnectJedis();
        jedis.setex(key, seconds, value);
        jedis.close();
    }

    /**
     * 根据key删除数据
     */
    public static void deleteByKey(String key) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        jedis.del(key);
        jedis.close();
    }

    /**
     * 根据key查询
     */
    public static String getByKey(String key) {
        Jedis jedis = JedisDBPool.getConnectJedis();
        String value = jedis.get(key);
        jedis.close();
        return value;
    }

    /**
     * 查询某条数据是否存在
     */
    public static boolean isExist(String key){
        Jedis jedis = JedisDBPool.getConnectJedis();
        boolean exist = jedis.exists(key);
        jedis.close();
        return exist;
    }

    public static void main(String[] args) {
        set("测试key","测试value");
        //通过给key添加冒号可以使数据在Redis Desktop manager中以文件夹的形式展示
        set("User:测试key","测试value");
    }
}

如果直接set数据会显示在db0下,当数据很多时看起来就很不美观了,我们可以通过给key添加冒号(例如User:测试key,多层冒号可以显示在更深层的文件夹,例如User:Xiaoming:测试key),就能使数据在Redis Desktop manager中以文件夹的形式分类展示了
在这里插入图片描述

执行前记得先启动redis:在Redis安装目录中启动redis-server.exe

参考文章:从源码角度看JedisPoolConfig参数配置

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐