SpringBoot 註解呼叫Redis快取
註解程式碼:
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Created by qhong on 2018/9/5 11:12
**/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface CreditRedisCache {
String prefix() default "huishi-server:credit";
}
利用攔截器處理註解中的方法,有就呼叫快取,沒有就新增
import com.alibaba.fastjson.JSON;
import com.shitou.huishi.annotation.CreditRedisCache;
import com.shitou.huishi.utils.RedisUtil;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.stream.Collectors;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* Created by qhong on 2018/9/5 11:13
**/
@Aspect
@Component
@Slf4j
public class RedisCacheAspect {
@Autowired
RedisUtil redisUtil;
/**
* 分隔符 生成key 格式為 類全類名|方法名|引數所屬類全類名
**/
private static final String DELIMITER = "-";
private static final Long expireTime=60*60*24*30L;
/**
* Service層切點 使用到了我們定義的 RedisCache 作為切點表示式。
* 而且我們可以看出此表示式基於 annotation。
* 並且用於內建屬性為查詢的方法之上
*/
@Pointcut("@annotation(com.shitou.huishi.annotation.CreditRedisCache)")
public void redisCacheAspect() {
}
/**
* Around 手動控制呼叫核心業務邏輯,以及呼叫前和呼叫後的處理,
* <p>
* 注意:當核心業務拋異常後,立即退出,轉向AfterAdvice 執行完AfterAdvice,再轉到ThrowingAdvice
*
* @param pjp the pjp
* @return object
* @throws Throwable the throwable
*/
@Around(value = "redisCacheAspect()")
public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
// 得到類名、方法名和引數
String clazzName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
// 根據類名、方法名和引數生成Key
log.info("key引數: " + clazzName + "." + methodName);
String key = getKey(clazzName, methodName, args);
if (log.isInfoEnabled()) {
log.info("生成key: " + key);
}
// 得到被代理的方法
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
//redis 字首
String prefix = method.getAnnotation(CreditRedisCache.class).prefix();
// 檢查Redis中是否有快取
Object value = redisUtil.get(prefix, key);
// 得到被代理方法的返回值型別
Class returnType = ((MethodSignature) joinPoint.getSignature()).getReturnType();
// result是方法的最終返回結果
Object result = null;
try {
if (null == value) {
log.info("快取未命中");
// 呼叫資料庫查詢方法
result = joinPoint.proceed(args);
// 結果放入快取
redisUtil.set(prefix, key, result,expireTime);
} else {
// 快取命中
log.info("快取命中, value = " + JSON.toJSONString(value));
result = value;
}
} catch (Throwable e) {
log.error("程式異常",e.getMessage());
throw e;
}
return result;
}
/**
* * 根據類名、方法名和引數生成Key
* * @param clazzName
* * @param methodName
* * @param args
* * @return key格式:全類名|方法名|引數型別
*
*/
private String getKey(String clazzName, String methodName, Object[] args) {
StringBuilder key = new StringBuilder(clazzName);
key.append(DELIMITER);
key.append(methodName);
key.append(DELIMITER);
key.append(Arrays.stream(args).map(x->x.toString()).collect(Collectors.joining(DELIMITER)));
return key.toString();
}
}
使用:
@CreditRedisCache
public DataResponse queryICInfo(String name,String card)
直接在方法上使用即可,如果要自定義字首,可以新增prefix,不然使用預設值。
這種很類似Spring-Cache,但是自己的程式碼比較靈活 ,可以針對不同的模組設定字首,快取時間等。
參考:
相關文章
- springboot註解方式使用redis快取Spring BootRedis快取
- SpringBoot註解使用redis做快取總結Spring BootRedis快取
- spring配置redis註解快取SpringRedis快取
- springboot整合redis2.x,使用spring註解進行快取Spring BootRedis快取
- SpringBoot整合Redis快取Spring BootRedis快取
- SpringBoot2 基礎案例(13):基於Cache註解,管理Redis快取Spring BootRedis快取
- SpringBoot之日誌註解和快取優化Spring Boot快取優化
- springboot +lettuce +redis 快取使用Spring BootRedis快取
- SpringBoot快取管理(二) 整合Redis快取實現Spring Boot快取Redis
- SpringBoot中整合Redis(快取篇)Spring BootRedis快取
- 介紹SpringBoot 整合 Redis 快取Spring BootRedis快取
- Spring-Boot專案中配置redis註解快取SpringbootRedis快取
- SpringBoot中使用Redis實現快取Spring BootRedis快取
- SpringBoot中Shiro快取使用Redis、EhcacheSpring Boot快取Redis
- 【SpringBoot】結合Redis實現快取Spring BootRedis快取
- 優雅的快取解決方案--SpringCache和Redis整合(SpringBoot)快取GCRedisSpring Boot
- Spring Cache快取註解Spring快取
- Spring 框架快取註解Spring框架快取
- Springboot 整合 SpringCache 使用 Redis 作為快取Spring BootGCRedis快取
- 15.SpringBoot整合Redis快取實現Spring BootRedis快取
- Redis詳解(十二)------ 快取穿透、快取擊穿、快取雪崩Redis快取穿透
- SpringBoot快取管理(三) 自定義Redis快取序列化機制Spring Boot快取Redis
- 【Redis】快取穿透,快取擊穿,快取雪崩及解決方案Redis快取穿透
- REDIS快取穿透,快取擊穿,快取雪崩原因+解決方案Redis快取穿透
- Redis 快取穿透、快取雪崩原理及解決方案Redis快取穿透
- Redis 快取擊穿(失效)、快取穿透、快取雪崩怎麼解決?Redis快取穿透
- 搞懂分散式技術14:Spring Boot使用註解整合Redis快取分散式Spring BootRedis快取
- Spring AOP整合redis(註解方式) 實現快取統一管理SpringRedis快取
- 實現SpringBoot + Redis快取的原始碼與教程Spring BootRedis快取原始碼
- springboot整合redis及其註解式開發Spring BootRedis
- Spring 快取註解@Cacheable的用法Spring快取
- 高手如何處理快取:SpringBoot整合Redis實現快取處理(AOP技術)!快取Spring BootRedis
- Redis快取擊穿、快取穿透、快取雪崩Redis快取穿透
- [Redis]快取穿透/快取擊穿/快取雪崩Redis快取穿透
- SpringBoot使用快取Spring Boot快取
- SpringBoot+Redis實現介面級別快取資訊Spring BootRedis快取
- Redis詳解 - SpringBoot整合Redis,RedisTemplate和註解兩種方式的使用RedisSpring Boot
- 關於快取穿透、快取擊穿、快取雪崩的模擬與解決(Redis)快取穿透Redis