Spring+redis 4、使用注解注意事项

使用@Cacheable时,该方法支持缓存,有两种key的生成方法

  1. @Cacheable(value = “getUser”,keyGenerator = “cacheKeyGenerator”),
    这个是使用RedisConfiguration中声明的方法cacheKeyGenerator
    会根据自己实现的策略生成一个key,本项目中使用的是,根据方法名和参数实现(com.example.demo.service.UserServicegetUserlinjiayong12)
  2. @Cacheable(value = “getUser”,key= “#userName”) 通过参数key来实现(linjiayong12),传入参数设置key,利用#,如传入的参数是User user对象,可以通过key= “#getUserName”,混合设置,传入多个参数可以组合使用@Cacheable(value = “getUser”,key= “#userName+#userName”)
    参考:http://blog.csdn.net/whatlookingfor/article/details/51833378
    http://blog.csdn.net/wjacketcn/article/details/50945887
  @Cacheable(value = "getUser",key= "#userName")
    public User getUser(String userName){
        System.out.println("正在查询数据库");
        User user = new User();
        user.setUserCode("2222");
        user.setUserName(userName);
        return user;
    }

对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。

在使用缓存操作时,需要考虑到数据库和缓存一致性问题。CRUD (Create 创建,Retrieve 读取,Update 更新,Delete 删除) 操作中,除了 查询R操作,其他三个发生的时候都可能会造成缓存结果和数据库不一致。为了保证缓存数据的一致性,在进行 CUD 操作的时候需要对可能影响到的缓存进行更新或者清除。

在执行更新或者插入操作时,可以通过该CachePut注解,将调用结果放入缓存中。保持数据库和缓存一致性。
@CachePut注解时需要注意使用的是,keyGenerator和key,在使用keyGenerator时,
生成的key需要与 @Cacheable生成的key是一致的,否则再做CU操作时,不会更新@Cacheable的缓存。

    @CachePut(value = "getUser",key = "#userName")
// @CachePut(value = "getUser",keyGenerator = "cacheKeyGenerator")
    public User updateUser(String userName){
        System.out.println("正在设置数据库");
        System.out.println(userName);
        User user = new User();
        user.setUserCode("323");
        user.setUserName(userName);
        return user;
    }

@CachePut声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以存入缓存中。

在进行删除操作时,需要删除缓存中的数据。

  1. 可以通过指定条件删除缓存中的的数据
  2. 可以删除指定缓存中的所有数据
    @CacheEvict(value="getUser",key = "#user.userName")// 根据key清空getUser 缓存
    //@CacheEvict(value="getUser",allEntries=true)// getUser 缓存
    public void delUser( User user){
        System.out.println("正在删除表中数据");
        System.out.println(user.getUserName());
    }

@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空

在上述的几个注解中,都可以传入参数 condition

  1. condition为 缓存的条件
  2. 可以为空
  3. 使用 SpEL 编写
  4. 返回 true 或者 false
  5. 只有为 true 才进行缓存

    例子

@Cacheable(value=”getUser”,condition=”#userName.length() <=4”) 只有长度小于才进行缓存

你可能感兴趣的:(redis,spring,缓存)