redis的java客户端

jedis
lettuce
redisson

依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.0</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!--连接池依赖-->
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-pool2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
</dependencies>

配置文件

spring:
  redis:
    host: localhost
    port: 6379
    password:
    lettuce:
      pool:
        max-active: 8 # 最大连接
        max-idle: 8 # 最大空闲连接
        min-idle: 0 # 最小空闲连接
        max-wait: 100 # 连接等待时间

RedisTemplate的序列化

// 默认采用的是JdkSerializationRedisSerializer
// 可以采用GenericJackson2JsonRedisSerializer或Jackson2JsonRedisSerializer
// 方式1
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(connectionFactory);
    // 设置序列化
    redisTemplate.setKeySerializer(RedisSerializer.string());
    redisTemplate.setValueSerializer(RedisSerializer.json());
    return redisTemplate;
}
// 方式2
@Bean
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory connectionFactory){
    RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(connectionFactory);
    // 设置序列化
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper mapper = new ObjectMapper();
    mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
    mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
    SimpleModule simpleModule = new SimpleModule()
            .addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
            .addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)));
    mapper.registerModule(simpleModule);
    serializer.setObjectMapper(mapper);
    redisTemplate.setValueSerializer(serializer);
    return redisTemplate;
}

部分代码解释

// 序列化所有成员变量,(默认只序列化public)
mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
// Method for enabling automatic inclusion of type information
// needed for proper deserialization of polymorphic types
// 序列化为JSON时,自动包含 反序列化时所需要的类型信息
// default typing will be used for
//      * all non-final types, with exception of small number of
//      * "natural" types (String, Boolean, Integer, Double), which
//      * can be correctly inferred from JSON;
// 序列化为JSON时,为JSON包含类型信息(不写这句代码,存储的JSON数据不包含类型信息,将来反序列化时处理为LinkedHashMap)
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);

// for instance
// 得到的数据是LinkedHashMap
List<dish> byCategoryId = redisTemplate.opsForList().range(key,0,-1);
// 加上这行代码
// 存到Redis中的数据会带上类型信息,这里猜测主要是将来从Redis中取数据时,方便反序列化为指定的POJO类型对象
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
// 得到的数据是dish
List<dish> byCategoryId = redisTemplate.opsForList().range(key,0,-1);

redis-cli乱码

#cmd环境下
chcp # 查看当前使用的编码
chcp 65001 # 切换到utf8
# 启动
.\redis-cli --raw

Jackson2JsonRedisSerializer
enableDefaultTyping方法过期
enableDefaultTyping
RedisTemplate存放集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值