springboot整合redis6以及相关问题

创建spring boot工程

 

 勾选相关需要的依赖

 

 使用mybatis-plus操作数据库还需要引入mybatis-plus和自动生成代码的依赖

        <!--   mybatis-plus自动代码生成器1 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!--   mybatis-plus自动代码生成器2      -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
<!--        springboot整合mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>

 创建数据库和User表 并添加一条数据

在测试类中写入以下代码,完成mapper,service,controller和entity的创建,注意文件路径不要写错了

 public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://localhost:3306/spring-redis-study?serverTimezone=GMT%2B8", "root", "root")
                .globalConfig(builder -> {
                    builder.author("紫金") // 设置作者
                            //.enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir("C:\\Users\\23500\\Desktop\\springboot-redis\\src\\main\\java"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com") // 设置父包名
                            .moduleName("springboot_redis") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,
  "C:\\Users\\23500\\Desktop\\springboot-redis\\src\\main\\resources\\mapper")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("user");//设置需要生成的表
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
    }

 注解@MapperScan,注意,如果使用@MapperScan在启动类上,在属性注入调用 Mapper时可能会爆红,这是idea机制的问题与代码无关,要想不暴红不使用@MapperScan,在每个mapper文件上注解@Mapper即可解决爆红问题

配置数据源,创建application.yml文件,写入连接的条件,到此springboot整合mybatis-plus demo项目完成

 接下来整合redis,首先在windows或者是linux上开启redis

开启redis之后,在aplication.yml文件中进行配置,redis服务器地址在linux通过ifconfig命令查看     (同时配置端口号 server.port=8080)

 引入redis有关依赖

   <!--        springboot整合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>

 现在进行测试,在controller中通过方法进行检验连接redis有啥问题没有

写好controller层后启动springboot结果发现报如下错误,错误的原因我的理解是版本的问题,springboot的版本太高整合redis时就会报错,我这里是2.6.10,把他改为2.5.0即可 (修改了pom.xml记得刷新)

 

 再次启动服务器没有报错,打开浏览器,输入请求地址,发现能从redis中获取数据

 打开redis,查看数据,发现数据乱码,因为RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的,因此redisTemplate在存储时, 可能出现乱码现象

 解决乱码问题,需要创建config文件夹,在文件夹中创建RedisConfig.java文件,写入以下代码(这里可以直接粘贴赋值)


package com.springboot_redis.config;

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;


@EnableCaching
@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean("redisTemplate")
    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;
    }
}

重新启动springboot,清空redis数据库中的内容,在浏览器中重新发送请求,之后在linux中查看,发现乱码问题解决

至此,springboot整合redis完成。不过注意,在向redis中存数据时,存的是list集合到redis中,而获取的是Object类型,这里可以通过阿里提供的数据转换进行操作,首先导入依赖

 <!--        阿里提供的json数据转换-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.60</version>
        </dependency>

刷新pom.xml之后把在controller中进行代码修改(使用StringRedisTemplate)

 之后,在浏览器中获取的值就是集合类型

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值