SpringBoot集成redis+jedis(缓存不过期)

333 阅读2分钟

SpringBoot集成redis(自用)v2

  • v1:SpringBoot集成redis
  • v2:追加了jedis,更灵活地操作redis,如清除过期时间(永不过期)

pom.xml

<!--redis缓存-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency><!--Jedis是一种Java操作Redis的简单而强大的工具库-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
</dependency>

application.yml

spring:
  application:
    name: ktc-article #指定服务名
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://192.168.000.000:3308/ktc_article?characterEncoding=UTF8
    username: root
    password: admin
  jpa:
    properties:
      hibernate:
        format_sql: true    # 格式化sql
        show_sql: true        # 显示sql
  redis:
    host: 192.168.203.130
    port: 6379
#    password: #输入redis数据库密码
    jedis:
      pool:
        max-active: 10 #最大连接数
        max-idle: 6 #最大空闲数
        min-idle: 2 #最小空闲数
        max-wait: #最大阻塞等待时间,默认-1 无限期等待
    timeout: 2000 #redis连接超时

JedisConfig配置类(主要是对redis进行连接,也选择可以改Jeids源代码(在里边加上连接代码))

package com.ktc.article.config;
​
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 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.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;
​
    @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;
    }
​
}

ArticleService

import org.springframework.data.redis.core.RedisTemplate;
import redis.clients.jedis.JedisPool;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private JedisPool jedisPool;
    public Article findById(String id) {
        //设置缓存时间
//        redisTemplate.opsForValue().set("article_" + id, article,1, TimeUnit.DAYS);
//        redisTemplate.opsForValue().set("article_" + id, article,10, TimeUnit.SECONDS);
​
        //redisTemplate没有清除过期时间的方法(也可能是我没找到),只能将过期时间设置为最大值
//        redisTemplate.opsForValue().set("article_" + id, article, Long.MAX_VALUE);
​
        Article article = (Article) redisTemplate.opsForValue().get("article_" + id);
​
        //如果为空那么从数据库获取,存入redis
        if (article == null) {
            article = articleDao.findById(id).get();
            redisTemplate.opsForValue().set("article_" + id, article);
            //jedis对redis操作命令比较全,同时也更偏向redis库的操作命令,可以参考redis的操作命令进行操作,
            // 可查看我之前发的redis五种数据类型及操作的文章https://juejin.cn/post/7263705320768487481
//            Jedis jedis = jedisPool.getResource();
//            jedis.set("article_" + id, String.valueOf(article));
//            //清除redis过期时间(即永不过期)
//            jedis.persist("article_" + id);
​
        }
​
        return article;
    }

注意

用reids做二级缓存时,涉及到实体类需要给实体类加上 implements Serializable,否则会报错:DefaultSerializer requires a Serializable payload but received an object of type

相关资料

SpringBoot整合Jedis_springboot jedis_起个名字是真的南的博客-CSDN博客

关于redisTemplate存储,本地redis客户端查找不到问题:关于redisTemplate.opsForValue().set数据本地redis客户端库中查不到问题的解决记录_redistemplate.opsforvalue.set_北溟南风起的博客-CSDN博客