SpringBoot整合Redis

1.导入依赖

<!--Redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
<!--Jedis依赖-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0</version>
</dependency>

2.application.yml配置文件

spring:  
  redis:
    host: 127.0.0.1
    port: 6379
    timeout: 3
    jedis:
      pool:
        max-idle: 10
        max-active: 10
        max-wait: 5

3.RedisConfig:封装配置文件中Redis的相关配置

@Component
@ConfigurationProperties(prefix = "spring.redis")
public class RedisConfig {
    private String host;
    private int port;
    private int timeout;//秒
    private int jedisPoolMaxActive;
    private int jedisPoolMaxIdle;
    private int jedisPoolMaxWait;//秒
    //get和set方法...
}

注意:使用@ConfigurationProperties注解需要导入依赖

<!--使用@ConfigurationProperties需要用到这个依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

4.使用JedisPool

@Configuration
public class Config {

    @Autowired
    RedisConfig redisConfig;

    /**
     * 将JedisPool添加到容器中
     * @return
     */
    @Bean
    public JedisPool jedisPoolFactory(){
        JedisPoolConfig jpc = new JedisPoolConfig();
        //使用配置文件中Redis的相关配置创建JedisPool
        jpc.setMaxIdle(redisConfig.getJedisPoolMaxIdle());
        jpc.setMaxTotal(redisConfig.getJedisPoolMaxActive());
        jpc.setMaxWaitMillis(redisConfig.getJedisPoolMaxWait()*1000);
        JedisPool jp = new JedisPool(jpc,redisConfig.getHost());
        return jp;
    }
}

5.获取Jedis操作Redis

  • RedisService:操作Redis,存数据取数据
public class RedisService {


    @Autowired
    private JedisPool jedisPool;

    /**
     * 从Redis数据库中,通过key获得一个Class<T>类型的数据
     * @param key
     * @param clazz
     * @param <T> 表示方法的返回值是泛型
     * @return
     */
    public <T> T get(String key,Class<T> clazz){
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String str = jedis.get(key);//调用Jedis操作Redis,通过key获得数据
            T value = stringToBean(str,clazz);//将String转为想要的clazz类型
            return value;
        } finally {
            returnToPool(jedis);
        }
    }

    /**
     * 将String转为想要的clazz类型
     * @param str
     * @param clazz
     * @param <T>
     * @return
     */
    private <T> T stringToBean(String str, Class<T> clazz) {
        if (str == null || str.length() <= 0){
            return null;
        }
        if (clazz == int.class || clazz == Integer.class){
            return (T) Integer.valueOf(str);
        }else if (clazz == String.class){
            return (T) str;
        }else if (clazz == long.class || clazz == Long.class){
            return (T) Long.valueOf(str);
        }else {
            return JSON.toJavaObject(JSON.parseObject(str),clazz);
        }
    }


    /**
     * 将连接返回连接池
     * @param jedis
     */
    private void returnToPool(Jedis jedis) {
        //jedis不是空,将jedis返回JedisPool
        if (jedis != null){
            jedis.close();
        }
    }

    /**
     * 将T型的数据存入Redis中
     * @param key
     * @param value
     * @param <T>
     * @return
     */
    public <T> boolean set(String key,T value){
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String str = beanToString(value);//将T型的数据转为String
            if (str == null || str.length() <= 0){
                return false;
            }
            jedis.set(key,str);
            return true;
        } finally {
            returnToPool(jedis);
        }
    }

    /**
     * 将T型的数据转为String
     * @param value
     * @param <T>
     * @return
     */
    private <T> String beanToString(T value) {
        if (value == null){
            return null;
        }
        Class<?> clazz = value.getClass();
        if (clazz == int.class || clazz == Integer.class){
            return "" + value;
        }else if (clazz == String.class){
            return (String)value;
        }else if (clazz == long.class || clazz == Long.class){
            return "" + value;
        }else {
            return JSON.toJSONString(value);
        }
    }
}
  • RedisController:根据获得的请求进行不同的操作
@Controller
public class RedisController {

    @Autowired
    private RedisService redisService;

    /**
     * 测试操作是否成功
     * @return
     */
    @ResponseBody
    @RequestMapping("getKey")
    public Result<String> redisGet(){
        boolean b = redisService.set("key1", "hello hello");
        String s = redisService.get("key1", String.class);
        return Result.success(s);
    }
}

6.报错:Timeout waiting for idle object

经过调试,发现是因为application.xml中的max-idle、max-active、max-wait没有和RedisConfig中的jedisPoolMaxActive、jedisPoolMaxIdle、jedisPoolMaxWait绑定上。修改RedisConfig

@Component
    @ConfigurationProperties(prefix = "spring.redis")
    public class RedisConfig {
        private String host;
        private int port;
        private int timeout;//秒
        @Value("${spring.redis.jedis.pool.max-active}")
        private int jedisPoolMaxActive;
        @Value("${spring.redis.jedis.pool.max-idle}")
        private int jedisPoolMaxIdle;
        @Value("${spring.redis.jedis.pool.max-wait}")
        private int jedisPoolMaxWait;//秒
        //get和set方法...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值