一、注解使用模式

  • @EnableCaching:在主入口类上添加该注解,用于开启缓存;

  • @CacheConfig:标注在类上,表示当前类使用的缓存组件中的key为该注解指定的cacheNames/value,当该注解指定了cacheNames/value之后,@Cacheable上就无需再使用cacheNames/value了;

  • @Cacheable:将方法的结果进行缓存;

    • cacheNames/value:缓存组件的名字;

    • key:缓存数据使用的key,默认是使用方法参数的值,可以使用SpEL表达式,比如#id == #a0 == #p0 == #root.args[0]都表示使用第一个参数的值作为缓存的key;

    • keyGenerator:key的生成器,可以自己指定key的生成器的组件id;

    • cacheManager:指定缓存管理器;

    • cacheResolver:指定获取解析器;

    • condition:指定符合条件的情况下才缓存,支持SpEL表达式;

      • condition=“#id>1”:表示id的值大于1时才缓存。
    • unless:否定缓存,当unless指定的条件为true,方法的返回值就不会被缓存,该属性可以获取到结果进行判断,unless与condition刚好相反;

      • unless=“#a0==2”:表示第一个参数的值为2时,查询结果不缓存。
    • sync:是否使用异步模式,使用sync后unless就不支持了;

      其中keyGeneratorkey二者只能选一,cacheResolvercacheManager也二者选一。

  • @CachePut:用于更新缓存,它先调用方法,然后将目标方法的结果进行缓存。

    ​ 能够更新缓存的前提是,@CachePut更新使用的key与@Cacheable使用的key要保持一致。

    @CachePut注解属性同@Cacheable的属性类似,少了sync属性。

  • @CacheEvict:缓存清除

    ​ 同样如果要清除缓存,则使用的key值要与@Cacheable使用的key一致,否则达不到清除缓存的功能。

    @CacheEvict注解属性比@Cacheable注解少了sync和unless,但是多了两个属性:allEntriesbeforeInvocation

    ​ allEntries:表示是否删除所有缓存。

    ​ beforeInvocation:表示删除缓存的操作是否在目标方法执行之前。

@Cacheable、@CachePut、@CacheEvict

  1. @Cacheable就是用来替换我们原来的判空,查询缓存并返回的操作;
  2. @CachePut则是每次都会执行方法,其实只是有一个存入缓存的操作(只是“put”);
  3. @CacheEvict 是用来清空缓存的。

 

 

注解使用

@RedisString(key = "user:${userId}")
public class User {
    private int userId;
    private String userName;
    private String password;
    // getters and setters
}

Redis String类型注解使用@RedisString注解实现,它可以将Java对象直接映射到Redis中的String类型。在Java代码中使用时,只需要通过注解标注一下对应的Key,就能将数据存储到Redis中。

@RedisList(key = "user:list")
public class UserList {
    private List userList;
    // getters and setters
}

这里通过@RedisList注解将UserList对象映射到Redis中的"user:list",将User对象存储到Redis的List中。当程序需要获取所有用户信息时,只需要从Redis中获取"user:list"对应的List对象,就能获取到所有User对象。

@RedisSet(key = "user:set")
public class UserSet {
    private Set userSet;
    // getters and setters
}

这里通过@RedisSet注解将UserSet对象映射到Redis中的"user:set",将User对象存储到Redis的Set中。当程序需要获取所有用户信息时,只需要从Redis中获取"user:set"对应的Set对象,就能获取到所有User对象。

@RedisSortSet(key = "user:sort", scoreName = "score")
public class UserSortSet {
    private int score;
    private User user;
    // getters and setters
}

这里通过@RedisSortSet注解将UserSortSet对象映射到Redis中的"user:sort",并将User对象存储到Redis的SortedSet中。scoreName用于指定分值所对应的属性。

当程序需要获取排名前n的用户信息时,只需要从Redis中获取"user:sort"对应的SortedSet对象,使用zrangeWithScores方法获取排名前n的UserSortSet对象。其实现方法如下:

Set tuples = jedis.zrangeWithScores("user:sort", 0, n - 1);
for (Tuple tuple : tuples) {
    UserSortSet userSortSet = new UserSortSet();
    userSortSet.setUser(jedis.hget("user:${userId}", "userName"));
    userSortSet.setScore(tuple.getScore());
    userSortSets.add(userSortSet);
}

 

@RedisHash(key = "user", field = "userId")
public class UserHash {
    private int userId;
    private String userName;
    private String password;
    // getters and setters
}

这里通过@RedisHash注解将UserHash对象映射到Redis中的"user",将属性userId作为field,将User对象存储到Redis的Hash中。

当程序需要获取某一个用户信息时,只需要从Redis中获取"user"对应的Hash对象,并使用hget方法获取对应field的值即可。

 

最后修改于 2023-09-25 22:18:55
如果觉得我的文章对你有用,请随意赞赏
扫一扫支付
上一篇