diff --git a/common/service-util/pom.xml b/common/service-util/pom.xml
index cf9e591..3a67934 100644
--- a/common/service-util/pom.xml
+++ b/common/service-util/pom.xml
@@ -51,11 +51,11 @@
spring-boot-starter-data-redis
-
-
-
-
-
+
+
+ org.redisson
+ redisson-spring-boot-starter
+
org.springframework.boot
@@ -87,6 +87,32 @@
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
+
+ io.micrometer
+ micrometer-tracing-bridge-brave
+
+
+ io.zipkin.reporter2
+ zipkin-reporter-brave
+
+
+ io.micrometer
+ micrometer-observation
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ org.springframework.cloud
+ spring-cloud-starter-zipkin
+ 2.2.8.RELEASE
+
+
+ io.github.openfeign
+ feign-micrometer
+ 12.5
+
diff --git a/common/service-util/src/main/java/com/atguigu/tingshu/common/cache/GuiGuCache.java b/common/service-util/src/main/java/com/atguigu/tingshu/common/cache/GuiGuCache.java
new file mode 100644
index 0000000..ae5bfce
--- /dev/null
+++ b/common/service-util/src/main/java/com/atguigu/tingshu/common/cache/GuiGuCache.java
@@ -0,0 +1,30 @@
+package com.atguigu.tingshu.common.cache;
+
+import com.atguigu.tingshu.common.constant.RedisConstant;
+
+import java.lang.annotation.*;
+import java.util.concurrent.TimeUnit;
+
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Inherited
+@Documented
+public @interface GuiGuCache {
+ /**
+ * 缓存(业务数据或锁)前缀
+ * @return
+ */
+ String prefix() default "";
+
+ /**
+ * 缓存时间
+ * @return
+ */
+ long ttl() default RedisConstant.ALBUM_TIMEOUT;
+
+ /**
+ * 时间单位
+ * @return
+ */
+ TimeUnit timeUnit() default TimeUnit.SECONDS;
+}
diff --git a/common/service-util/src/main/java/com/atguigu/tingshu/common/cache/GuiGuCacheAspect.java b/common/service-util/src/main/java/com/atguigu/tingshu/common/cache/GuiGuCacheAspect.java
new file mode 100644
index 0000000..c0c3a96
--- /dev/null
+++ b/common/service-util/src/main/java/com/atguigu/tingshu/common/cache/GuiGuCacheAspect.java
@@ -0,0 +1,81 @@
+package com.atguigu.tingshu.common.cache;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.atguigu.tingshu.common.constant.RedisConstant;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Component;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import static com.atguigu.tingshu.common.constant.RedisConstant.ALBUM_LOCK_EXPIRE_PX2;
+import static com.atguigu.tingshu.common.constant.RedisConstant.ALBUM_LOCK_WAIT_PX1;
+
+@Aspect
+@Slf4j
+@Component
+public class GuiGuCacheAspect {
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ @Autowired
+ private RedissonClient redissonClient;
+
+ @Around("@annotation(guiGuCache)")
+ public Object doBasicProfiling(ProceedingJoinPoint pjp, GuiGuCache guiGuCache) throws Throwable {
+ try {
+ //1.优先从Redis缓存中获取业务数据,命中缓存响应即可
+ //1.1 构建缓存业务数据Key 形式=前缀+目标方法参数(采用_拼接)
+ List