Springboot2整合Redis配置

前提是曾经装置好了redis并启动,这儿仅是springboot我的项目的整合

一、导入依赖

<!--数据库连接池,redis-starter其实曾经蕴含了pool1版本,这儿应用2--><dependency>    <groupId>org.apache.commons</groupId>    <artifactId>commons-pool2</artifactId></dependency><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-redis</artifactId></dependency>

二、yml文件中配置redis

spring:  redis:    host: *******    port: ****    password: *******    lettuce:  #配置连接池属性      pool:        max-active: 500 #连接池最大连接数        max-wait: -1 #最大阻塞等待时间,正数示意没有限度        max-idle: 10 #最大闲暇连贯        min-idle: 0 #最小闲暇连贯        timeout: 30000 #超时工夫,单位ms  cache:  #配置缓存的名称    cache-names: redisCache    type: redis

三、配置redis序列化

redis-starter提供了StringRedisTemplate以及RedisTemplate两种模板,看源码能够发现StringRedisTemplate是继承自RedisTemplate

public class StringRedisTemplate extends RedisTemplate<String, String> {    public StringRedisTemplate() {        this.setKeySerializer(RedisSerializer.string());        this.setValueSerializer(RedisSerializer.string());        this.setHashKeySerializer(RedisSerializer.string());        this.setHashValueSerializer(RedisSerializer.string());    }    public StringRedisTemplate(RedisConnectionFactory connectionFactory) {        this();        this.setConnectionFactory(connectionFactory);        this.afterPropertiesSet();    }    protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {        return new DefaultStringRedisConnection(connection);    }}

如果操作对象仅仅是简略的string类型,倡议间接应用StringRedisTemplate即可,因为它应用了StringRedis序列化,不必本人重写序列化形式。如果要应用存取对象的性能,则须要应用RedisTemplate,并重写它的序列化形式,看配置源码可晓得@ConditionalOnMissingBean在给定的在bean不存在时,则实例化以后Bean,所以咱们本人配置同样的办法并注册,即可实现自定义序列化形式。

@Bean@ConditionalOnMissingBean(    name = {"redisTemplate"})@ConditionalOnSingleCandidate(RedisConnectionFactory.class)public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {    RedisTemplate<Object, Object> template = new RedisTemplate();    template.setConnectionFactory(redisConnectionFactory);    return template;}

另外如果须要往redis中存取数据以及开启缓存,咱们也须要写一个cacheManager办法,整合到一个RedisConfig配置类中,代码如下:

@Configuration //标记此类为配置类@EnableCachingpublic class RedisConfig extends CachingConfigurerSupport {    // 这儿重写了RedisTemplate序列化形式(redis默认的是JDK序列化,须要让每个对象类实现序列化接口能力进行存取,且可视化不敌对),并应用Bean注解将之注入到容器中进行治理    @Bean    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownException {        // 咱们个别应用string,object类型        RedisTemplate<String, Object> template = new RedisTemplate<>();        template.setConnectionFactory(redisConnectionFactory);        // 序列化配置,应用Jackson形式        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);        jackson2JsonRedisSerializer.setObjectMapper(om);        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();        // key采纳string序列化形式        template.setKeySerializer(stringRedisSerializer);        // hash的key同样        template.setHashKeySerializer(stringRedisSerializer);        // value采纳jackson        template.setValueSerializer(jackson2JsonRedisSerializer);        // hash的value同样        template.setHashValueSerializer(jackson2JsonRedisSerializer);        template.afterPropertiesSet();        return template;    }        // 这儿是对缓存进行配置,同样采纳Jackson序列化形式    @Bean    RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {        StringRedisSerializer strSerializer = new StringRedisSerializer();        Jackson2JsonRedisSerializer<Object> jacksonSerial = new Jackson2JsonRedisSerializer<>(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);        jacksonSerial.setObjectMapper(om);        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()                                        // 无效工夫设置为1天                                        .entryTtl(Duration.ofDays(1))                                        .serializeKeysWith(RedisSerializationContext.SerializationPair                                        .fromSerializer(strSerializer))                                        .serializeValuesWith(RedisSerializationContext.SerializationPair                                        .fromSerializer(jacksonSerial))                                        .disableCachingNullValues();        return RedisCacheManager.builder(redisConnectionFactory).cacheDefaults(config).build();    }}

四、RedisUtils

在理论的工作中,并不需要咱们应用原生的形式去应用Redis,相似于这样:stringRedis.opsForValue()。个别会编写一个Redis工具类来封装这些用法,网上轻易能够找到,我本人也是网上轻易下载的一个,在我的gitee里有源码。

五、测试

到这儿就能够实现根本的存取数据、缓存操作了,轻易写两个Demo测试一下。
首先测试RedisTemplate,存入简略的key-value:

    // 放订单两倍的人进入音讯队列进行领先付款    redisUtils.set("Goods" + goods.getId(), goods.getNumber() * 2);

后果如下

而后测试缓存,老样子写一个简略的最简略的@Cacheable注解:

/** * 商品信息退出缓存中 * @return 返回商品信息 */@Cacheable(value = "redisCache", key = "'Goods'")public Goods findGoods(Integer id){    return cacheMapper.findGoods(id);}

而后本人轻易写一个测试方法调用此办法,再看redis可视化软件,后果图片如下:

能够看到json对象缓存胜利,到此结束redis的根本配置。