假如我们是一个商家,我们在管理端 设置好菜品之后,每次不同的用户访问我们的菜品,都要查询数据库,当访问者多的时候,会造成数据库的卡顿,所以使用redis进行缓存,这样只需要读取一次数据库,就可以的大大减少数据库的访问压力,但是当我们 管理端对某个菜品进行删除的时候,用户再次访问,还会访问到我们redis 数据库的数据,这时候就会出现bug,所以我们在删除菜品的时候,也应该把对应的redis的菜品缓存数据删除
但是我们执行删除修改增加菜品的时候,统一设置删除缓存数据,但是我们一个个的调用封装的删除缓存的方法太麻烦了,我们不妨直接使用aop+注解的形式统一进行缓存删除的管理
1. 自定义注解.
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Deleterediscache {
}
2.使用aop对删除增加修改菜品的方法进行 统一删除缓存
@Aspect
@Slf4j
@Component
public class DeleteRedisCache {@AutowiredRedisTemplate redisTemplate;@Pointcut("execution(* com.sky.mapper.*.*(..))&& @annotation(com.sky.annotation.Deleterediscache)")
public void pointcut(){}@After("pointcut()")public void deleteRedisCache(JoinPoint joinPoint){log.info("开始清理redis缓存");//获取方法签名MethodSignature signature = ( MethodSignature)joinPoint.getSignature();//获取方法签名的注解名称Deleterediscache deleterediscache = signature.getMethod().getAnnotation(Deleterediscache.class);if(deleterediscache !=null){Set keys = redisTemplate.keys("dish_*");redisTemplate.delete(keys);}log.info("redis缓存清理完毕");}}