springboot整合redis实现缓存

使用redis做缓存整合起来并不难,在整合的时候一定要将show sql打开,这样才能测试你写整合的redis缓存是否成功了。首先,你需要在官网下载一个redis,然后启动redis-server,默认端口是6379,启动后的界面如下:

springboot整合redis实现缓存_第1张图片

 

redis在springboot的maven依赖:


	org.springframework.boot
	spring-boot-starter-data-redis
	1.5.2.RELEASE

在application.yml添加配置信息,其中cache_name是自定义的缓存名字,可以定义多个

spring: 
  redis:
    ##默认redis客户端连接为0 可修改
    database: 0
    host: 127.0.0.1
    port: 6379
    cache_name: XiChuanRedis
    ##password:
    pool:
      ##连接池最大空闲连接
      max-idle: 8
      min-idle: 0
      max-active: 8
      max-wait: 1
    timeout: 5000

新建一个redis的配置文件RedisConfig

@Configuration
@EnableCaching//启用缓存
public class RedisConfig extends CachingConfigurerSupport{

    @Value("${spring.redis.cache_name}")
    private String cacheName;

    @SuppressWarnings("rawtypes")
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        // 多个缓存的名称,目前只定义了一个
        rcm.setCacheNames(Arrays.asList(cacheName));
        //设置缓存过期时间(秒)
        rcm.setDefaultExpiration(6000);
        return rcm;
    }

    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

配置完成后,就可以在代码中使用@Cacheable、@CachePut、@CacheEvict。这三个注解必须写在方法上,才能生效.示例如下:

@Component
public classBaseServiceImpl{

    @Autowired
    ParamRepository paramRepository;

    @Cacheable(value="XiChuanRedis", key="'sign_test'")  
    public String getNotFinishedTypeCode(){
        List params = paramRepository.findBySpiderOver(0);

        if(params != null && params.size() > 0){
            return  params.stream()   //先将List按照id进行排序,然后取出最上面的那个,然后取出第一个
                    .sorted(Comparator.comparing(HeiGuangParam::getId))
                    .collect(Collectors.toList())
                    .get(0)
                    .getTypeCode();
        }else{   //如果没有就返回null
            return null;
        }
    }

    /**
     * 更新param后,需要将redis中的值移除
     * @param param
     */
    @CacheEvict(value="XiChuanRedis", key="'sign_test'")
    public void updateParamByTypeCode(Param param){
        paramRepository.save(param);
    }
}
 

@Cacheable:如果redis在相同的Cache有相同的key的缓存元素时,就会直接在redis缓存中,根据key读取缓存并返回结果;如果没有,则先调用方法,将返回值写入到redis缓存中,然后返回结果。它的属性有:value、key、condition

value:指定是哪一个Cache,可以指定多个Cache。例如:@Cacheable({"cache1", "cache2"})

key:缓存的key,当在清楚缓存时要与此对应。

1.key为null,则使用默认key。

2.key为一个字符串,例如:@CacheEvict(value="XiChuanRedis", key="'department_code_'")。
3.key为方法中的一个方法上的一个属性,例如:

@CacheEvict(value="XiChuanRedis", key="'code_'+#departmentCode")
public String getNameByCode(String departmentCode){
}

4.key为方法中的一个方法上的一个实体的属性,例如:

@Cacheable(value="XiChuanRedis", key="'userid_'+#user.id")
public User getUserById(Integer id){
}

condition:缓存条件,可以直接为null,例子如下:

​​​​​​​@Cacheable(value="XiChuanRedis", key="'userid_'+#user.id", condition="#user.id%2==0")
public User getUserById(Integer id){
}

 

@CachePut:它会每次调用方法,然后将缓存写到redis缓存中,并将结果返回。与@Cacheable不同的是,它不会检测在相同Cache中是否存在相同key的缓存元素。

value:与@Cacheable一致

key:与@Cacheable一致

condition:与@Cacheable一致

 

@CacheEvict:根据Cache与key清空缓存。

value:与@Cacheable一致

key:与@Cacheable一致

condition:与@Cacheable一致

allEntries:是否清空所有缓存,默认为false。例如:@CacheEvict(value="XiChuanRedis", key="'code'",allEntries=true)

beforeInvocation:是否在方法执行前就清空缓存,默认为false。例如:@CacheEvict(value="XiChuanRedis", key="'code'",beforeInvocation=true)

你可能感兴趣的:(SpringBoot,Redis,springboot,项目整合及进阶)