赞
踩
1.之前已经使用redis作为缓存,对单个对象和List对象做缓存时均没有问题。
redis本身没有出现问题,当然配置也没有问题。序列化和反序列化也没出问题
2.新增了一个分页器,手写的分页对象,对分页查询的数据缓存
一开报错:
DefaultSerializer requires a Serializable payload but received an object of type [com.penghf.springboot_mybatis.util.PageUtil]
这是我忘记给新增的分页对象PageUtil实现序列化接口Serializable,加上
再查询,报错:
java.lang.ClassCastException: com.penghf.springboot_mybatis.pojo.Girl cannot be cast to com.penghf.springboot_mybatis.pojo.Girl
怎么还会报类型转化错误了,关键是自己转化成自己错了????
去redis查数据,数据已经存进去了,那就是取出来的问题了。
DEBUG一试:
流程走下去,看起来都没问题,没办法上网查:
说是devtools导致的,原来是我再项目之初就是用了devtools进行快速部署(所谓的热部署)
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- <optional>true</optional>
- </dependency>
删掉删掉!!!
重启,好了!搞定了!
启动日志:
使用了devtools
- 2019-03-05 10:23:50.554 INFO 6792 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
- 2019-03-05 10:23:50.557 INFO 6792 --- [ restartedMain] c.p.s.SpringbootMybatisApplication : Started SpringbootMybatisApplication in 3.22 seconds (JVM running for 4.071)
- 2019-03-05 10:23:50.559 DEBUG 6792 --- [ restartedMain] o.s.boot.devtools.restart.Restarter : Creating new Restarter for thread Thread[main,5,main]
- 2019-03-05 10:23:50.560 DEBUG 6792 --- [ restartedMain] o.s.boot.devtools.restart.Restarter : Immediately restarting application
- 2019-03-05 10:23:50.560 DEBUG 6792 --- [ restartedMain] o.s.boot.devtools.restart.Restarter : Created RestartClassLoader org.springframework.boot.devtools.restart.classloader.RestartClassLoader@ef26b1
- 2019-03-05 10:23:50.560 DEBUG 6792 --- [ restartedMain] o.s.boot.devtools.restart.Restarter : Starting application com.penghf.springboot_mybatis.SpringbootMybatisApplication with URLs [file:/E:/Workspaces/workspace-career/springboot_mybatis/target/classes/]
不适用devtools
- 2019-03-05 10:22:04.651 INFO 12836 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
- 2019-03-05 10:22:04.653 INFO 12836 --- [ main] c.p.s.SpringbootMybatisApplication : Started SpringbootMybatisApplication in 2.792 seconds (JVM running for 3.477)
当对象被序列化到缓存里时,当前应用的类加载器是C1,当你改变了一些代码或者配置文件的时候,DevTools 工具将会自动重新启动这个容器,并且创建一个新的类加载器 C2. 这时候调用这个具有缓存的方法时,缓存管理将会从缓存里找到该条缓存记录并进行反序列化操作。如果缓存库不考虑上下文的话,也就是没注意到类加载器的变化时,该对象将会有错误的类加载器
其实就是因上下文类加载器不同而产生这样的错误,那么归根结底就是因SpringBoot DevTools工具搞的
1.经上次配置后,再回顾,发现设置的缓存过期时间并没有生效,
2.且对于缓存键的设计需要更深的理解,不然这一删除一个缓存就全部删除了
3.删除缓存后,竟然直接报错,不再通过数据库访问
4.缓存-数据库同步解决方案
5.缓存失效策略,缓存穿透、缓存击穿、缓存雪崩解决策略
若用spring的缓存注解和redis集成,需要更多的方法配置熟悉
可以自定义注解进行缓存计划
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。