导包
<!--redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置redis配置项
spring:
redis:
host: localhost
port: 6379
password: ""
timeout: 1000
redisTemplate的配置
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSeial()))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.transactionAware()
.build();
return cacheManager;
}
/**
* retemplate相关配置
* @param factory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
// 配置连接工厂
template.setConnectionFactory(factory);
// 值采用json序列化
template.setValueSerializer(jacksonSeial());
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
// 设置hash key 和value序列化模式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jacksonSeial());
template.afterPropertiesSet();
return template;
}
public Jackson2JsonRedisSerializer jacksonSeial()
{
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
return jacksonSeial;
}
//缓存对象集合中,缓存是以key-value形式保存的。当不指定缓存的key时,SpringBoot会使用KeyGenerator 生成key。
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
StringBuilder sb = new StringBuilder();
// sb.append(o.getClass().getName());
sb.append(method.getName());
for (Object obj : objects) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
}
测试
使用redistemplate
@Autowired
private UserMapper userMapper;
@Autowired
private RedisTemplate redisTemplate;
@Override
//@Cacheable(value = "userlist",keyGenerator = "keyGenerator")
public List<User> findAllUserList() {
//如果redis中有的话就从redis中取
Object obj=redisTemplate.opsForValue().get("userlist");
if(obj!=null)
{
System.out.println("find in redis");
List<User> userlist=JSONObject.parseArray(JSON.toJSONString(obj),User.class);
return userlist;
}else
{
//如果redis中没有的话,就从mysql中找,并存入redis中
System.out.println("find in db");
redisTemplate.opsForValue().set("userlist",userMapper.selectAll());
return userMapper.selectAll();
}
}
结果如下:
value为json字符串格式。因为在RedisConfig 中设置了自定义的序列化方式;
使用cache注解方式
@Override
@Cacheable(value = "userlist",keyGenerator = "keyGenerator")
public List<User> findAllUserList() {
System.out.println("find in db");
return userMapper.selectAll();
}
结果如下:
可以发现key值不一样,因为在RedisConfig中配置了,keygenerator会根据方法名和参数拼接成一个key
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object o, Method method, Object... objects) {
StringBuilder sb = new StringBuilder();
// sb.append(o.getClass().getName());
sb.append(method.getName());
for (Object obj : objects) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
网友评论