第1步:引入缓存上下文
import com.zhangziwa.practisesvr.model.Student; import java.util.HashMap; import java.util.Map; import java.util.Objects; import static org.apache.commons.lang3.ObjectUtils.anyNull; public class StudentContextHolder { private static final ThreadLocal
第2步:查询先查缓存,查询到值先存缓存
public Student queryById(Integer id) { if (Objects.isNull(id)) { return null; } // 线程缓存里去 Student student = StudentContextHolder.getStudent(id); if (nonNull(student)) { return student; } student = studentsMapper.queryById(id); // 查询数据库值先存缓存 StudentContextHolder.setStudent(id, student); return student; }
第3步:清理缓存上下文
public class ResponsePostInterceptor implements HandlerInterceptor { //在Controller执行之前调用,如果返回false,controller不执行 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.err.println("***ResponsePostInterceptor.preHandle***"); return true; } //controller执行之后,且页面渲染之前调用 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.err.println("***ResponsePostInterceptor.postHandle***"); } //页面渲染之后调用,一般用于资源清理操作 @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.err.println("***ResponsePostInterceptor.afterCompletion***"); StudentContextHolder.clear(); // 清除student上下文 } }
第4步:验证使用
@GetMapping("{id}") public ResponseEntityqueryById(@PathVariable("id") Integer id) { System.out.println("***StudentController.queryById***"); Student body = studentService.queryById(id); System.out.println(body); System.out.println(studentService.queryById(id)); return ResponseEntity.ok(body); }
执行日志
[2024-01-26 01:16:16.068_068] [WARN ] [http-nio-8080-exec-2] [LogFilter.java:21] → [LogFilter.doFilter: Start processing request at 2024-01-25T17:16:16.068132700Z - /students/8] ***LogFilter.doFilter.start*** ***RequestHeaderCheckFilter.doFilter.start*** ***ResponsePostInterceptor.preHandle*** ***LogInterceptor.preHandle*** [2024-01-26 01:16:16.094_094] [WARN ] [http-nio-8080-exec-2] [LogInterceptor.java:37] → [LogInterceptor.postHandle: Start processing request at 2024-01-25T17:16:16.094950300Z - /students/8] ***StudentController.queryById*** Creating a new SqlSession SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3bfba234] was not registered for synchronization because synchronization is not active [2024-01-26 01:16:16.128_128] [INFO ] [http-nio-8080-exec-2] [HikariDataSource.java:110] → [practisedb - Starting...] [2024-01-26 01:16:16.248_248] [INFO ] [http-nio-8080-exec-2] [HikariPool.java:565] → [practisedb - Added connection com.mysql.cj.jdbc.ConnectionImpl@12e4ef1] [2024-01-26 01:16:16.252_252] [INFO ] [http-nio-8080-exec-2] [HikariDataSource.java:123] → [practisedb - Start completed.] JDBC Connection [HikariProxyConnection@688850212 wrapping com.mysql.cj.jdbc.ConnectionImpl@12e4ef1] will not be managed by Spring ==> Preparing: select id, username, password, age, height, gender, class_id, is_delete from students where id = ? ***SqlExecuteInterceptor.intercept*** ***SqlReadRowInterceptor.intercept*** ==> Parameters: 8(Integer) <== Columns: id, username, password, age, height, gender, class_id, is_delete <== Row: 8, 汪子韬, lq2fks1eg5, 24, 161.84, 女, 5, 0 <== Total: 1 Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3bfba234] Student(id=8, username=汪子韬, password=lq2fks1eg5, age=24, height=161, gender=女, classId=5, isDelete=false) Student(id=8, username=汪子韬, password=lq2fks1eg5, age=24, height=161, gender=女, classId=5, isDelete=false) ***ResponsePostAdvice.supports*** ***ResponsePostAdvice.beforeBodyWrite*** ***LogInterceptor.postHandle*** ***ResponsePostInterceptor.postHandle*** ***LogInterceptor.afterCompletion*** [2024-01-26 01:16:16.394_394] [WARN ] [http-nio-8080-exec-2] [LogInterceptor.java:57] → [LogInterceptor.postHandle: Finished processing request at 2024-01-25T17:16:16.393566400Z - /students/8 in 299 ms. Status code: 200] [2024-01-26 01:16:16.413_413] [INFO ] [http-nio-8080-exec-2] [logUtils.java:70] → [{"traceId":"9287f21b215b49e19ed7fd94c9aed4e6","endDate":"2024-01-26T01:16:16.3972818+08:00[Asia/Shanghai]","cost":299,"remoteHost":"0:0:0:0:0:0:0:1","remoteAddr":"0:0:0:0:0:0:0:1","remotePort":12742,"method":"GET","requestURI":"/students/8","status":200,"requestContentLength":-1,"sqlCount":1,"sqlCost":31,"sqlSearchedRowCount":1,"currentThreadTime":109,"currentThreadUserTime":78,"currentThreadAllocatedBytes":20845224}] [2024-01-26 01:16:16.419_419] [WARN ] [http-nio-8080-exec-2] [LogFilter.java:30] → [LogFilter.doFilter: Finished processing request at 2024-01-25T17:16:16.419516700Z - /students/8 in 351 ms. Status code: 200] ***ResponsePostInterceptor.afterCompletion*** ***RequestHeaderCheckFilter.doFilter.end*** ***LogFilter.doFilter.end***