一、pom文件加入依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
二、在application.yml添加redis信息
spring: cache: type: redis redis: host: 172.0.0.1 database: 0 password: port: 6379 jedis: pool: max-active: 100 max-idle: 8 min-idle: 0 max-wait: -1ms
三、在启动类添加@EnableCaching,开启注解驱动的缓存的管理
@EnableCaching //开启注解驱动的缓存管理 @SpringBootApplication @EnableEurekaClient @EnableFeignClients public class BaseInfoApplication { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
四、redis的注解使用
1、@Cacheable注解的作用:缓存被调用方法的结果(返回值),已经缓存就不再调用注解修饰的方法,适用于查询接口
@RequestMapping("/redisOnly") @RestController() public class RedisOnlyController { @Resource RedisOnlyService redisOnlyService; @RequestMapping(value = "/user/{id}", method = RequestMethod.GET) public User getById(@PathVariable("id") String id) { return redisOnlyService.selectById(id); } } @Service public class RedisOnlyServiceImpl implements UserService { /** * 先用id生成key,在用这个key查询redis中有无缓存到对应的值 * * 若无缓存,则执行方法selectById,并把方法返回的值缓存到redis * * 若有缓存,则直接把redis缓存的值返回给用户,不执行方法 */ @Cacheable(cacheNames="user", key="#id") @Override public User selectById(String id) { //直接new一个给定id的用户对象,来返回给用户 return new User(id,"redisOnly","password"); } }
使用FastoRedis查看缓存的数据,访问对应的接口,查看第二次是否打印sql语句,或者debug打断点进行查看。
其中,@Cacheable(cacheNames="user", key="#id")的cacheNames="user",把用户数据存放于user的空间中,其本质是redis中key加上前缀user;key="#id",使用方法参数z中的id参数生成缓存键值对中的key
2、@CacheEvict的作用是删除redis的缓存,适用于删除接口
若要删除user下的全部缓存,@CacheEvict(cacheNames="user",allEntries=true)。
3、@CachePut主要作用是缓存被调用的结果,主要用于更新操作和插入操作。
@CachePut的值在已经被缓存的情况下,@CachePut仍然会执行其注解的方法,而@Cacheable则不会。
4、redis与mybatis的使用
redis与mybatis的使用方法为对应的注解方法,添加到对应的dao操作上就实现了redis缓存的操作。
五、redis的其它注解属性
注解属性 | 说明 |
---|---|
keyGenerator | 定义键值对中key生成的类,其中和key属性不可以同时存在。 |
sync | 若ysnc=true,如果redis中没有数据,多个线程同时访问该方法,其中只有一个线程会得到执行,其它线程进行等待;如redis中有缓存数据,多个线程可以同时进行访问该方法。sync不可以解决缓存穿透的问题,由redis不支持超时时间的,所以不存在缓存击穿和雪崩的问题。 |
condition | 在执行方法后,若condition的结果为true,在缓存数据,若为false,则只执行该方法,不缓存数据。 |
unless | 在执行该方法后,判断unless,若果为true,则不缓存数据 |
@CacheConfig类级别的注解,如果我们在此注解中定义cacheNames,则此类中的所有方法上的cacheNames默认都是此值,@Cacheable也可以重新定义cacheNames的值。