redis作为用的非常多的缓存数据库,在多线程场景下,可能会出现数据库与redis数据不一致的现象
数据不一致的现象:https://blog.csdn.net/m0_73700925/article/details/133447466
这里采用aop+redis来解决这个方法:
- 删除缓存
- 更新数据库
- 延时一定时间,比如500ms
- 删除缓存
这里之所以要延时一段时间再删除,是为了避免多线程情况下,更新数据库的操作还没执行,就执行了第二次删除缓存的操作,此时如果有请求进来,就会读取数据库并将数据写入缓存,这时再更新数据库就会导致数据不一致的问题
两次删除缓存是因为第一次删除缓存后,这时如果有请求进来,得到了数据并写入redis,然后再更新数据库,就会导致数据不一致
- 自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.METHOD)
public @interface ClearAndReloadCache {
String name() default "";
}
- 编写切面,以自定义注解作为切入点
@Aspect
@Component
public class ClearAndReloadCacheAspect {
@Autowired
StringRedisTemplate stringRedisTemplate;
@Around("@annotation(clearAndReloadCache)")
public Object innerAround(ProceedingJoinPoint proceedingJoinPoint, ClearAndReloadCache clearAndReloadCache) throws Throwable {
System.out.println("----------- 环绕通知 -----------");
System.out.println("环绕通知的目标方法名:" + proceedingJoinPoint.getSignature().getName());
Signature signature1 = proceedingJoinPoint.getSignature();
MethodSignature methodSignature =