SSM框架_6(spring與redis整合)(spring+ redis + aop )

對於某些需求,例如只須要作查詢的項目,或者部分數據只作查詢,不作增刪改的項目(例如省市區表等),能夠利用aop與redis,查詢數據時先從redis中查詢,若是查詢不到,則到數據庫中查詢,而後將數據庫中查詢的數據放到redis中一份,下次查詢時就能直接從redis中查到,不須要查詢數據庫了。html

一、spring與redis整合

參考連接: SSM框架_5(spring與redis整合) - 開源小菜鳥2333java

二、redis切面

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 {
}

三、redisAspect.java

切面:查詢前先查詢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;
    }
}

四、spring-mvc.xml:配置xml

此處class爲該RedisAspect.java的路徑spring

<!-- redis緩存註解 -->
<bean id="RedisAspect" class="com.ssm.annotation.RedisAspect"/>

五、controller層

在須要作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{}"

六、相關參考連接

七、相關redis命令(Linux環境下)

根據IP和端口號進入交互頁面:緩存

./redis-cli -h 127.0.0.1 -p 7001

進入後:

> keys *     //獲取 redis 中全部的 key 
> keys w3c*  //查找以 w3c 爲開頭的 key
> flushdb    //清除全部redis緩存
相關文章
相關標籤/搜索