zoukankan      html  css  js  c++  java
  • redis整合spring(三)实现一个注解缓存

    接口

    @Component
    @Aspect
    public class CacheAspect {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Pointcut("@annotation(com.jm.cache.redis.annotation.NeteaseCache)")
        public void cachePointcut() {
        }
    
        // 定义相应的事件
        @Around("cachePointcut()")
        public Object doCache(ProceedingJoinPoint joinPoint) {
            Object value = null;
            try {
                // 0-1、 当前方法上注解的内容
                MethodSignature signature = (MethodSignature) joinPoint.getSignature();
                Method method = joinPoint.getTarget().getClass().getMethod(signature.getName(), signature.getMethod().getParameterTypes());
                NeteaseCache cacheAnnotation = method.getAnnotation(NeteaseCache.class);
                String keyEl = cacheAnnotation.key();
                String prefix = cacheAnnotation.value();
                // 0-2、 前提条件:拿到作为key的依据  - 解析springEL表达式
                // 创建解析器
                SpelExpressionParser parser = new SpelExpressionParser();
                Expression expression = parser.parseExpression(keyEl);
                EvaluationContext context = new StandardEvaluationContext(); // 参数
                // 添加参数
                Object[] args = joinPoint.getArgs();
                DefaultParameterNameDiscoverer discover = new DefaultParameterNameDiscoverer();
                String[] parameterNames = discover.getParameterNames(method);
                for (int i = 0; i < parameterNames.length; i++) {
                    context.setVariable(parameterNames[i], args[i].toString());
                }
                // 解析
                String key = prefix + "::" + expression.getValue(context).toString();
    
                // 1、 判定缓存中是否存在
                value = redisTemplate.opsForValue().get(key);
                if (value != null) {
                    System.out.println("从缓存中读取到值:" + value);
                    return value;
                }
    
                // 2、不存在则执行方法
                value = joinPoint.proceed();
    
                // 3、 同步存储value到缓存。
                redisTemplate.opsForValue().set(key, value);
    
            } catch (Throwable throwable) {
                throwable.printStackTrace();
            }
            return value;
        }
    
    
    }
    

    sevice

    @Service
    public class UserService {
    
        @Autowired
        JdbcTemplate jdbcTemplate; // spring提供jdbc一个工具(mybastis类似)
    
        @Autowired
        RedisTemplate redisTemplate;
    
        /**
         * 根据ID查询用户信息 (redis缓存,用户信息以json字符串格式存在(序列化))
         */
        @NeteaseCache(value="user",key="#userId") // 返回值 存到redis
        public User findUserById(String userId) {
            System.out.println("查询数据库.");
            String sql = "select * from tb_user_base where uid=?";
            User user = jdbcTemplate.queryForObject(sql, new String[]{userId}, new BeanPropertyRowMapper<>(User.class));
            return user;
        }
    
        @CacheEvict(value="user",key="#user.uid")  // 方法执行结束,清除缓存
        public void updateUser(User user){
            String sql = "update tb_user_base set uname=? where uid=?";
            jdbcTemplate.update(sql, new String[]{user.getUname(), user.getUid()});
        }
    
    }
    

      

      

      

     

  • 相关阅读:
    进阶篇:3.1.1.3)DFM注塑-机械紧固
    进阶篇:3.1.1.2)DFM注塑-卡扣
    进阶篇:5.3)装配偏移
    基础篇:6.9)形位公差-检测方法Measurement
    高阶篇:4.1)QFD质量功能展开-总章
    基础篇:6.3)形位公差-要素 Feature
    基础篇:6.8)形位公差-公差带 Tolerance Zone
    感想篇:9)关于结构工程师的一种打开方式
    知识点篇:5)产品结构设计工程师的定义、职责及技能要求
    [洛谷P3386][题解][模板]二分图匹配
  • 原文地址:https://www.cnblogs.com/Jomini/p/13695193.html
Copyright © 2011-2022 走看看