美文网首页
Spring全家桶学习笔记 06 | 轻松访问Redis

Spring全家桶学习笔记 06 | 轻松访问Redis

作者: xeathen | 来源:发表于2019-07-25 11:07 被阅读0次

    1.什么是Redis

    Redis是一款开源的内存Key-Value存储,支持多种数据结构,官方网站为 https://redis.io

    2.Spring对Redis的支持

    • Spring Data Redis

      • 支持的客户端 Jedis / Lettuce
      • RedisTemplate
      • Repository支持
    • 安装redis

    利用docker获取镜像

    docker pull redis
    

    启动 redis

    docker run --name redis -d -p 6379:6379 redis
    

    检查redis状态

    docker ps
    

    3.简单使用

    配置依赖

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

    application.yml配置

    redis:
      host: localhost
      maxTotal: 5
      maxIdle: 5
      testOnBorrow: true
    

    applicaiton启动类

    @Slf4j
    @SpringBootApplication
    public class SpringBucksApplication implements ApplicationRunner {
    
        @Autowired
        private JedisPool jedisPool; //自动注入JedisPool实例
    
        @Autowired
        private JedisPoolConfig jedisPoolConfig; //自动注入JedisPoolConfig实例
    
        public static void main(String[] args) {
            SpringApplication.run(SpringBucksApplication.class, args);
        }
    
    
        @Bean
        @ConfigurationProperties(prefix = "redis") //读取redis配置
        public JedisPoolConfig jedisPoolConfig() {
            return new JedisPoolConfig();
        }
    
        @Bean(destroyMethod = "close") //JedisPool关闭时调用close方法
        public JedisPool jedisPool(@Value("${redis.host}") String host) {
            return new JedisPool(jedisPoolConfig(), host);
        }
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            log.info(jedisPoolConfig.toString()); //打印配置信息
    
            try (Jedis jedis = jedisPool.getResource()) { //利用try(Resource r)在{}方法块运行结束时会将jedis自动关闭
                //利用jedis插入哈希表数据
                jedis.hset("spring-menu",
                        "benz",
                        "50w");
                jedis.hset("spring-menu",
                        "audi",
                        "70w");
                //取出spring-menu中所有数据并打印
                Map<String, String> menu = jedis.hgetAll("spring-menu"); 
                log.info("Menu:{} ", menu);
                String price = jedis.hget("spring-menu", "audi");
                log.info("audi - {}", price);
            }
        }
    }
    

    实际上在启动类中只需借助注解与构造方法,先配置JedisPoolConfig,再配置JedisPool即可使用Jedis,前提是配置好redis的host。

    运行结果

    取数据

    4.使用Redis缓存

    本节通过Spring的缓存抽象来使用Redis进行缓存,所使用的POJO与数据库同上篇Mongo笔记一致。

    配置依赖

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-cache</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
    

    application.properties

    spring.cache.type=redis
    spring.cache.cache-names=coffee
    spring.cache.redis.time-to-live=5000
    spring.cache.redis.cache-null-values=false
    spring.redis.host=localhost
    

    Service配置

    @Slf4j
    @Service
    @CacheConfig(cacheNames = "car")
    public class CarService {
        
        @Autowired
        private CarMapper carMapper;
    
        @Cacheable
        public List<Car> findAllCar(){
            return carMapper.getAll();
        }
    
        @CacheEvict
        public void reloadCar(){
    
        }
    }
    

    @CacheConfig(cacheNames = "car") 指定了缓存的名字,@Cacheable 代表将未在缓存中的方法结果执行后存入缓存,如果方法结果已在缓存中则直接从缓存中取。@CacheEvict 用于缓存的清理。

    application启动类

    @Slf4j
    @EnableCaching(proxyTargetClass = true)
    @SpringBootApplication
    @MapperScan("com.xeathen.cachedemo.mapper")
    public class CacheDemoApplication implements ApplicationRunner {
    
        @Autowired
        private CarService carService;
    
        public static void main(String[] args) {
            SpringApplication.run(CacheDemoApplication.class, args);
        }
    
        @Override
        public void run(ApplicationArguments args) throws Exception {
            log.info("Count: {}", carService.findAllCar().size());
            for (int i = 0; i < 10; i++) {
                log.info("Reading from cache.");
                carService.findAllCar();
            }
            Thread.sleep(5000);
            log.info("Reading after refresh.");
            carService.findAllCar().forEach(c -> log.info("Car {}", c.getName()));
        }
    }
    

    @EnableCaching 当然是用来开启Spring的缓存支持,在 run 方法中持续执行 CarServicefindAllCar() 方法,我在配置文件中开启了Mybatis的Sql输出,可以观察到查询结果是由Sql执行获得的还是直接从缓存中取得的。 Thread.sleep(5000); 线程睡眠时间设置为5秒钟是因为我在配置文件中设定了缓存的存活时间是5秒。

    5.运行结果

    • 第一次执行Sql
    image
    • 从缓存中获取结果
    image
    • 第二次执行Sql
    image
    • 打印结果
    image

    6.小结

    本篇介绍了Redis在Spring中的简单整合和借助Spring的缓存抽象使用Redis进行缓存,下篇中将补充Redis在Spring中的其他用法。

    相关文章

      网友评论

          本文标题:Spring全家桶学习笔记 06 | 轻松访问Redis

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