cache注解

参考:cache注解
主要有4个注解:@Cacheable @CachePut @CacheEvict @Caching

@Cacheable

 @Cacheable(cacheNames = "userList",keyGenerator = "keyGenerator")
    @Override
    public List selectAll() {
        return userMapper.selectAll();
    }

redis中会生成一个name是userList,key为selectAll的记录


其中key是根据redisconfig中的keyGenerator生成的,此处我是用方法名和参数来生成key

   @Bean
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                StringBuilder sb = new StringBuilder();
                    sb.append(method.getName());
                    int index=0;
                    for (Object obj : objects) {
                    sb.append(index+":"+obj.toString());
                    index++;
                }
                return sb.toString();
            }
        };
    }

@CacheEvict

@CacheEvict(cacheNames = "userList",allEntries = true)
    @Override
    public int insertUser(User user) {
        user.setPassword(ShiroUtils.encryptPassword("SHA-256", user.getPassword(), user.getUsername()));
        if (userMapper.selectbyUsername(user.getUsername()) != null) {
            throw new RuntimeException("0003");
        }
        return userMapper.insertSelective(user);
    }

当插入新的数据时,应该删除userList的缓存,allEntries = true表示 删除所有名为userList的记录,不需要指定key,如果不想全部删除,就指定key删除特定的缓存

@Caching

有时候我们需要指定多个cache注解,就可以使用@caching注解

    @Caching(evict = {
            @CacheEvict(cacheNames = "userList",allEntries = true),
            @CacheEvict(cacheNames = "users",key = "#id")
    })
    @Override
    public int updateUser(int id, User user) {
        User user1 = userMapper.selectByPrimaryKey(id);
        if ( user1== null) {
            throw new RuntimeException("0006");
        } else {
            //判断用户为普通用户还是系统管理员
            //若为普通用户,则无法修改权限role
            if(!SecurityUtils.getSubject().hasRole("superadmin"))
            {
                user.setRole(user1.getRole());
            }
            user.setId(id);
            return userMapper.updateByPrimaryKeySelective(user);
        }
    }

比如更新了数据之后,就需要删除userList缓存,还有users下的这个id的缓存,所以这里@cacheEvict中需要指定特定的key,而不是allEntries=true

@CachePut

@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。比如更新了单个数据,此时就可以使用@CachePut

    @CachePut((cacheNames = "users",key = "#id")
    @Override
    public int updateUser(int id, User user) {
      //todo
    }

最近用到了redis缓存,就粗粗自己记录一下,嘿嘿嘿

你可能感兴趣的:(cache注解)