springboot集成redis与MyBatis的结合使用

2021/4/28 19:55:19

本文主要是介绍springboot集成redis与MyBatis的结合使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

所需依赖

    <dependencies>
    	<!--web项目的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mybatis依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.4</version>
        </dependency>
        
        <!--连接数据库的依赖-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
            <scope>runtime</scope>
        </dependency>
        
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!--redis与springboot集成依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.4.5</version>
        </dependency>
        
	</dependencies>

配置类的方式进行配置Redis

@Configuration
public class RedisConfig {
    @Bean
    public LettuceConnectionFactory factory() {
        LettuceConnectionFactory factory = new LettuceConnectionFactory();
        factory.afterPropertiesSet();
        return factory;
    }

    @Bean
    public RedisTemplate redisTemplate() {
        RedisTemplate template = new RedisTemplate();

        template.setConnectionFactory(factory());
        //指定redis的键值对的序列化方式默认JDK的序列化方式
        template.setKeySerializer(RedisSerializer.string());
        template.setValueSerializer(RedisSerializer.json());
        template.setHashKeySerializer(RedisSerializer.string());
        template.setHashValueSerializer(RedisSerializer.json());
        return template;
    }
}

业务层Redis结合Mybatis使用(推荐)

因为Redis将数据写入缓存中,所以Redis的读取速度比数据库的速度快得多。
本次使用Redis结合Mybatis来进行增删查改,来提高访问速度。
原理大概就是进行读操作时优先读取Redis,必须保证Redis与数据库数据同步。

首先是Redis的业务层逻辑

@Service
public class RedisService {
    @Autowired
    private RedisTemplate redisTemplate;
    
    /**
     * redis设置键值
     */
    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 设置键值对和超时时间
     */
    public void set(String key, Object value, Long timeout) {
        redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);
    }

    /**
     * 获取值
     */
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 删除键值对
     */
    public boolean delete(String key) {
        return redisTemplate.delete(key);
    }
}

Redis与Mybatis的业务层

@Service
public class UserServiceImpl implements UserService {
    @Autowired(required = false)
    UserMapper userMapper;

    @Autowired
    RedisService redisService;

    @Override
    public void add(User user) {
        userMapper.add(user);
        String key = "user_queryById_" + user.getId();
        //新增数据,将该数据写入缓存中。
        redisService.set(key,user);
    }

    @Override
    public void deleteById(Integer id) {
        userMapper.deleteById(id);
        //删除数据,将Redis对应的数据删除
        redisService.delete("user_queryById_"+id);
    }

    @Override
    public User queryById(Integer id) {
        User user = null;
        String key = "user_queryById_" + id;
        //先从Redis中读取
        Object o = redisService.get(key);
        //如果没有就读取数据库
        if (o == null) {
            o = userMapper.queryById(id);
            //读取的数据加载到Redis中
            redisService.set(key, o);
        }
        user = (User) o;

        return user;
    }

    @Override
    public void update(User user) {
        //更新数据库
        userMapper.update(user);
        //更新redis缓存
        String key = "user_queryById_" + user.getId();
        redisService.set(key,user);
    }
}

使用Redis的注解(不推荐)

该方法不够灵活不推荐使用。
配置Redis
注意开启缓存。否则Redis的注解不生效

@Configuration
@EnableCaching//开启缓存功能
public class RedisConfig {
    @Bean
    public LettuceConnectionFactory factory() {
        LettuceConnectionFactory factory = new LettuceConnectionFactory();
        factory.afterPropertiesSet();
        return factory;
    }

    @Bean
    public RedisTemplate redisTemplate() {
        RedisTemplate template = new RedisTemplate();

        template.setConnectionFactory(factory());
        //指定redis的键值对的序列化方式默认JDK的序列化方式
        template.setKeySerializer(RedisSerializer.string());
        template.setValueSerializer(RedisSerializer.json());
        template.setHashKeySerializer(RedisSerializer.string());
        template.setHashValueSerializer(RedisSerializer.json());
        return template;
    }

    @Bean//缓存功能默认不开启,需要开启缓存功能
    public CacheManager cacheManager() {
        //获取redis缓存配置类,设置相关的配置内容
        RedisCacheConfiguration config = RedisCacheConfiguration
                //创建默认的缓存配置
                .defaultCacheConfig()
                //设置超时时间ofSeconds单位是秒
                .entryTtl(Duration.ofSeconds(30))
                //设置缓存名称前缀
                .prefixCacheNameWith("sys_")
                //设置缓存键值的序列化方式,键默认是使用RedisSerializer.string()字符串序列化方式,值设置为RedisSerializer.json()的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));

        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(factory());
        //创建Redis缓存对象
        RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, config);
        return cacheManager;
    }
}

使用注解
在数据库进行写操作后将Redis对应的键删除。

@Service
@Primary//默认IoC注入这个对象
@Transactional
public class UserServiceImpl2 implements UserService {
    @Autowired(required = false)
    UserMapper userMapper;

    /**
     * CacheEvict
     * 删除redis指定的键,在执行对应的方法后
     */
    @Override
    @CacheEvict(value = "user",key = "'user_'+#id")
    public void deleteById(Integer id) {
        userMapper.deleteById(id);
    }

    /**
     * 先查询缓存中是否存在对应的Key,缓存名称前缀+value+key=useruser::user_id
     * 如果存在直接返回数据,如果不存在,再执行方法获取数据库数据,然后保存到缓存
     */
    @Override
    @Cacheable(value = "user",key = "'user_'+#id")
    public User queryById(Integer id) {
        return userMapper.queryById(id);
    }

   /**
     * CacheEvict
     * 删除redis指定的键,在执行对应的方法后
     */
    @Override
    @CacheEvict(value = "user",key = "'user_'+#user.id")
    public void update(User user) {
        userMapper.update(user);
    }
}


这篇关于springboot集成redis与MyBatis的结合使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程