本小白菜最近在学spring boot,所以本博文只是对于学习中遇到的一些零散知识的记录。之后还会陆续补充的。
1、 ioc
ioc容器就是一个生产和管理bean的容器,原本我们需要在调用类中new的东西,交给ioc就可以了。
2、JPA
HQL语句中的表名是指ORM映射的类名而不是关系数据库中的表名。
3、SpringBoot 不同版本的配置
redis在不同SpringBoot版本下的配置
- 2.0以下版本
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=0
- 2.0以上版本
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1ms
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
差别只在于2.0以上的springBoot中RedisProperties配置文件类的pool属性被封装到了内部静态类Jedis。
pom.xml添加redis依赖时也有区别
- 2.0以下版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
- 2.0以上版本
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
如果有跟我一样没怎么用过java以及相关工具的在用maven加载这些依赖时可以留一下如下图位置是否真的把你需要的依赖导进来了。
小白菜前几天就因为这个问题,在引入mysql依赖时没注意到根本没有引入,导致一整个下午都在捣鼓不知道哪出的错。(╬ ̄皿 ̄)
补充1:
-
在配置redis的连接超时时间timeout时,2.0以上的需要加入时间单位,而2.0以下的默认单位为毫秒。
spring.redis.timeout=60s
-
配置CacheManager
在配置spring boot 的CacheManager为redis时,实例化一个RedisCacheManager出现以下问题
从spring boot2.X源码中,可以看到上面那种构造器已经被删除
而可以通过静态方法creat来构造一个RedisCacheManager。@Bean @SuppressWarnings("rawtypes") public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){ RedisCacheManager redisCacheManager = RedisCacheManager.create(redisConnectionFactory); return redisCacheManager; }
这样产生的CacheManager使用的是spring 的默认配置。
补充2
-
redis缓冲数据,根据key查询得到的是二进制数据
"\xac\xed\x00\x05sr\x00$com.learn.readinglist.entity.Student\xea\xbd\xe5:\xcf\xb8\xe2\x99\x02\x00\x03L\x00\x03aget\x00\x12Ljava/lang/String;L\x00\x02idt\x00\x13Ljava/lang/Integer;L\x00\x04nameq\x00~\x00\x01xpt\x00\x03\xe5\xa5\xb3sr\x00\x11java.lang.Integer\x12\xe2\xa0\xa4\xf7\x81\x878\x02\x00\x01I\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00xp\x00\x00\x00\x01t\x00\x03lyt"
而明明已经自定义了RedisTemplate序列化(如下),为什么没有生效呢?
@Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory){ // 创建一个模板类 RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); //将刚才的redis连接工厂设置到模板类中 template.setConnectionFactory(factory); // StringRedisTemplate template = new StringRedisTemplate(factory); // 设置key的序列化器 template.setKeySerializer(new StringRedisSerializer()); // 设置value的序列化器 //使用Jackson 2,将对象序列化为JSON Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //json转对象类,不设置默认的会将json转成hashmap ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setValueSerializer(jackson2JsonRedisSerializer); template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }
最后找出原因是:在srpingboot 2.x,RedisCache没有使用到RedisTemplate。它是通过通过RedisCacheConfiguration获取valueSerializationPair类序列化对象。
最后去掉上面的代码,改为以下代码@Bean @SuppressWarnings("rawtypes") // @EnableCaching这个切面在新增缓存或者删除缓存的时候会调用这个缓存管理器的方法 public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory){ RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 配置序列化 RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)); RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory) .cacheDefaults(config) .build(); return cacheManager; }
查询出来的数据终于是正常的json格式