Commit 52363bf0 authored by 张辰's avatar 张辰

fix redis cache bug

parent 4769e67a
package com.tanpu.community.cache;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheEvict {
String prefix() default "";
}
package com.tanpu.community.cache;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheGet {
String prefix() default "";
int expireSeconds() default 60;
}
...@@ -56,7 +56,7 @@ public class RedisCache { ...@@ -56,7 +56,7 @@ public class RedisCache {
private void put(String key, Object obj, Integer expireSeconds) { private void put(String key, Object obj, Integer expireSeconds) {
key = cacheName + ":" + key; key = cacheName + ":" + key;
String value = JSON.toJSONString(obj); String value = JsonUtil.toJson(obj);
if (expireSeconds == 0) { if (expireSeconds == 0) {
redisHelper.set(key, value); redisHelper.set(key, value);
} else { } else {
......
package com.tanpu.community.cache;
import com.alibaba.fastjson.JSON;
import com.tanpu.common.redis.RedisHelper;
import com.tanpu.common.redis.RedisKeyHelper;
import com.tanpu.community.util.SpringUtils;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.time.Duration;
@Aspect
@Component
public class RedisCacheEvictAspect {
private static RedisKeyHelper keyHelper = new RedisKeyHelper("community2_cache:");
@Around(value = "@annotation(com.tanpu.community.cache.CacheEvict)")
public Object methodAround(ProceedingJoinPoint jp) throws Throwable {
MethodSignature ms = (MethodSignature) jp.getSignature();
CacheEvict anno = ms.getMethod().getAnnotation(CacheEvict.class);
String prefix = anno.prefix();
RedisHelper redisHelper = SpringUtils.getBean(RedisHelper.class);
String key = keyHelper.buildKeyCustom(":", prefix, StringUtils.joinWith(":", jp.getArgs()));
redisHelper.delete(key);
try {
Object ret = jp.proceed();
return ret;
} catch (Throwable t) {
// todo wrap this throwable
throw new RuntimeException(t);
}
}
}
package com.tanpu.community.cache;
import com.alibaba.fastjson.JSON;
import com.tanpu.common.redis.RedisHelper;
import com.tanpu.common.redis.RedisKeyHelper;
import com.tanpu.community.util.SpringUtils;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.time.Duration;
@Aspect
@Component
public class RedisCacheGetAspect {
private static RedisKeyHelper keyHelper = new RedisKeyHelper("community2_cache:");
@Around(value = "@annotation(com.tanpu.community.cache.CacheGet)")
public Object methodAround(ProceedingJoinPoint jp) throws Throwable {
MethodSignature ms = (MethodSignature) jp.getSignature();
CacheGet anno = ms.getMethod().getAnnotation(CacheGet.class);
String prefix = anno.prefix();
int expireSeconds = anno.expireSeconds();
if (expireSeconds < 0) {
throw new RuntimeException("expire second cannot be negative.");
}
RedisHelper redisHelper = SpringUtils.getBean(RedisHelper.class);
String key = keyHelper.buildKeyCustom(":", prefix, StringUtils.joinWith(":", jp.getArgs()));
String value = redisHelper.get(key);
// todo 考虑缓存穿透的问题.
if (StringUtils.isNotBlank(value)) {
return JSON.parseObject(value, ms.getReturnType());
}
try {
Object ret = jp.proceed();
String putValue = ret == null ? "null" : JSON.toJSONString(ret);
if (expireSeconds == 0) {
redisHelper.set(key, putValue);
} else {
redisHelper.set(key, putValue, Duration.ofSeconds(expireSeconds));
}
return ret;
} catch (Throwable t) {
// todo wrap this throwable
throw new RuntimeException(t);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment