介紹SpringBoot 整合 Redis 快取

安全劍客發表於2020-04-01
無法支撐這麼大的資料訪問量,redis使用的時候可以單獨利用客戶端引入jar包操作即可,實際專案中都是和框架進行整合的比較多,此處演示利用springboot整合
1.首先匯入使用Maven匯入jar包
<dependency>    
    <groupId>org.springframework.boot</groupId>    
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.62</version>
</dependency>
2.在application.properties配置資訊
# Redis資料庫索引(預設為0)  
spring.redis.database=0  
# Redis伺服器地址  
spring.redis.host=localhost
# Redis伺服器連線埠  
spring.redis.port=6379  
# Redis伺服器連線密碼(預設為空)  
spring.redis.password=123456
# 連線池最大連線數(使用負值表示沒有限制)  
spring.redis.pool.max-active=200  
# 連線池最大阻塞等待時間(使用負值表示沒有限制)  
spring.redis.pool.max-wait=-1  
# 連線池中的最大空閒連線  
spring.redis.pool.max-idle=10 
# 連線池中的最小空閒連線  
spring.redis.pool.min-idle=0  
# 連線超時時間(毫秒)  
spring.redis.timeout=1000ms
3.編寫Redis工具類
@Configuration
@ConditionalOnClass(RedisOperations.class)      //系統中有RedisOperations類時
@EnableConfigurationProperties(RedisProperties.class)  //啟動RedisProperties這個類
@EnableCaching
// 
public class RedisConfig extends CachingConfigurerSupport {
    @Autowired
    RedisTemplate redisTemplate;
    // 配置快取管理器
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        LettuceConnectionFactory jedisConnectionFactory = (LettuceConnectionFactory) redisTemplate.getConnectionFactory();
        jedisConnectionFactory.setDatabase(2);      //指定dbindex
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        jedisConnectionFactory.resetConnection();
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(60*20)) // 20分鐘快取失效
                // 設定key的序列化方式
//                .entryTtl(Duration.ofSeconds(10))
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
                // 設定value的序列化方式
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new FastJsonRedisSerializer(Object.class)))
                // 不快取null值
                .disableCachingNullValues();
        RedisCacheManager redisCacheManager = RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(config)
                .transactionAware()
                .build();
        return redisCacheManager;
    }
}
package com.FireService.config;
import java.nio.charset.Charset;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
    private Class<T> clazz;
    static {
        ParserConfig.getGlobalInstance().addAccept("com.FireService");
    }
    public FastJsonRedisSerializer(Class<T> clazz) {
        super();
        this.clazz = clazz;
    }
    @Override
    public byte[] serialize(T t) throws SerializationException {
        if (null == t) {
            return new byte[0];
        }
        return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
    }
    @Override
    public T deserialize(byte[] bytes) throws SerializationException {
        if (null == bytes || bytes.length <= 0) {
            return null;
        }
        String str = new String(bytes, DEFAULT_CHARSET);
        return (T) JSON.parseObject(str, clazz);
    }
}
4.SpringBoot有關快取的幾個註解

@Cacheable:查詢
可選屬性:
cacheNames/value:指定快取元件的名字;
key:快取資料使用的key,可以用來指定。預設即使用方法引數的值
keyGenerator:key的生成器,可以自己指定key的生成器的元件id

//自定義配置類配置keyGenerator
@Configuration
public class MyCacheConfig {
    @Bean("myKeyGenerator")
    public KeyGenerator keyGenerator(){
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                return method.getName()+"["+ Arrays.asList(params).toString() +"]";
            }
        };
    }
}

cacheManager:指定快取管理器;或者cacheResolver獲取指定解析器

condition:指定符合條件的情況下才快取;如condition="#id>0"

unless:否定快取,當unless指定的條件為true,方法的返回值不會被快取,可以獲取到結果進行判斷;如unless="#result==null";

sync:是否使用非同步模式

例如:

@Cacheable(value = "RedisInfo", key = "#root.methodName+'['+#account+']'")
@ResponseBody
@RequestMapping("/RedisTest")
public Result findUserOrder(String account) throws Exception{
    if(account!=null) {
        List<Map<String, Object>> list=orderFindGoods.findUserOrder(account);
        return Results.successWithData(list, BaseEnums.SUCCESS.code(), BaseEnums.SUCCESS.desc());
    }else {
        return Results.failure();
    }
}

執行專案檢視結果

1.第一次訪問

檢視Druid連線資訊

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2683992/,如需轉載,請註明出處,否則將追究法律責任。

相關文章