SpringBoot整合Redis6及简单增删改查

330 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情

简介

本文将从零开始以SpringBoot为基础整合Redis6,并配合mybatis-plus的代码生成器实现基础的mysql+redis双数据源的增删改查

整合mybatis-plus并生成基础框架
  1. 引入相关依赖

    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.5.2</version>
    </dependency>
    <!-- 模板引擎 -->
    <!--代码生成器的freemarker引擎-->
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
    </dependency>
    
    <!--用于生成接口文档,此处用于配合代码生成器的swagger注解-->
    <dependency>
        <groupId>com.github.xiaoymin</groupId>
        <artifactId>knife4j-spring-boot-starter</artifactId>
        <version>3.0.3</version>
    </dependency>
    
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.1</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!--SpringBoot集成druid连接池-->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>1.1.10</version>
    </dependency>
    
  2. 写配置文件

     spring:
       datasource:
         druid:
           test-while-idle: false
         password: 
         type: com.alibaba.druid.pool.DruidDataSource
         url: 
         username: 
       mvc:
         pathmatch:
           matching-strategy: ANT_PATH_MATCHER
    

    基本上都是很常见的配置,最后的配置是解决引入了swagger项目无法启动的问题(具体原因我也不是太理解,希望理解的小伙伴解惑)

  3. 配置代码生成器

     import com.baomidou.mybatisplus.generator.FastAutoGenerator;
     import com.baomidou.mybatisplus.generator.config.OutputFile;
     import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
     import org.junit.jupiter.api.Test;
    
     import java.util.Collections;
    
     public class CodeGenerator {
         @Test
         public void generator(){
             FastAutoGenerator.create("url", "username", "password")
                     .globalConfig(builder -> {
                         builder.author("wz") // 设置作者
                                 .disableOpenDir()
                                 .enableSwagger()
                                 .fileOverride() // 覆盖已生成文件
                                 .outputDir("D:\web\redis-demo\src\main\java"); // 指定输出目录
                     })
                     .packageConfig(builder -> {
                         builder.parent("com.wz") // 设置父包名
                                 .moduleName("redis") // 设置父包模块名
                                 .pathInfo(Collections.singletonMap(OutputFile.xml, "D:\web\redis-demo\src\main\resources\mapper")); // 设置mapperXml生成路径
                     })
                     .strategyConfig(builder -> {
                         builder.addInclude("t_user") // 设置需要生成的表名
                                 .addTablePrefix("t_"); // 设置过滤表前缀
                     })
                     .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                     .execute();
    
         }
     }
    

    这里是直接从mybatis-plus官网复制的,只需要改下数据库信息以及文件输出路径即可,满足基本需求是没有问题的。需要特殊需求的话可以自行翻阅文档 生成完成之后在主启动类上打上@MapperScan注解即可正常启动

  4. 整合Redis

    引入相关依赖

     <!--SpringBoot与Redis整合依赖-->
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
     </dependency>
     <dependency>
         <groupId>redis.clients</groupId>
         <artifactId>jedis</artifactId>
         <version>3.1.0</version>
     </dependency>
    

    在yml完善redis相关配置

    redis:
      database: 0
      host: 
      port: 
    

    编写Redis配置类,主要是设置RedisTemplate,不然写入redis的数据会出问题,出现莫名其妙的字符(血泪的教训)

    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    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.RedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    
    import javax.annotation.Resource;
    
    @Configuration
    public class RedisConfig {
    
        @Resource
        RedisConnectionFactory redisConnectionFactory;
        @Bean
        public RedisTemplate redisTemplate() {
            RedisTemplate<Object, Object> template = new RedisTemplate();
            template.setConnectionFactory(redisConnectionFactory);
    
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            jackson2JsonRedisSerializer.setObjectMapper(new ObjectMapper());
    
            RedisSerializer stringSerializer = new StringRedisSerializer();
    
            template.setKeySerializer(stringSerializer);
            template.setValueSerializer(jackson2JsonRedisSerializer);
    
            template.setHashKeySerializer(stringSerializer);
            template.setHashValueSerializer(jackson2JsonRedisSerializer);
    
            return template;
        }
    }
    

    启动项目,如果Redis连接失败,可以尝试更改服务器上的Redis配置文件的以下三个配置:

    1. 修改daemonize 改为 daemonize yes
    2. 修改protected-mode yes 改为 protected-mode no
    3. 注释掉 #bin 127.0.0.1

    如果redis设置了密码,则需要在yml配置文件里完成配置 到这里,SpringBoot与Redis的整合基本就完成了,剩下的就是测试的工作了。我这里也有写好的基础模板(其实也是根据其他老师的代码写的),贴出来方便大家测试

    serviceImpl
    import com.wz.redis.entity.User;
    import com.wz.redis.mapper.UserMapper;
    import com.wz.redis.service.UserService;
    import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    
    /**
     * <p>
     * 用户表 服务实现类
     * </p>
     *
     * @author wz
     * @since 2022-08-12
     */
    @Service
    @Slf4j
    public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
        public static final String CACHE_KEY_USER = "user:";
    
        @Resource
        private UserMapper userMapper;
        @Resource
        private RedisTemplate redisTemplate;
    
        @Override
        public void addUser(User user){
            int insertCount = userMapper.insert(user);
    
            if (insertCount > 0) {
                user = userMapper.selectById(user.getId());
    
                String key = CACHE_KEY_USER + user.getId();
                redisTemplate.opsForValue().set(key, user);
            }
        }
    
        @Override
        public void deleteUser(Integer id){
            int deleteCount = userMapper.deleteById(id);
            if (deleteCount > 0) {
                String key = CACHE_KEY_USER + id;
                redisTemplate.delete(key);
            }
        }
    
        @Override
        public void updateUser(User user){
            int updateCount = userMapper.updateById(user);
            if (updateCount > 0){
                user = userMapper.selectById(user.getId());
    
                String key = CACHE_KEY_USER + user.getId();
                redisTemplate.opsForValue().set(key, user);
            }
        }
    
        @Override
        public User findUserById(Integer id){
            String key = CACHE_KEY_USER + id;
            User user = (User) redisTemplate.opsForValue().get(key);
            if (user == null) {
                user = userMapper.selectById(id);
                if (user == null) {
                    return null;
                }else {
                    redisTemplate.opsForValue().setIfAbsent(key, user);
                }
            }
    
            return user;
        }
    
    
    }
    
    controller
    import cn.hutool.core.util.IdUtil;
    import cn.hutool.core.util.RandomUtil;
    import com.wz.redis.entity.User;
    import com.wz.redis.entity.dto.UserDto;
    import com.wz.redis.service.UserService;
    import org.springframework.beans.BeanUtils;
    import org.springframework.web.bind.annotation.*;
    import org.springframework.stereotype.Controller;
    
    import javax.annotation.Resource;
    
    /**
     * <p>
     * 用户表 前端控制器
     * </p>
     *
     * @author wz
     * @since 2022-08-12
     */
    @RestController
    @RequestMapping("/redis/user")
    public class UserController {
    
        @Resource
        private UserService userService;
    
        @PostMapping("/addUser")
        public void addUser(){
            for (int i = 0; i < 5; i++) {
                User user = new User();
                user.setUsername("wz"+i);
                user.setPassword(IdUtil.simpleUUID().substring(0, 6));
                user.setSex(RandomUtil.randomInt(0, 2));
    
                userService.addUser(user);
            }
        }
    
        @GetMapping("delete/{id}")
        public void deleteUser(@PathVariable("id") Integer id){
            userService.deleteUser(id);
        }
    
        @PostMapping("/updateUser")
        public void updateUser(@RequestBody UserDto userDto){
            User user = new User();
            BeanUtils.copyProperties(userDto, user);
            userService.updateUser(user);
        }
    
        @GetMapping("/findUserById/{id}")
        public User findUserById(@PathVariable("id") Integer id){
            return userService.findUserById(id);
        }
    
    }
    

结尾

文章到这里就结束了,欢迎大家留言讨论