在 MyBatis 中使用 Redis 缓存策略可以提高应用程序的性能和响应速度。以下是如何在 MyBatis 中集成 Redis 缓存的步骤:
首先,确保你的项目中已经添加了 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>
在 application.properties
或 application.yml
文件中配置 Redis 连接信息:
# application.properties
spring.redis.host=localhost
spring.redis.port=6379
或者
# application.yml
spring:
redis:
host: localhost
port: 6379
创建一个配置类,用于初始化 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);
}
}
创建一个接口,用于定义缓存操作方法:
public interface Cache {
<T> T get(String key, Function<String, T> valueLoader);
void put(String key, Object value);
void remove(String key);
}
创建一个实现类,用于实现 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);
}
}
}
在 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>
在 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>
在 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 缓存中是否存在数据,如果存在则直接返回,否则从数据库中查询并将结果存入缓存。这样可以显著提高应用程序的性能和响应速度。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。