MyBatis框架提供了二级缓存接口,我们只需要实现它再开启配置就可以使用了。
特别注意,我们要解决缓存穿透、缓存穿透和缓存雪崩的问题,同时也要保证缓存性能。
具体实现说明,直接看代码注释吧!
1、开启配置
SpringBoot配置mybatis:
configuration:
cache-enabled: true
2、Redis配置以及服务接口
RedisConfig.javapackage com.leven.mybatis.api.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* Redis缓存配置
* @author Leven
* @date 2019-09-07
*/
@Configuration
public class RedisConfig {
/**
* 配置自定义redisTemplate
* @return redisTemplate
*/
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(mapper);
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
RedisService.javapackage com.leven.mybatis.core.service;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
* redis基础服务接口
* @author Leven
* @date 2019-09-07
*/
public interface RedisService {
// =============================common============================
/**
* 指定缓存失效时间
* @param key 键
* @param time 时间(秒)
*/
void expire(String key, long time);
/**
* 指定缓存失效时间
* @param key 键
* @param expireAt 失效时间点
* @return 处理结果
*/
void expireAt(String key, Date expireAt);
/**
* 根据key 获取过期时间
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
Long getExpire(String key);
/**
* 判断key是否存在
* @param key 键
* @return true 存在 false不存在
*/
Boolean hasKey(String key);
/**
* 删除缓存
* @param key 可以传一个值 或多个
*/
void delete(String... key);
/**
* 删除缓存
* @param keys 可以传一个值 或多个
*/
void delete(Collection keys);
// ============================String=============================
/**
* 普通缓存获取
* @param key 键
* @return 值
*/
Object get(String key);
/**
* 普通缓存放入
* @param key 键
* @param value 值
*/
void set(String key, Object value);
/**
* 普通缓存放入并设置时间
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
*/
void set(String key, Object value, long time);
/**
* 普通缓存放入并设置时间
* @param key 键
* @param value 值
* @param time 时间(秒) time要大于0 如果time小于等于0 将设置无限期
*/
void set(String key, Object value, long time, TimeUnit timeUnit);
/**
* 递增
* @param key 键
* @param value 要增加几(大于0)
* @return 递增后结果
*/
Long incr(String key, long value);
/**
* 递减
* @param key 键
* @param value 要减少几(大于0)
* @return 递减后结果
*/
Long decr(String key, long value);
// ================================Map=================================
/**
* HashGet
* @param key 键 不能为null
* @param item 项 不能为null
* @return 值
*/
Object hashGet(String key, String item);
/**
* 获取hashKey对应的所有键值
* @param key 键
* @return 对应的多个键值
*/
Map hashEntries(String key);
/**
* HashSet
* @param key 键
* @param map 对应多个键值
*/
void hashSet(String key, Map map);
/**
* HashSet 并设置时间
* @param key 键
* @param map 对应多个键值
* @param time 时间(秒)
*/
void hashSet(String key, Map map, long time);
/**
* 向一张hash表中放入数据,如果不存在将创建
* @param key 键
* @param item 项
* @param value 值
*/
void hashSet(String key, String item, Object value);
/**
* 向一张hash表中放入数据,如果不存在将创建
* @param key 键
* @param item 项
* @param value 值
* @param time 时间(秒) 注意:如果已存在的hash表有时间,这里将会替换原有的时间
*/
void hashSet(String key, String item, Object value, long time);
/**
* 删除hash表中的值
* @param key 键 不能为null
* @param item 项 可以使多个 不能为null
*/
void hashDelete(String key, Object... item);
/**
* 删除hash表中的值
* @param key 键 不能为null
* @param items 项 可以使多个 不能为null
*/
void hashDelete(String key, Collection items);
/**
* 判断hash表中是否有该项的值
* @param key 键 不能为null
* @param item 项 不能为null
* @return true 存在 false不存在
*/
Boolean hashHasKey(String key, String item);
/**