美文网首页java大搜罗
记录springboot2.0整合Redis做缓存

记录springboot2.0整合Redis做缓存

作者: simperLv | 来源:发表于2018-11-22 10:13 被阅读134次

    这篇文章是在学习恒宇少年的第十六章:使用Redis作为SpringBoot项目数据缓存基础上,使用springboot2.0为基础写的。
    这里就不介绍Redis的安装和启动了,大家可以参考恒宇少年的文章。

    添加Redis依赖

    首先在pom.xml加入我们需要的依赖(由于这里我更换了公司的setting.xml,所以显示找不到包)

    <!-- springboot内部缓存支持 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
            <!-- 添加Redis缓存支持 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-redis</artifactId>
                <version>1.4.3.RELEASE</version>
            </dependency>
            <!--spring2.0集成redis所需common-pool2-->
            <!-- 必须加上,jedis依赖此  -->
            <!-- spring boot 2.0 的操作手册有标注 大家可以去看看 地址是:https://docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/-->
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-pool2</artifactId>
                <version>2.5.0</version>
            </dependency>
    

    配置Redis数据库

    然后去application.yml中配置redis,添加到我们本地项目中

     #配置redis数据库连接
    spring:
      redis:
        host: 127.0.0.1
        port: 6379
        password:
        jedis:
          pool:
            max-active: 8
            max-wait: -1
            max-idle: 5
            min-idle: 0
          timeout: 2000
        database: 0
    

    配置CacheManager

    要让springboot内置缓存框架使用redis作缓存,还需要添加一个配置类RedisConfiguration,@EnableCaching注解来开启我们的项目支持缓存,然后在配置类内添加方法cacheManager(),返回值使用redis缓存管理器.由于redis自动生成的key太复杂,这里重新定义下生成规则

    @Configuration
    @EnableCaching
    public class RedisConfiguration extends CachingConfigurerSupport {
        @Bean
        public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){
            RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                    .entryTtl(Duration.ofHours(1));//失效时间
            return RedisCacheManager
                    .builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
                    .cacheDefaults(redisCacheConfiguration).build();
        }
        @Override
        public KeyGenerator keyGenerator() {
            //  设置自动key的生成规则,配置spring boot的注解,进行方法级别的缓存,使用:进行分割,可以很多显示出层级关系
            // 这里其实就是new了一个KeyGenerator对象,只是这是lambda表达式的写法,我感觉很好用,大家感兴趣可以去了解下
            return (target, method, params) -> {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(":");
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(":" + String.valueOf(obj));
                }
                String rsToUse = String.valueOf(sb);
                System.out.println("调用Redis缓存Key : " + rsToUse);
                return rsToUse;
            };
        }
    
    }
    

    建表测试

    CREATE TABLE good_infos  ( 
        tg_id       int(11) NOT NULL,
        tg_title    varchar(50) NULL,
        tg_price    decimal(8,2) NULL,
        tg_unit     varchar(20) NULL,
        tg_order    varchar(255) NULL,
        tg_type_id  int(11) NULL,
        PRIMARY KEY(tg_id)
    )
    GO
    

    实体类

    @Entity
    @Table(name = "good_infos")
    public class GoodEntity implements Serializable {
        @Id
        @GeneratedValue
        @Column(name = "tg_id")
        private Long id;
    
        @Column(name = "tg_title")
        private String title;
    
        @Column(name = "tg_price")
        private double price;
    
        @Column(name = "tg_unit")
        private String unit;
    
        @Column(name = "tg_order")
        private int order;
    

    然后创建对应的JPA

    public interface GoodJPA extends JpaRepository<GoodEntity,Long>{
    
    }
    

    创建对应的service

    @Service
    @CacheConfig(cacheNames = "good")
    public class GoodService {
        @Autowired
        private GoodJPA goodJPA;
    
        @Cacheable
        public List<GoodEntity> list(){
            return goodJPA.findAll();
        }
    }
    

    创建一个controller控制器来调用

    @RestController
    @RequestMapping("/query")
    public class QueryController {
    
        @Autowired
        private GoodService goodService;
    
        /**
         * 查询商品列表
         * @return
         */
        @RequestMapping("/list")
        public List<GoodEntity> list(){
            return goodService.list();
        }
    }
    

    测试一下

    图10.png
    查看控制台
    图10.png
    此时打印了查询语句,然后再次访问这个网址,会发现不会打印查询语句了。说明redis启用成功。
    我们再往表中添加一条数据后保存
    图11.png
    然后再访问http://localhost:8080/query/list,发现依然只有3条数据
    图12.png
    把reids里的缓存清空一下
    图13.png
    再次访问,刚刚添加的数据就出来了
    图14.png

    结语

    这篇文章是记录自己在学习springboot2.0整合redis的过程,肯定有很多不足,欢迎大佬们留言。再次感谢恒宇少年
    项目地址:https://github.com/simperLv/springboot2.0,因为我学习都用的这个工程,所以很乱(扎心....)

    相关文章

      网友评论

        本文标题:记录springboot2.0整合Redis做缓存

        本文链接:https://www.haomeiwen.com/subject/tricqqtx.html