场景:数据库更新,redis 没有更新,查到的数据不一致,而且redis的值来自于几张表表的逻辑组合,因此任何一张表的增删改都影响redis 数据库一致性的问题。
但是因为并发量小,redis 的值逻辑较多,因此,只需要在更新数据库之后,删除redis缓存的值,为了可以适用其他场景,做了一个切面封装,通过注解方式统一处理redis值的问题
采取springboot 自定义注解方式
1.创建自定义注解类:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UpdateRedis {
String redisKey() default "";
}
2. 切面方法配置
创建方法类RedisAspect
@Aspect
@Component
public class RedisAspect {
Logger log = LoggerFactory.getLogger(RedisAspect.class);
@Pointcut("@annotation(cn.com.citydo.supervise.dal.annotation.UpdateRedis)")
public void redisUpdateCut() {
}
@After("redisUpdateCut()")
public void dataFilter(JoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
UpdateRedis updateRedis = signature.getMethod().getAnnotation(UpdateRedis.class);
String redisKey = updateRedis.redisKey();
updateRedis(redisKey);
log.info("清空redis:"+redisKey);
}
public void updateRedis(String redisKey){
RedisUtils.del(redisKey);
}
}
3. 切面作用于service 类
@UpdateRedis(redisKey="redis_source_table_class")
public ResponseObject save(SourceTableClassSaveRequest sourceTableClassSaveRequest) {
String sourceCalssParentId = sourceTableClassSaveRequest.getSourceCalssParentId();
String parentSourceName = sourceTableClassSaveRequest.getParentSourceName();
if(StringUtils.isEmpty(sourceCalssParentId)&&StringUtils.isEmpty(parentSourceName)){
return ResponseObject.fail("请选择一级分类");
}