對於某些需求,例如只須要作查詢的項目,或者部分數據只作查詢,不作增刪改的項目(例如省市區表等),能夠利用aop與redis,查詢數據時先從redis中查詢,若是查詢不到,則到數據庫中查詢,而後將數據庫中查詢的數據放到redis中一份,下次查詢時就能直接從redis中查到,不須要查詢數據庫了。html
參考連接: SSM框架_5(spring與redis整合) - 開源小菜鳥2333java
Redis.java:定義Redis註解,Target爲類和方法上linux
package com.ssm.annotation; import java.lang.annotation.*; @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Redis { }
切面:查詢前先查詢redis,若是查詢不到穿透到數據庫,從數據庫查詢到數據後,保存到redis,而後下次查詢可直接命中緩存redis
@Aspect @Component public class RedisAspect extends BaseController{ private static final Logger logger = LoggerFactory.getLogger(RedisAspect.class); @Autowired private RedisUtil redisUtil; // Controller層切點 @Pointcut("@annotation(com.ssm.annotation.Redis)") //@annotation用於匹配當前執行方法持有指定註解的方法; public void redisAspect() { } @Around("redisAspect()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { //獲取目標方法參數 Object[] args = joinPoint.getArgs(); String applId = null; if (args != null && args.length > 0) { applId = String.valueOf(args[0]); } // 請求類名稱 String targetName = joinPoint.getTarget().getClass().getName(); // 請求方法 String methodName = joinPoint.getSignature().getName(); //redis中key格式:請求類名稱 + 請求方法 + 目標方法參數 String redisKey = targetName + methodName + applId; logger.debug("調用從redis中查詢的方法,redisKey=" + redisKey); //獲取從redis中查詢到的對象 Object objectFromRedis = redisUtil.getData4Object2Redis(redisKey); //若是查詢到了 if(null != objectFromRedis){ logger.debug("從redis中查詢到了數據...不須要查詢數據庫"); return objectFromRedis; } logger.debug("沒有從redis中查到數據..."); //沒有查到,那麼查詢數據庫 Object object = null; object = joinPoint.proceed(); //後置:將數據庫中查詢的數據放到redis中 logger.debug("把數據庫查詢的數據存儲到redis中的方法..."); redisUtil.setData4Object2Redis(redisKey, object); //將查詢到的數據返回 return object; } }
此處class爲該RedisAspect.java的路徑spring
<!-- redis緩存註解 --> <bean id="RedisAspect" class="com.ssm.annotation.RedisAspect"/>
在須要作redis緩存處理的方法上添加@Redis註解,以下:數據庫
@Redis @RequestMapping(value = "/testAjax", method = RequestMethod.POST) @ResponseBody public Object test(Model model) { JSONObject jsonObject = new JSONObject(); jsonObject.put("id","數據拿到了"); return jsonObject.toJSONString(); }
項目啓動:第一次運行到該方法,後臺日誌,以下:json
2017-05-24 13:58:10 [com.ssm.annotation.RedisAspect.around(RedisAspect.java:46)] - [ DEBUG ] 調用從redis中查詢的方法,redisKey=com.ssm.controller.UserControllertest{} 2017-05-24 13:58:10 [com.ssm.annotation.RedisAspect.around(RedisAspect.java:56)] - [ DEBUG ] 沒有從redis中查到數據... 2017-05-24 13:58:10 [com.ssm.annotation.RedisAspect.around(RedisAspect.java:63)] - [ DEBUG ] 把數據庫查詢的數據存儲到redis中的方法...
瀏覽器刷新頁面,控制檯輸出,以下:瀏覽器
2017-05-24 13:58:19 [com.ssm.annotation.RedisAspect.around(RedisAspect.java:46)] - [ DEBUG ] 調用從redis中查詢的方法,redisKey=com.ssm.controller.UserControllertest{} 2017-05-24 13:58:19 [com.ssm.annotation.RedisAspect.around(RedisAspect.java:52)] - [ DEBUG ] 從redis中查詢到了數據...不須要查詢數據庫
進入redis交互頁面:spring-mvc
127.0.0.1:7001> KEYS * "com.ssm.controller.LoginControllerloginPostadmin" "com.ssm.controller.UserControllertest{}" "com.ssm.controller.LoginControllerlogin{}" "com.ssm.controller.UserControlleruserManager{}" "com.ssm.controller.IndexControllerindex{}"
根據IP和端口號進入交互頁面:緩存
./redis-cli -h 127.0.0.1 -p 7001
進入後:
> keys * //獲取 redis 中全部的 key > keys w3c* //查找以 w3c 爲開頭的 key > flushdb //清除全部redis緩存