1. 程式人生 > >springboot整合redis實現快取

springboot整合redis實現快取

使用redis做快取整合起來並不難,在整合的時候一定要將show sql開啟,這樣才能測試你寫整合的redis快取是否成功了。首先,你需要在官網下載一個redis,然後啟動redis-server,預設埠是6379,啟動後的介面如下:

 

redis在springboot的maven依賴:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
	<version>1.5.2.RELEASE</version>
</dependency>

在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<String, String> 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<Param> 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)