浅谈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日

相关文章

  • HashMap和HashTable底层原理以及常见面试题

    HashMap和HashTable底层原理以及常见面试题 1. HashMap和HashTable的区别 HashMap和HashTable都是Java中的重要容器类,它们的目的是为了存放和访问键值对。虽然它们的功能是相似的,但是它们在底层的实现和使用上有很大的不同。 1.1 HashMap HashMap的底层是基于哈希表实现的,其键值对存储在Entry数…

    Java 2023年5月26日
    00
  • Java中数学相关类的使用教程

    Java中数学相关类的使用教程 Java中提供了许多数学相关的类,包括Math、BigDecimal、BigInteger等,这些类有助于我们进行数值计算和处理。在本篇攻略中,我们将介绍这些类的使用方法。 Math类 Math类是Java中提供的数学计算类,常用的方法包括: abs():返回一个数的绝对值; floor():返回小于或等于参数的最大的整数; …

    Java 2023年5月26日
    00
  • JAVA文件读写操作详解

    JAVA文件读写操作详解 什么是文件读写操作 文件读写操作是指对于指定的文件,通过程序的方式读取其中的数据或者将程序中的数据写入到文件中。文件读写操作是一个底层的技术,基本上所有的软件开发都会用到这个技术。 JAVA文件读写操作的常用类 在JAVA中,文件读写操作主要涉及到以下几个类: File类:代表文件和目录的抽象表示。通过对File类的操作,可以创建、…

    Java 2023年5月20日
    00
  • idea中如何配置tomcat

    下面是关于如何在IntelliJ IDEA中配置Tomcat的攻略。 配置Tomcat 下载Tomcat 首先,需要从Tomcat的官网下载Tomcat,下载地址为https://tomcat.apache.org。选择适合自己的版本和操作系统,并下载对应的文件。下载完成后,解压文件。 在IDEA中新增Tomcat配置 打开IntelliJ IDEA,点击顶…

    Java 2023年6月2日
    00
  • Java实战之用springboot+netty实现简单的一对一聊天

    准备工作 在开始实现之前,我们需要准备好一些工具。首先,我们需要安装JDK和Maven。然后,我们需要选择一个好用的IDE来进行开发。这里我推荐使用IntelliJ IDEA。最后,我们需要下载Netty和Spring Boot的依赖。 实现一对一聊天 首先,我们需要定义一些数据结构来表示聊天消息。这里我定义了一个简单的类ChatMessage来表示消息: …

    Java 2023年5月19日
    00
  • 解决tomcat发布工程后,WEB-INF/classes下文件不编译的问题

    当我们在开发Web应用程序时,通常会将Java源代码放置在WEB-INF/classes目录下以便编译。 但有时候,当我们发布Web应用程序到Tomcat容器中时,我们发现Web应用程序无法正常工作,这时我们可能需要解决一个经典的问题:Tomcat发布工程后,WEB-INF/classes下文件不编译的问题。 那么,如何解决这个问题呢?下面是具体的攻略: 检…

    Java 2023年5月26日
    00
  • java实现写入并保存txt文件的代码详解

    下面我会详细讲解Java实现写入并保存txt文件的代码详解。 1. 创建文件 要想写入并保存txt文件,首先需要创建一个文件,并确定写入的路径。可以使用Java中的File类来创建一个文件对象。在创建文件前需确定写入文件的路径,可以使用如下代码来实现: File file = new File("D:\\test\\test.txt");…

    Java 2023年5月20日
    00
  • 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的方法(推荐)

    使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务的方法是目前被广泛使用的一种方式,它能够简化我们对HTTP服务的调用过程,提高我们的开发效率。下面就为大家详细讲解一下这个攻略。 什么是Spring Cloud Feign Spring Cloud Feign是基于Netflix Feign实现的一种服务调用方式。它可以让我们以接…

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