浅谈Spring Data Redis读不到设进去的值

针对“浅谈Spring Data Redis读不到设进去的值”的问题,我整理了以下攻略,希望可以帮到您。

问题描述

在使用Spring Data Redis操作Redis时,发现虽然可以成功地将值设进去,但是在读取的时候却无法读取到。

原因分析

  1. Redis中的key过期
    Redis有可能设置了自动过期,导致读取不到之前存储在Redis中的值。可以通过ttl命令查看key的过期时间,或者使用persist命令去除过期时间。
  2. 序列化问题
    Spring Data Redis使用序列化的方式将Java对象序列化为Redis键值对。如果使用的序列化方式与读取时的方式不一致,就可能无法正确读取Redis中的值。可以使用Jackson2JsonRedisSerializerGenericToStringSerializer等序列化器来处理序列化的问题。
  3. Redis配置问题
    如果Redis的配置不正确,可能也会导致无法正确读取Redis中的值。可以检查Redis的配置文件,例如是否开启了AOF日志。

解决方案

  1. 检查key是否过期,如果过期,则使用persist命令去除过期时间。
String key = "test:key";
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
// 设置key值,并指定过期时间为10秒
valueOperations.set(key, "value", 10, TimeUnit.SECONDS);
// 查看key的过期时间
Long ttl = redisTemplate.getExpire(key);
System.out.println("ttl: " + ttl);
// 去除key的过期时间
redisTemplate.persist(key);
  1. 修改Redis的序列化方式,使用Jackson2JsonRedisSerializerGenericToStringSerializer等序列化器。
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory,
                                                       Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer,
                                                       GenericToStringSerializer<Object> genericToStringSerializer) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // key的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // value的序列化方式
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(genericToStringSerializer);
        return redisTemplate;
    }

    /**
     * Jackson序列化器
     */
    @Bean
    public Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
        serializer.setObjectMapper(mapper);
        return serializer;
    }

    /**
     * GenericToString序列化器
     */
    @Bean
    public GenericToStringSerializer<Object> genericToStringSerializer() {
        return new GenericToStringSerializer<>(Object.class);
    }
}
  1. 检查Redis的配置文件,例如是否开启了AOF日志。

示例

示例1

在Redis中存储一个字符串,并指定过期时间为10秒。然后再获取该值,判断是否过期,如果过期,则去除过期时间。

String key = "test:key";
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
// 设置key值,并指定过期时间为10秒
valueOperations.set(key, "value", 10, TimeUnit.SECONDS);
// 查看key的过期时间
Long ttl = redisTemplate.getExpire(key);
System.out.println("ttl: " + ttl);
// 延迟15秒,等待key过期
Thread.sleep(15000L);
// 查看key的过期时间
Long newTtl = redisTemplate.getExpire(key);
System.out.println("new ttl: " + newTtl); // 过期了,返回-2
// 去除key的过期时间
redisTemplate.persist(key);
// 再次查看key的过期时间
Long noTtl = redisTemplate.getExpire(key);
System.out.println("no ttl: " + noTtl); // 不过期了,返回-1

示例2

在Redis中存储一个Java对象,并使用Jackson2JsonRedisSerializer序列化。然后再读取该值。

String key = "test:key";
User user = new User("张三", 20);
// 对象序列化
ValueOperations<String, Object> valueOperations = redisTemplate.opsForValue();
valueOperations.set(key, user);
// 对象反序列化
User newUser = (User) valueOperations.get(key);
System.out.println(newUser.getName() + ": " + newUser.getAge()); // 输出“张三: 20”

以上就是完整的“浅谈Spring Data Redis读不到设进去的值”的攻略了,希望可以对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅谈Spring Data Redis读不到设进去的值 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • asp.net getRemoteAddr()与 getRemoteHost()的区别

    为了更好地理解getRemoteAddr()和getRemoteHost()这两个方法的区别,我们需要先了解一下HTTP协议和网络协议。HTTP协议是一种基于网络协议的高级应用层协议,它定义了浏览器和Web服务器之间传输数据的格式和方式。网络协议则是计算机之间通信的规则和标准,它涵盖了物理层、数据链路层、网络层等各种层次。在浏览器和Web服务器之间传输数据时…

    Java 2023年6月15日
    00
  • Mybatis 自动映射(使用需谨慎)

    Mybatis 自动映射 (Auto-mapping) 是指Mybatis在进行 SQL 查询结果和Java对象映射时,自动查找Java对象对应属性名和SQL查询结果列名相同的项,并进行赋值。自动映射虽然能够简化开发工作,但也存在一些需要注意的地方,使用时需谨慎。 自动映射的配置方式 方式一: 自动映射全局开启 Mybatis提供了全局配置自动映射的方式,即…

    Java 2023年5月19日
    00
  • Java%(取模运算)全面讲解

    Java中%(取模运算)全面讲解 在Java中,%也被称为取模运算符。它表示两个数的除法操作,结果为余数。 基本用法 int a = 5; int b = 2; int c = a % b; // c的值为1,因为5除以2等于2余1 上面的代码中,先定义了两个整数a和b,然后进行a与b的取模运算,结果保存在变量c中。根据上面的计算,结果为1。 需要注意的是,…

    Java 2023年5月19日
    00
  • Jackson常用方法以及jacksonUtil工具类详解

    Jackson常用方法以及jacksonUtil工具类详解 什么是Jackson Jackson是一个开源的Java库,用于处理JSON格式数据。Jackson能够将Java对象转换成JSON格式的字符串,并且还能将JSON格式的字符串转换成Java对象。在Java Web开发中,使用Jackson能够简化代码并且提高效率。 常用方法 将Java 对象转换为…

    Java 2023年5月26日
    00
  • jsp获取url路径的方法分析

    当我们进行网站开发时,经常需要获取当前页面的URL路径。在JSP中,获取URL路径的方法有多种,其中包括以下几种常用方法: 方法一:使用request对象获取URL路径 通过request对象的方法getRequestURL()可以获取当前页面完整的URL路径,通过getRequestURI()可以获取相对路径。 示例代码如下: <% String u…

    Java 2023年6月15日
    00
  • Spring Boot统一接口返回及全局异常处理

    针对这个问题,我需要从以下几个方面来进行讲解: Spring Boot统一接口返回 全局异常处理 Spring Boot统一接口返回 在Spring Boot开发中,我们通常需要采用统一的接口返回格式,以便于前后端进行沟通和交互,同时对于异常情况也需要进行统一处理。 在实现统一接口返回的过程中,我们可以借助Spring Boot提供的ResponseBody…

    Java 2023年5月27日
    00
  • 浅谈Java中Unicode的编码和实现

    浅谈Java中Unicode的编码和实现 什么是Unicode? Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,它对世界上大部分的文字系统进行了编码,以便实现文字在计算机内的处理。Unicode利用一组标准编码,为世界上所有的文字和符号都指定了一个唯一的代码位,用于在计算机中存储、交换和处理。在Java中,char类型采用的编码是…

    Java 2023年5月20日
    00
  • Java 实现滑动时间窗口限流算法的代码

    Java 实现滑动时间窗口限流算法的代码,可以通过以下步骤实现: 选择计数器在实现滑动时间窗口限流算法之前,我们需要选择一个计数器,通常情况下,我们会选择计数器的实现方式为Redis实现自增操作。 设置滑动时间窗口的大小在选择计数器后,需要设置滑动时间窗口的大小。滑动时间窗口的大小指的是,在多长时间内进行访问限制。例如,我们可以设置时间间隔为1分钟。如果在1…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部