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

相关文章

  • Java AES256加密解密示例代码

    下面是Java AES256加密解密示例代码的完整攻略: Java AES256加密解密示例代码 什么是AES256加密? AES256是一种对称加密算法,也就是说加密和解密都使用相同的密钥。AES256使用256位密钥长度,目前被认为是一种非常安全的加密算法。在Java中,可以使用javax.crypto包中的类来实现AES256加密。 AES256加密解…

    Java 2023年5月19日
    00
  • springboot整合JSR303校验功能实现代码

    下面我来详细讲解“Spring Boot整合JSR303校验功能实现代码”的完整攻略。 什么是JSR303校验功能? JSR303校验功能是指一种JavaBean的校验方式,用于对JavaBean的属性进行自定义校验,从而实现对表单数据合法性的校验。它基于注解实现,注解具有可读性强、可扩展性强的特点,而且使用非常简单。 Spring Boot整合JSR303…

    Java 2023年5月20日
    00
  • 解析Spring 漏洞及其修复方案

    解析Spring 漏洞及其修复方案 Spring框架是一款非常流行的Java应用程序框架,广泛应用于企业级应用程序开发中。然而,Spring框架中也有一些漏洞风险,这些漏洞可能会被黑客利用来攻击应用程序。以下是关于Spring漏洞及其修复方案的详细攻略。 Spring 漏洞类型 Spring框架中的漏洞风险主要分为以下几类: 注入漏洞:包括SQL注入和代码注…

    Java 2023年5月19日
    00
  • Jquery解析Json格式数据过程代码

    下面是详细讲解“Jquery解析Json格式数据过程代码”的完整攻略。 什么是 JSON JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。JSON是基于JavaScript的一个子集,因此在JavaScript环境中具有天然的兼容性,同时由于其简洁性和通用性,也被用于其他…

    Java 2023年6月15日
    00
  • 基数排序算法的原理与实现详解(Java/Go/Python/JS/C)

    基数排序算法的原理与实现详解(Java/Go/Python/JS/C) 算法简介 基数排序是一种非比较的排序算法,它通过将数组中的元素从低位到高位依次进行排序,最终实现整个数组的排序。基数排序算法不同于其他排序算法,其不基于比较算法进行排序,因此拥有O(n)的时间复杂度。基数排序算法对于大数据量、高位数的数组排序具有优势。 算法实现 基数排序算法可以使用Ja…

    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
  • 详解DES加密算法及在Java程序中的使用示例

    详解DES加密算法及在Java程序中的使用示例 简介 DES(Data Encryption Standard)算法是一种基于对称密钥加密的算法,是保护计算机数据最常用的方法之一。该算法使用相同的密钥进行加密和解密,主要用于保护敏感数据的安全性。本文将详细讲解DES加密算法,并提供它在Java程序中的使用示例。 DES加密算法 DES算法主要包括两个过程:加…

    Java 2023年5月26日
    00
  • 利用 Linq+Jquery+Ajax 实现异步分页功能可简化带宽压力

    利用 Linq+Jquery+Ajax 实现异步分页功能可简化带宽压力的攻略包括以下几个步骤: 1. 后端接口 首先需要在后端实现一个接口用于提供分页数据,可以使用 Linq 来实现。下面是一个 C# 的示例代码: public JsonResult GetList(int pageIndex, int pageSize) { var list = db.U…

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