下面是使用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中的緩存數據。