zoukankan      html  css  js  c++  java
  • Spring Boot 整合Jedis连接Redis和简单使用

    摘要:首先介绍如何在Windows系统安装Redis环境,然后在Spring Boot 项目中集成 Redis,最后简单地做了一个使用Jedis操作redis连接池的测试用例。

    §准备Redis环境

      这里介绍如何在 windows 10 系统安装 Redis 5.0.10,希望对没有接触过Redis或刚接触Redis的小伙伴有些许帮助。如果已经安装Redis,请跳过本节。安装包下载地址: https://github.com/tporadowski/redis/releases

      安装Redis。下载安装包后右键解压到硬盘某个目录下,我安装的是64位Redis,放在了目录C:Program Files edis中:

      启动Redis。在命令行窗口进入redis目录后,执行如下命令开启服务:

    redis-server.exe redis.windows.conf

      注意加上redis.windows.conf。这个窗口要保持开启,关闭时redis服务会自动关闭。

      另外开启一个命令行窗口,进入redis目录下后执行如下命令:

    redis-cli.exe -h 127.0.0.1 -p 6379

      IP地址127.0.0.1为redis服务所部署服务器的IP地址。因为是本机安装,故直接使用127.0.0.1启动。Redis默认端口是6379,可以通过编辑文件 redis.windows.conf 修改里面的端口号。

      如果redis设置了密码,可以添加参数-a指定密码,例如:

    redis-cli.exe -h 127.0.0.1 -p 6379 -a yourPassword

      向Redis设置键值对:

    set myKey abc

      取出键值对:

    get myKey

      在《使用批处理脚本在win10系统启动Redis 5.0.10》中,小编介绍了如何快速使用批处理文件启动Redis,需要的小伙伴赶快去围观吧!

      至此,安装、启动和测试完毕。主要就是按照参考文献[1]操作一遍,如果需要在Linux环境安装,就去参考文献[1]瞧瞧吧!

      Redis服务器连接密码默认为空,可以通过在控制台执行命令 auth yourPassword设置密码,其中,yourPassword为你自己的密码,自行更改,设置成功时Redis返回字符串 OK。

    §Spring Boot项目集成Redis

      所用软件开发环境如下:

      ♦ java version 13.0.1
      ♦ IntelliJ IDEA 2019.3.2 (Ultimate Edition)
      ♦ Spring Boot 2.3.0.RELEASE
      ♦Redis 5.0.10

      添加Redis依赖:

    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.1.0</version>
    </dependency>
    

      Jedis为我们提供了多种操作Redis的方式:单机单连接方式、单机连接池方式和多机分布式+连接池方式。这里演示使用单个Redis实例的单机连接池方式。在application.properties中新增Jedis的相关配置:

    spring.redis.host=127.0.0.1
    spring.redis.database=0
    spring.redis.port=6379
    # 我的redis没有设置密码,故缺省密码
    spring.redis.password=
    # 连接超时时间,单位 ms(毫秒)
    spring.redis.timeout=3200
    # 连接池中的最大空闲连接,默认值也是8
    spring.redis.jedis.pool.max-idle=10
    #连接池中的最小空闲连接,默认值也是0
    spring.redis.jedis.pool.min-idle=3
    # 连接池最大jedis实例个数,如果赋值为-1,则表示不限制;pool如果已经全部分配,则状态变为exhausted(耗尽)。
    spring.redis.jedis.pool.max-active=210
    # 可用连接的最大等待时间,单位毫秒,默认值为-1,表示永不超时。如果超时,则直接抛出JedisConnectionException
    spring.redis.jedis.pool.max-wait=10000
    

      创建Jedis连接池配置类JedisPoolFactory:

    package com.eg.wiener.config;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import redis.clients.jedis.JedisPool;
    import redis.clients.jedis.JedisPoolConfig;
    
    @Configuration
    public class JedisPoolFactory {
        @Value("${spring.redis.host}")
        private String host;
    
        @Value("${spring.redis.port}")
        private int port;
    
        @Value("${spring.redis.password}")
        private String password;
    
        @Value("${spring.redis.timeout}")
        private int timeout;
    
        @Value("${spring.redis.jedis.pool.max-active}")
        private int maxActive;
    
        @Value("${spring.redis.jedis.pool.max-idle}")
        private int maxIdle;
    
        @Value("${spring.redis.jedis.pool.min-idle}")
        private int minIdle;
    
        @Value("${spring.redis.jedis.pool.max-wait}")
        private long maxWaitMillis;
    
        /**
         * 初始化Redis连接池
         */     
        @Bean
        public JedisPool generateJedisPoolFactory() {
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxTotal(maxActive);
            poolConfig.setMaxIdle(maxIdle);
            poolConfig.setMinIdle(minIdle);
            poolConfig.setMaxWaitMillis(maxWaitMillis);
              // 连接耗尽时是否阻塞, false报异常,true阻塞直到超时, 默认true 
            poolConfig.setBlockWhenExhausted(Boolean.TRUE);
            JedisPool jedisPool = new JedisPool(poolConfig, host, port, timeout);
             // 若设置了Redis密码,请调用如下构造函数
    //        JedisPool jedisPool = new JedisPool(poolConfig, host, port, timeout, password);
            return jedisPool;
        }
    }
    

      若设置了Redis密码,请调用构造函数 new JedisPool(poolConfig, host, port, timeout, password)。

    §案例分析

      创建Redis工具类JedisUtil,由于是测试系统是否成功整合redis,所以在工具类中仅仅添加几个方法:

    package com.eg.wiener.utils;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPool;
    
    @Component
    public class JedisUtil {
    
        @Autowired
        private JedisPool jedisPool;
    
        /**
         * 存储字符串键值对,永久有效
         * @param key
         * @param value
         * @return
         * @author hw
         * @date 2018年12月14日
         */
        public String set(String key, String value) {
            Jedis jedis = jedisPool.getResource();
            try {
                return jedis.set(key, value);
            } catch (Exception e) {
                return "-1";
            } finally {
                // 业务操作完成,将连接归还连接池
                 jedisPool.returnResource(jedis);
            }
        }
    
        /**
         * 根据传入key获取指定Value
         * @param key
         * @return
         * @author hw
         * @date 2018年12月14日
         */
        public String get(String key) {
            Jedis jedis = jedisPool.getResource();
            try {
                return jedis.get(key);
            } catch (Exception e) {
                return "-1";
            } finally {
                jedis.close();
            }
        }
    
        /**
         * 删除字符串键值对
         * @param key
         * @return
         * @author hw
         * @date 2018年12月14日
         */
        public Long del(String key) {
            Jedis jedis = jedisPool.getResource();
            try {
                return jedis.del(key);
            } catch (Exception e) {
                return -1L;
            } finally {
                jedis.close();
            }
        }
        /**
         * 校验Key值是否存在
         */
        public Boolean exists(String key) {
            Jedis jedis = null;
            try {
                jedis = jedisPool.getResource();
                return jedis.exists(key);
            } catch (Exception e) {
                return false;
            } finally {
                 // 归还连接
                jedis.close();
            }
        }
    }
    

      这里通过连接池来获取Jedis实例。由于连接池资源有限,所以,业务操作结束后要及时把Jedis实例还给连接池。在UserController类中创建测试用例,一个负责向redis写数据,一个负责读,代码如下:

    /**
     * @author Wiener
     */
    @RestController
    @RequestMapping("/user")
    public class UserController {
        private static Logger logger = LoggerFactory.getLogger(UserController.class);
     
        @Autowired
        private JedisUtil jedisUtil;
        
        // http://localhost:8087/wiener/user/testRedisSave?id=1090330
        @RequestMapping("/testRedisSave")
        public Object testRedisSave(Long id) {
            jedisUtil.del("userId:"+id);
            jedisUtil.set("userId:"+id, "测试地址是 " + UUID.randomUUID().toString());
            return null;
        }
        // http://localhost:8087/wiener/user/testRedisGet?id=1090330
        @RequestMapping("/testRedisGet")
        public String testRedisGet(Long id) {
            String myStr= jedisUtil.get("userId:"+ id);
            if(!StringUtils.isEmpty(myStr)) {
                return myStr;
            }
            return null;
        }
    }
    

      在浏览器请求写入数据的API后,调用读取testRedisGet函数,执行结果如下图所示,说明配置JedisPool成功:

    §小结

      关于Spring Boot项目集成Jedis操作Redis连接池就先介绍到这里,如果您觉得本文对您有帮助,请点一下“推荐”按钮,您的【推荐】将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

    §Reference


      读后有收获,小礼物走一走,请作者喝咖啡。

    赞赏支持

  • 相关阅读:
    Benelux Algorithm Programming Contest 2016 Preliminary K. Translators’ Dinner(思路)
    Benelux Algorithm Programming Contest 2016 Preliminary Target Practice
    Benelux Algorithm Programming Contest 2016 Preliminary I. Rock Band
    Benelux Algorithm Programming Contest 2016 Preliminary A. Block Game
    ICPC Northeastern European Regional Contest 2019 Apprentice Learning Trajectory
    ICPC Northeastern European Regional Contest 2019 Key Storage
    2018 ACM ICPC Asia Regional
    2018 ACM ICPC Asia Regional
    Mybatis入库出现异常后,如何捕捉异常
    优雅停止 SpringBoot 服务,拒绝 kill -9 暴力停止
  • 原文地址:https://www.cnblogs.com/east7/p/14454061.html
Copyright © 2011-2022 走看看