springboot整合redis實現緩存


 
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
 
         
package org.springblade.common.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import java.time.Duration;


@Configuration
public class RedisConfig {
private Duration timeToLive = Duration.ofHours(1);

@Bean
public RedisTemplate<Object, Object> edisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);

// 使用Jackson2JsonRedisSerialize 替換默認序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);

jackson2JsonRedisSerializer.setObjectMapper(objectMapper);

// 設置value的序列化規則和 key的序列化規則
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}

@Bean
public CacheManager cacheManager(RedisConnectionFactory factory) {
RedisSerializer<String> redisSerializer = new StringRedisSerializer();
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);

// 配置序列化(解決亂碼的問題)
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(timeToLive)
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))
.disableCachingNullValues();
RedisCacheManager cacheManager = RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();

return cacheManager;
}


}
 
@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){
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM