您的位置:首页 > 财经 > 产业 > Spring Boot+Mybatis Plus 使用Redis实现二级缓存具体步骤以及代码

Spring Boot+Mybatis Plus 使用Redis实现二级缓存具体步骤以及代码

2024/12/23 6:33:33 来源:https://blog.csdn.net/huanghm88/article/details/140141673  浏览:    关键词:Spring Boot+Mybatis Plus 使用Redis实现二级缓存具体步骤以及代码

下面是使用Spring Boot+Mybatis Plus和Redis实现二级缓存的具体步骤和代码示例:

1. 首先,确保你已经添加了Spring Boot、Mybatis Plus和Redis的依赖。

2. 在Spring Boot的配置文件中添加Redis的配置,如下所示:

```yaml
spring:
  redis:
    host: 地址
    port: 端口
    password: 密码
    database: 数据库
    lettuce:
      pool:
        max-active: 最大连接数
        max-idle: 最大空闲连接数
        min-idle: 最小空闲连接数
        max-wait: 最大等待时间
```

3. 编写一个配置类,用于配置Mybatis Plus的二级缓存和Redis的缓存管理器,如下所示:

```java
@Configuration
@MapperScan("com.example.mapper")
@EnableCaching
public class MybatisPlusConfig {

    @Bean
    public CacheManager cacheManager(RedisConnectionFactory factory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofMinutes(10)) // 设置缓存过期时间
                .disableCachingNullValues()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));

        RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
                .cacheDefaults(config)
                .build();
        return cacheManager;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        redisTemplate.setDefaultSerializer(serializer);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(serializer);

        return redisTemplate;
    }
}
```

4. 在Mybatis Plus的Mapper接口中添加缓存注解,如下所示:

```java
@CacheNamespace(implementation = MybatisRedisCache.class, eviction = MybatisRedisCache.class)
public interface UserMapper extends BaseMapper<User> {

    @Cacheable(key = "#root.methodName + ':' + #p0")
    User selectById(Long id);

    @CachePut(key = "#root.methodName + ':' + #p0.id")
    int updateById(User user);

    @CacheEvict(key = "#root.methodName + ':' + #p0")
    int deleteById(Long id);
}
```

5. 编写一个自定义的缓存实现类 MybatisRedisCache,实现Mybatis Plus的 Cache 接口,并使用 RedisTemplate 来操作 Redis,如下所示:

```java
public class MybatisRedisCache implements Cache {

    private final String id;
    private final RedisTemplate<String, Object> redisTemplate;

    public MybatisRedisCache(String id, RedisTemplate<String, Object> redisTemplate) {
        if (id == null) {
            throw new IllegalArgumentException("Cache instance requires an ID");
        }
        if (redisTemplate == null) {
            throw new IllegalArgumentException("RedisTemplate cannot be null");
        }
        this.id = id;
        this.redisTemplate = redisTemplate;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void putObject(Object key, Object value) {
        if (value != null) {
            redisTemplate.opsForValue().set(getKey(key), value);
        }
    }

    @Override
    public Object getObject(Object key) {
        return redisTemplate.opsForValue().get(getKey(key));
    }

    @Override
    public Object removeObject(Object key) {
        String redisKey = getKey(key);
        Object value = redisTemplate.opsForValue().get(redisKey);
        redisTemplate.delete(redisKey);
        return value;
    }

    @Override
    public void clear() {
        redisTemplate.delete(redisTemplate.keys(getKey("*")));
    }

    @Override
    public int getSize() {
        return redisTemplate.keys(getKey("*")).size();
    }

    private String getKey(Object key) {
        return id + ":" + key.toString();
    }
}
```

以上就是使用Spring Boot+Mybatis Plus和Redis实现二级缓存的具体步骤和代码示例。在具体的业务代码中,通过在Mapper方法上添加缓存注解,即可实现自动缓存数据到Redis中。同时,在需要更新或删除数据时,也会自动更新Redis中的缓存数据。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com