springboot2.2使用redis做缓存

springboot2.2使用redis做缓存

一、缓存的简单讲解(使用下面的注解就可以使用springboot自带的缓存)

1. 首先认识几个用到的名称及注解
@EnableCaching 开启基于注解的缓存,写在启动类上
@Cacheable 标注在方法上,如果该方法结果存在缓存则使用缓存,否则执行方法并将结果缓存
@CacheEvict 清除缓存
@CachePut 不管有没有缓存都要执行方法,且把结果缓存,如果存在缓存就更新
Cache 缓存接口,定义缓存操作
CacheManaget 缓存管理器,管理各种缓存组件
keyGenerator 缓存数据时key的生成策略
serialize 缓存数据时,value的序列化策略
2. @Cacheable简单属性讲解(实际操作要保证和CachePut的key一致)
value: 指定将方法的返回结果放在哪个缓存中,可以指定多个,用大括号保存

key: 指定key,默认使用的是方法参数的值,也可以使用SpEL,如#参数名(获取参数值),#root(可以获取方法名等)

keyGenerator: 指定配置好的keyGenerator自动生成key

condition: 指定符合条件的的才进行缓存(如:#id>0 当参数的id值大于0才缓存)

unless:与condition相反,但是可以获取结果进行判断(如: #result == null)
3. @CacheEvict简单属性讲解
value与key和上面一样
allEntries = true 指定清除这个缓存中的所有数据
beforeInvocation = false 指定缓存是否在方法之前执行,防止方法出错不删除缓存
4. 组合注解@Caching使用方法
@Caching(
	cacheable = {
		@Cacheable(value = "stu",key = "#id")
	},
	put = {
        @CachePut(value = "stu",key = "#result.id")
        @CachePut(value = "stu",key = "#result.name")
    }
5. @CacheConfig简化注解配置
  • 标注在类上,类中方法就不需要再指定该注解说配置好的属性
  • 能够配置的属性点进注解就可以看见
6. 具体使用
@Service
@CacheConfig(cacheNames = "emp")
public class EmployeeService {

    @Autowired
    EmployeeMapper employeeMapper;

    Logger logger = LoggerFactory.getLogger(getClass());

    @Cacheable
    public Employee getEmpById(Integer id) {
        logger.info("正在获取id为" + id + "的员工~~~~");
        return employeeMapper.getEmpById(id);
    }

    @CachePut(key = "#emp.id")
    public Employee updateEmp(Employee emp) {
        employeeMapper.updateEmp(emp);
        int i = 1 / 0;
        return emp;
    }

    @CacheEvict(beforeInvocation = true)
    public void deleteEmpById(Integer id) {
        employeeMapper.deleteEmpById(id);
    }

}
7. springboot不配置缓存的情况下默认使用的是concurrentMapCacheManager

二、使用redis做缓存

1. 首先我们要能够使用redis
  • 添加pom依赖

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-data-redisartifactId>
    dependency>
    
  • 添加yml配置(这里我只是简单的配置主机地址,想要复杂配置的可以去找别得博客扩展)

    spring:
    	redis:
    		host: 127.0.0.1
    
2. 导入依赖后spirngboot底层已经帮我们注入了两个操作redis的bean(不用猜就是template)
  • 在RedisAutoConfiguration类下可以看到

  • redisTemplate

  • stringRedisTemplate

  • 这里演示一下redisTemplate

    @Autowired
    RedisTemplate redisTemplate;
    
    @Test
    void contextLoads() {
        /**
         * 注意:要操作的对象要实现Serializable接口
         * 这个是我自己写的mapper,可以自己new一个对象就行
         * redisTemplate提供了各种操作的方法对应操作不同类型
         * opsForValue
         * opsForHash
         * opsForList
         * opsForSet
         * opsForZSet
         */
        Employee employee = employeeMapper.getEmpById(1);
        redisTemplate.opsForValue().set("user", employee);
    
    }
    
  • 运行后的结果(我们不认识,但是可以获取到)

springboot2.2使用redis做缓存_第1张图片

3. 将结果变得我们可以认识的json对象
  • 编写RedisConfig(就是图中的RedisTemplateConfig)

    springboot2.2使用redis做缓存_第2张图片

//类上要加@Configuration

@Bean
public RedisTemplate<Object, Object> empRedisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
    RedisTemplate<Object, Object> template = new RedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
    template.setDefaultSerializer(serializer);
    return template;
}
  • 再次测试
//注意一定要修改变量名和方法一样,不然注入的还是底层自带的
@Autowired
RedisTemplate empRedisTemplate;

@Test
void contextLoads() {
    Employee employee = employeeMapper.getEmpById(1);
    empRedisTemplate.opsForValue().set("us", employee);

}
  • 测试结果

springboot2.2使用redis做缓存_第3张图片

4. 一切准备就绪,现在可以在这基础上配置redis缓存了
  • 在原有的RedisConfig中配置RedisCacheManager

    @Bean
    public RedisCacheManager employeeRedisCacheManager(RedisConnectionFactory redisConnectionFactory) {
        RedisCacheConfiguration cacheConfiguration =
                RedisCacheConfiguration.defaultCacheConfig()
                        .entryTtl(Duration.ofDays(1))   // 设置缓存过期时间为一天
                        .disableCachingNullValues()     // 禁用缓存空值,不缓存null校验
                        .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new
                                GenericJackson2JsonRedisSerializer()));     // 设置CacheManager的值序列化方式为json序列化,可加入@Class属性
        return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(cacheConfiguration).build();     // 设置默认的cache组件
    }
    
5. 配置完成,现在可以按照刚开始的注解使用redis缓存功能了

集群配置敬请期待

你可能感兴趣的:(springboot2.2使用redis做缓存)