springboot项目集成Redis的简单使用

项目中为什么要使用redis?

redis作为缓存可以减少数据库的压力,特别是需要频繁查询大量数据的情形下。使用redis还可以提高访问速度,因为redis的数据会被保存在内存中,可以持久化,也可以支持多种数据类型的存储。

1. 下载Redis,并解压后运行。

链接如下: redis.io/

2. 项目中导入对应版本的依赖

        <!-- redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
             <version>x.x.0</version>
        </dependency>

<!--     spring2.X集成redis所需common-pool2-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.6.0</version>
        </dependency>
复制代码

3. 配置文件中添加配置

#配置redis
spring.redis.host=localhost
spring.redis.port=6379
spirng.redis.database=0
spring.redis.timeout=180000


spring.redis.lettuce.pool.max-active=20
spring.redis.lettuce.pool.max-wait=-1
#最大阻塞等待时间(负数表示没限制)
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=0
复制代码

4. 创建redis的配置类

如下

@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setConnectionFactory(factory);
        //key序列化方式
        template.setKeySerializer(redisSerializer);
        //value序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        //value hashmap序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        return template;
    }

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //解决查询缓存转换异常的问题
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        // 配置序列化(解决乱码的问题),过期时间600秒
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(600))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
                .disableCachingNullValues();
        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }
复制代码

5. 在接口中添加redis缓存

5.1 Spring Boot缓存注解

5.1.1 缓存@Cacheable

根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,那么直接从缓存中进行读取数据返回。如果缓存中数据不存在,那么就执行该方法,并且把方法执行后的返回值存入到数据库中。一般用在查询方法上,查看源码,注解中有三个参数。

属性/方法名 解释
values 必填,它指定了缓存存放在哪一块命名空间
key 可选属性,可以使用Spel表达式自定义缓存的key
cacheNames 与key差不多,二选一即可

5.1.2 缓存@CachePut

使用该注解标示的方法,每次都会执行,并将结果存入指定的缓存之中。其他方法可以从指定的缓存中读取数据,而不需要查询数据库,一般用在新增方法上。

属性/方法名 解释
values 必填,它指定了缓存存放在哪一块命名空间
key 可选属性,可以使用Spel表达式自定义缓存的key
cacheNames 与key差不多,二选一即可

5.1.3 缓存@CacheEvict

使用该注解的方法,会清空指定的缓存,一般用在插入和删除上面

属性/方法名 解释
values 必填,它指定了缓存存放在哪一块命名空间
key 可选属性,可以使用Spel表达式自定义缓存的key
cacheNames 与key差不多,二选一即可
allEntries 是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存
beforeInvocation 是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存

5.1.4 使用

添加注解.png

此时我们测试运行,就会发现缓存起作用了!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享