SpringBoot整合Redis及使用

安装和配置redis参考这里 :Redis的安装

1 Springboot整合Redis

1.1 相关注解

(1)缓存@Cacheable

根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。
查看源码,属性值如下:
在这里插入图片描述
(2)缓存@CachePut

使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。
查看源码,属性值如下:
在这里插入图片描述
(3)缓存@CacheEvict

使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上
查看源码,属性值如下:
在这里插入图片描述

1.2 添加依赖

本文使用的springboot版本为2.2.1.RELEASE版本

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

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

1.3 设置配置文件

###############redis配置开始
spring.redis.host=192.168.79.131
spring.redis.port=6379
spring.redis.database= 0
spring.redis.timeout=1800000

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
###############redis配置结束

1.3 新建一个配置类

需要继承CachingConfigurerSupport类


import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;

/**
 * @Author XuZhuHong
 * @CreateTime 2021/12/9 17:06
 */
@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;
    }

2 使用Redis做缓存

我们把注解添加到方法上后 执行方法时 会先到Redis中去查询 如果有就直接返回Redis中的结果 如果没有 就先查询数据库 然后返回结果 再保存数据到redis中

2.1 添加注解

在需要的方法上添加上对应的注解即可
这里用的Cacheable注解 注解作用查看上面的表格

@Cacheable(key = “‘selectIndexList’”, value = “banner”)//把结果缓存到redis的操作

@Override
    @Cacheable(key = "'selectIndexList'", value = "banner")//把结果缓存到redis的操作
    public List< CrmBanner > selectAllBanner() {
        QueryWrapper< CrmBanner > wrapper = new QueryWrapper<>();
        //降序排序并查询前两条记录
        wrapper.orderByDesc("id");
        wrapper.last("limit 2");

        List< CrmBanner > crmBanners = baseMapper.selectList(null);
        return crmBanners;
    }

3 往redis中存取数据

其实在Boot整合Redis的时候 就做一个一个对象的封装 可以实现直接注入 然后使用即可
对应API请参考官网

//redis的对象可以直接使用
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

4 可能遇到的问题以及解决方法

在这里插入图片描述
在这里插入图片描述

Spring Boot中,你可以通过注解来方便地使用Redis。首先,确保你的Spring Boot应用程序中已经添加Redis的依赖。 接下来,你可以使用`@EnableCaching`注解来开启缓存功能,并且指定使用Redis作为缓存管理器。在你的Spring Boot应用程序的主类上添加如下注解: ```java @EnableCaching @SpringBootApplication public class YourApplication { // ... } ``` 然后,你可以在需要使用缓存的方法上添加`@Cacheable`、`@CachePut`、`@CacheEvict`等注解来指定缓存的行为。 - `@Cacheable`:将方法结果缓存起来。在下次相同参数调用时,将直接从缓存中获取结果,而不执行方法体。 - `@CachePut`:将方法结果更新到缓存中。每次方法被调用时,都会执行方法体,并将结果缓存起来。 - `@CacheEvict`:从缓存中删除指定的缓存条目。 以下是一个示例: ```java @Service public class YourService { @Autowired private YourRepository repository; @Cacheable("yourCacheName") public List<YourObject> getCachedData(String key) { return repository.getData(key); } @CachePut("yourCacheName") public List<YourObject> updateCachedData(String key) { return repository.getData(key); } @CacheEvict("yourCacheName") public void clearCache(String key) { // 缓存清除后,方法体会被执行 } } ``` 在上述示例中,`@Cacheable("yourCacheName")`表示将方法的返回结果缓存起来,并指定缓存名为"yourCacheName",方法参数作为缓存的键值。`@CachePut("yourCacheName")`表示每次方法调用都会执行方法体,并将结果更新到缓存中。`@CacheEvict("yourCacheName")`表示从缓存中删除指定的缓存条目。 在配置文件中,你还需要配置Redis的连接信息。可以在application.properties或application.yml文件中添加以下配置: ```properties spring.redis.host=localhost spring.redis.port=6379 spring.redis.password=yourpassword (如果有密码的话) ``` 通过以上步骤,你就可以在Spring Boot应用程序中方便地使用Redis进行缓存了。注意,你需要确保已经正确安装和启动了Redis服务器。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值