温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

在MyBatis中使用Redis缓存策略

发布时间:2024-12-01 17:37:38 来源:亿速云 阅读:82 作者:小樊 栏目:关系型数据库

在 MyBatis 中使用 Redis 缓存策略可以提高应用程序的性能和响应速度。以下是如何在 MyBatis 中集成 Redis 缓存的步骤:

  1. 添加依赖

首先,确保你的项目中已经添加了 MyBatis 和 Redis 的相关依赖。在 Maven 项目的 pom.xml 文件中添加以下依赖:

<!-- MyBatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>

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

<!-- Redisson for distributed locks -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.16.1</version>
</dependency>
  1. 配置 Redis

application.propertiesapplication.yml 文件中配置 Redis 连接信息:

# application.properties
spring.redis.host=localhost
spring.redis.port=6379

或者

# application.yml
spring:
  redis:
    host: localhost
    port: 6379
  1. 创建 Redis 配置类

创建一个配置类,用于初始化 RedisTemplate 和 RedissonClient:

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public RedissonClient redissonClient(RedisConnectionFactory factory) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://" + factory.getHost() + ":" + factory.getPort());
        return Redisson.create(config);
    }
}
  1. 创建 MyBatis 缓存接口

创建一个接口,用于定义缓存操作方法:

public interface Cache {
    <T> T get(String key, Function<String, T> valueLoader);
    void put(String key, Object value);
    void remove(String key);
}
  1. 实现 MyBatis 缓存接口

创建一个实现类,用于实现 Cache 接口,并使用 RedisTemplate 进行缓存操作:

@Repository
public class RedisCache implements Cache {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisCache(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public <T> T get(String key, Function<String, T> valueLoader) {
        String value = (String) redisTemplate.opsForValue().get(key);
        return value != null ? deserialize(value, valueLoader.getClass()) : null;
    }

    @Override
    public void put(String key, Object value) {
        redisTemplate.opsForValue().set(key, serialize(value));
    }

    @Override
    public void remove(String key) {
        redisTemplate.delete(key);
    }

    private <T> T deserialize(String value, Class<T> clazz) {
        // 使用 JSON 序列化/反序列化库,如 Jackson 或 Gson
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.readValue(value, clazz);
        } catch (IOException e) {
            throw new RuntimeException("Failed to deserialize value", e);
        }
    }

    private String serialize(Object value) {
        // 使用 JSON 序列化/反序列化库,如 Jackson 或 Gson
        ObjectMapper objectMapper = new ObjectMapper();
        try {
            return objectMapper.writeValueAsString(value);
        } catch (JsonProcessingException e) {
            throw new RuntimeException("Failed to serialize value", e);
        }
    }
}
  1. 配置 MyBatis 使用缓存

在 MyBatis 的配置文件(如 mybatis-config.xml)中添加缓存配置:

<settings>
    <setting name="cacheEnabled" value="true"/>
    <setting name="lazyLoadingEnabled" value="true"/>
    <setting name="multipleResultSetsEnabled" value="true"/>
    <setting name="useColumnLabel" value="true"/>
    <setting name="autoMappingBehavior" value="PARTIAL"/>
    <setting name="defaultExecutorType" value="SIMPLE"/>
    <setting name="defaultStatementTimeout" value="25"/>
    <setting name="defaultFetchSize" value="100"/>
    <setting name="useGeneratedKeys" value="false"/>
    <setting name="autoMappingUnknownColumnToBean" value="true"/>
    <setting name="defaultResultMap" value="true"/>
</settings>
  1. 在 MyBatis 映射文件中添加缓存注解

在 MyBatis 的映射文件中,使用 @CacheNamespace 注解为查询结果添加缓存:

<mapper namespace="com.example.demo.entity.User">
    <cache namespace="userCache"/>

    <select id="findById" resultType="com.example.demo.entity.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>
  1. 在 Service 层使用缓存

在 Service 层,通过依赖注入获取 Cache 实例,并在查询时使用缓存:

@Service
public class UserService {

    private final UserMapper userMapper;
    private final Cache cache;

    public UserService(UserMapper userMapper, Cache cache) {
        this.userMapper = userMapper;
        this.cache = cache;
    }

    public User findById(Long id) {
        String key = "user:" + id;
        return cache.get(key, k -> userMapper.findById(k));
    }
}

现在,当你在 Service 层调用 findById 方法时,MyBatis 会首先检查 Redis 缓存中是否存在数据,如果存在则直接返回,否则从数据库中查询并将结果存入缓存。这样可以显著提高应用程序的性能和响应速度。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI