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

yizhihongxing

针对“浅谈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中绝对值函数的介绍与其妙用

    下面是Java中绝对值函数的介绍与其妙用的完整攻略。 一、绝对值函数的介绍 在Java中,绝对值函数可用于求一个数的绝对值。绝对值指的是去掉一个数的符号,得到该数的正值。在Java中,求绝对值的函数是Math类中的abs方法。abs方法有两个重载: public static int abs(int a) public static long abs(lon…

    Java 2023年5月26日
    00
  • Java实现图片验证码具体代码

    当网站需要进行用户登录、注册等操作时,为了防止机器人恶意攻击,通常会采用图片验证码的方式来验证用户是否为人类。下面介绍一种基于 Java 实现图片验证码的具体代码,包含验证码生成和校验流程。 生成验证码图片 验证码生成包含以下几个步骤: 生成随机字符串 /** * 生成指定长度的随机字符串 * @param length 随机字符串长度 * @return …

    Java 2023年6月15日
    00
  • 使用Spring Security OAuth2实现单点登录

    使用Spring Security OAuth2实现单点登录的完整攻略如下: 1. 概述 OAuth(Open Authorization)是一个标准的身份验证和授权协议,OAuth2是OAuth协议的下一个版本。OAuth2基于授权访问所有类型的应用程序,通过集中授权服务器授权用户访问受保护的资源。在实际应用中,OAuth2通常用来实现单点登录(SSO)的…

    Java 2023年5月20日
    00
  • Spring Security的过滤器链机制

    Spring Security是一个流行的企业级安全框架,它可以提供应用程序的验证和授权服务。在Spring Security中,过滤器链(Filter Chain)是其中一个重要的概念。 Spring Security的过滤器链 Spring Security的过滤器链是一个由多个过滤器组成的链式结构,用于对每一个请求进行处理。当一个请求进入Spring …

    Java 2023年6月3日
    00
  • java编程题之从上往下打印出二叉树

    Java编程题之从上往下打印出二叉树 题目描述 给定一棵二叉树的根节点,从上往下按层打印出这个二叉树,同一层的节点按照从左到右的顺序打印。 例如,给定一个如下所示的二叉树: 8 / \ 6 10 / \ / \ 5 7 9 11 打印出的顺序为:8 6 10 5 7 9 11。 解题思路 此题的解法可以用到二叉树的遍历,我们可以用队列来保存每一层的节点。 将…

    Java 2023年5月26日
    00
  • 深入解析Java的Spring框架中的混合事务与bean的区分

    深入解析Java的Spring框架中的混合事务与bean的区分,这是一个比较广泛的话题,我们可以从以下几个方面进行讲解: Spring框架事务管理的概述 Spring混合事务的定义与原理 Spring Bean的定义与作用 如何区分Spring混合事务与Bean 1. Spring框架事务管理的概述 Spring框架中的事务管理是一种重要的机制,可以帮助我们…

    Java 2023年5月20日
    00
  • SSH 框架简介

    SSH框架简介 SSH框架是一种基于Java的web开发框架,它整合了Struts, Spring 和 Hibernate 三个优秀的开源框架,并提供了一系列的组件来支持Web应用的开发和部署。 SSH框架的三个组成部分 Struts Struts是一款广泛应用于Web应用开发中的MVC框架,它的目的是将业务逻辑、数据和展现层分离出来,提高应用程序的可拓展性…

    Java 2023年5月20日
    00
  • java的Hibernate框架报错“ConstraintViolationException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“ConstraintViolationException”错误。这个错误通常是由于以下原因之一引起的: 违反了数据库约束:如果您尝试插入或更新数据时违反了数据库约束,则可能会出现此错误。在这种情况下,需要查看数据库约束并解决问题。 数据库事务问题:如果您尝试插入或更新数据时存在事务问题,则可能会出现此错误…

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