spring-boot2.x使用redis

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/loophome/article/details/88875156

一、依赖引用并配置

implementation 'org.springframework.boot:spring-boot-starter-data-redis-reactive'
implementation 'org.apache.commons:commons-pool2'

如果不使用连接池,则可以不引入org.apache.commons:commons-pool2依赖。

spring.redis.database=0
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
#spring.redis.timeout.seconds=1
spring.redis.timeout=1000

 

二、配置Bean

在使用中,我们一般使用RedisTemplate这个对象,因此,我们需要对RedisTemplate进行配置和初始化。

@Configuration
public class RedisConfig {
    /**
     * 
     * @param connectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Serializable, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Serializable, Object> template = new RedisTemplate<>();
        //设置redis连接
        template.setConnectionFactory(connectionFactory);
        //此方法允许bean实例在设置了所有bean属性后执行其总体配置验证和最终初始化。
        template.afterPropertiesSet();
        //设置redis key的序列化器,一般使用字符串
        template.setKeySerializer(new StringRedisSerializer());
        //设置redis value的序列化器
        //value 一般配置为一个对象,需要自定义ObjectRedisSerializer
        template.setValueSerializer(new ObjectRedisSerializer(new SerializingConverter(), new DeserializingConverter()));
        return template;
    }
}

接下来编写编码和解码器

public class ObjectRedisSerializer implements RedisSerializer<Object> {
    private static final byte[] EMPTY_BYTE = new byte[0];
    private Converter<Object, byte[]> serializer;
    private Converter<byte[], Object> deserializer;
    public ObjectRedisSerializer(Converter<Object, byte[]> serializer, Converter<byte[], Object> deserializer) {
        this.serializer = serializer;
        this.deserializer = deserializer;
    }

    @Override
    public byte[] serialize(Object obj) throws SerializationException {
        // TODO Auto-generated method stub
        if (obj == null) {
            return EMPTY_BYTE;
        }
        byte[] byteArr = serializer.convert(obj);
        return byteArr;
    }

    @Override
    public Object deserialize(byte[] byteArr) throws SerializationException {
        // TODO Auto-generated method stub
        if (byteArr == null || byteArr.length == 0) {
            return null;
        }
        return deserializer.convert(byteArr);
    }

}

三、调用例子

这里使用@Autowired注入,也可以使用Controller的方法中注入

@Autowired
private RedisTemplate<Serializable, Object> redisTemplate;

获取值

(GoodsVO)redisTemplate.opsForValue().get("goods:1");

设置值

redisTemplate.opsForValue().set("goods:1", goodsVO, 10, TimeUnit.SECONDS);

四、redis崩溃处理

任何服务都会有崩溃的时候,比如网络问题,服务损坏都会导致redis无法连接

  redis连接异常
spring启动前

可以启动,调用时抛出RedisConnectionException异常,spring.redis.timeout配置生效。

redis启动后,能正确进行连接。

spring启动后

调用时抛出RedisCommandTimeoutException异常,超时时间是1min

redis启动后,能正确进行连接。

可以看到,服务启动后,spring.redis.timeout并没有生效,而且抛出的异常也不一致。从控制台打印的信息来看,lettuce连接池默认是开启的:

[2019-03-28 20:20:06.642] [INFO] [lettuce-eventExecutorLoop-1-1] [io.lettuce.core.protocol.ConnectionWatchdog] >>> Reconnecting, last destination was 127.0.0.1:6379
[2019-03-28 20:20:07.646] [WARN] [lettuce-nioEventLoop-4-4] [io.lettuce.core.protocol.ConnectionWatchdog] >>> Cannot reconnect: io.netty.channel.AbstractChannel$AnnotatedConnectException: Connection refused: no further information: /127.0.0.1:6379

原因是我在配置的时候使用spring.redis.timeout.seconds,这个配置对lettuce不生效,使用spring.redis.timeout就可以解决了。

展开阅读全文

没有更多推荐了,返回首页