[Redis 客户端整合] SpringBoot 整合 Jedis

一、简介

​ 在使用SpringBoot搭建微服务的时候, 很多时候需要用Redis来缓存一些数据 , 存储一些高频率访问的数据。SpringBoot整合Redis所常用的Redis常用客户端有三个:

  • Jedis api
  • redisson
  • lettuce

本文使用Jedis来实现Redis访问

二、导入依赖

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

三、配置连接信息

application.yml文件中, 配置 Redis 连接信息

spring:
  redis:
    port: 6379
    password: 123456
    host: 127.0.0.1
    jedis:
      pool:
        max-idle: 6 #最大空闲数
        max-active: 10 #最大连接数
        min-idle: 2 #最小空闲数
    timeout: 2000 #超时连接

四、编写JedisConfig

创建类: com.learning.config.jedis.JedisConfig

@Configuration
public class JedisConfig {
    private Logger logger = LoggerFactory.getLogger(JedisConfig.class);

    @Value("${spring.redis.host}")
    private String host;

    @Value("${spring.redis.port}")
    private int port;

    @Value("${spring.redis.password}")
    private String password;

    @Value("${spring.redis.jedis.pool.max-idle}")
    private int maxIdle;

    @Value("${spring.redis.jedis.pool.max-active}")
    private int maxActive;

    @Value("${spring.redis.jedis.pool.min-idle}")
    private int minIdle;

    @Value("${spring.redis.timeout}")
    private int timeout;

    @Bean
    public JedisPool jedisPool(){
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxIdle(maxIdle);
        jedisPoolConfig.setMinIdle(minIdle);
        jedisPoolConfig.setMaxTotal(maxActive);

        JedisPool jedisPool = new JedisPool(jedisPoolConfig,host,port,timeout,password);

        logger.info("JedisPool连接成功:"+ host + "\t" + port);

        return jedisPool;
    }
}

注释:

可以直接使用 Jedis()构造函数来连接Redis数据库 , 我们使用连接池 , 来对其进行优化 。例如 :

String host = "127.0.0.1";
int port = 6379;
Jedis jedis = new Jedis(host, port);
jedis.auth("123456");
    
jedis.方法();

jedis.close();

五、使用Jedis

(1)注入 JedisPool 对象

在要使用 Jedis 的类中注入 JedisPool 对象

 @Autowired
private JedisPool jedisPool;

JedisPool 的 Bean 对象是在JedisConfig类中声明的 :

@Bean
public JedisPool jedisPool(){
	......
	return jedisPool;
}

(2)使用Jedis

1.得到 Jedis 对象

在方法中, 通过 jedisPool 对象得到 Jedis 对象

//得到jedis对象
Jedis jedis = jedisPool.getResource();

2.使用 jedis 对象操作Redis

Redis 中有什么语法, jedis 对象就有什么方法 , 例如查询 Key是否存在:

jedis.exists("Key")

3.关闭连接

在使用完 jedis 对象后, 一定要记得关闭连接

jedis.close();

(3)实例 - Jedis操作 String 类型

通过 key 来得到 String 类型的 value

如果 Redis 中存在 key 则从Redis中获得 , 如果不存在 , 则到Mysql数据库中查找 , 再赋给Redis

    public String getString(String key) {
        //得到jedis对象
        Jedis jedis = jedisPool.getResource();
        String val = null;
        //判断redis中key是否存在
        if(jedis.exists(key)){
            val = jedis.get(key);
            log.info("查询Redis中的数据");
        }else{
            val = "模拟从mysql查到的数据";
            log.info("查询mysql中的数据");
            jedis.set(key,val);
        }
        //关闭连接
        jedis.close();
        return val;
    }

(4)实例 - Jedis操作 Hash 类型

通过 key 来得到 User 类型的 对象

如果 Redis 中存在 key 则从Redis中获得 , 如果不存在 , 则到Mysql数据库中查找 , 再赋给Redis

User对象

@Data
public class User implements Serializable {
    private String id;
    private String name;
    private Integer age;
}

查询方法

public User selectUserById(String Id){
        String key = "user:" + Id;
    
        //得到jedis对象
        Jedis jedis = jedisPool.getResource();
    
        User resultUser = new User();
        Map<String,String> resultMap = new HashMap<String,String>();
        if(jedis.exists(key)){
            resultMap = jedis.hgetAll(key);
            log.info("从Redis中查询");
            String id = resultMap.get("id");
            String name = resultMap.get("name");
            Integer age = Integer.parseInt(resultMap.get("age"));
            resultUser.setId(id);
            resultUser.setName(name);
            resultUser.setAge(age);
        }else{
            //模拟从Mysql数据库查询到数据
            resultUser.setId(Id);
            resultUser.setName("张三");
            resultUser.setAge(20);
            resultMap.put("id",resultUser.getId());
            resultMap.put("name",resultUser.getName());
            resultMap.put("age",resultUser.getAge() + "");
            log.info("从Mysql中查询");
            jedis.hmset(key,resultMap);
        }
    
    //关闭连接
    jedis.close();
    
    return resultUser;
}

六、创建Jedis工具类

在开发中, 我们可以创建一个Jedis工具类, 来对Jedis进行进一步的封装, 让其实现更多的功能

例如 : 通过Jedis工具类来实现Jedis的获取和关闭

@Component
public class JedisUtil {

    @Autowired
    private JedisPool jedisPool;

    public <T> T useJedis(Function<Jedis, T> function){
        Jedis jedis = jedisPool.getResource();
        T result = function.apply(jedis);
        jedis.close();
        return result;
    }

}

在此时, 在一个类中, 若想使用Jedis , 就无需再注入JedisPool对象了, 而是注入Jedis工具类

    @Autowired
    private JedisUtil jedisUtil;

jedisUtiluseJedis()方法中, 创建一个匿名类, 来实现功能 :

/**
* 通过 key 来得到 String 类型的 value
* 如果 Redis 中存在 key 则从Redis中获得 , 如果不存在 , 则到Mysql数据库中查找 , 再赋给Redis
*/
public String getString(String key) {

    String result = jedisUtil.useJedis(new Function<Jedis, String>() {
        @Override
        public String apply(Jedis jedis) {

            String val = null;
            //判断redis中key是否存在
            if(jedis.exists(key)){
                val = jedis.get(key);
                log.info("查询Redis中的数据");
            }else{
                val = "模拟从mysql查到的数据";
                log.info("查询mysql中的数据");
                jedis.set(key,val);
            }
            return val;
        }
    });

    return result;
}
posted @   DavidH  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示