Mybaits用redis做二级缓存
之前用redis没有作为缓存使用过第一次使用发现一大堆鬼
首先引入redis
yml文件配置
#Redis配置 redis: host: password: port: 6379 http: multipart: max-file-size: 10Mb max-request-size: 10Mb encoding: charset: UTF-8 force: true
RedisConfig文件配置
** * redis 配置 */ @Configuration @EnableCaching // 启用缓存 @EnableRedisHttpSession //启用redis session public class RedisConfig { private static final String NULL = "NULL"; @Bean public KeyGenerator wiselyKeyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj == null ? NULL : obj.toString()); } return sb.toString(); } }; } @Bean public CacheManager cacheManager(RedisTemplate<Object, Object> redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); cacheManager.setDefaultExpiration(1800); return cacheManager; } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); return template; } }
构建加入缓存的po类
public class EncyclopediaCatVo
private Integer id; private String name
public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name;
构建方法
@Override @Cacheable(value = "getFertilizerCat", keyGenerator = "wiselyKeyGenerator") public List<EncyclopediaCatVo> getFertilizerCat() {
将返回的list放入缓存中
然后在redisDesktopmanager中看到这样一群鬼
Redis序列默认是
if (defaultSerializer == null) { defaultSerializer = new JdkSerializationRedisSerializer( classLoader != null ? classLoader : this.getClass().getClassLoader()); }
可是我已经配置
GenericJackson2JsonRedisSerializer()
很迷茫在网上找了好多资料也没解决。无奈只能自己看看源码
/** * Constructs a new {@link RedisCache} instance. * * @param name cache name * @param prefix must not be {@literal null} or empty. * @param redisOperations * @param expiration * @param allowNullValues * @since 1.8 */ public RedisCache(String name, byte[] prefix, RedisOperations<? extends Object, ? extends Object> redisOperations, long expiration, boolean allowNullValues) { super(allowNullValues); Assert.hasText(name, "CacheName must not be null or empty!"); RedisSerializer<?> serializer = redisOperations.getValueSerializer() != null ? redisOperations.getValueSerializer() : (RedisSerializer<?>) new JdkSerializationRedisSerializer(); this.cacheMetadata = new RedisCacheMetadata(name, prefix); this.cacheMetadata.setDefaultExpiration(expiration); this.redisOperations = redisOperations; this.cacheValueAccessor = new CacheValueAccessor(serializer);
注入了redistemplate给redisoperations
自己跑debug显示redisoperations没有得到valueserializer
这才回过神
@Bean public CacheManager cacheManager(RedisTemplate<Object, Object> redisTemplate) { redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); cacheManager.setDefaultExpiration(1800); return cacheManager; }
总结
Redistemplate中配置了序列化方式但是在cacheManager中注入的redistemplate还是没有配置序列化的redistemplate