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

 更新时间:2021年09月24日 09:25:10   作者:JavaEdge.  
本文主要介绍了Spring Data Redis怎么读不到我刚才设进去的值,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

目标

精通 Spring Data Redis 操作流程。

Spring Data提供了对市场上主流数据库支持:

Spring Data Commons
Spring Data JPA
Spring Data KeyValue
Spring Data LDAP
Spring Data MongoDB
Spring Data Redis
Spring Data REST
Spring Data for Apache Cassandra
Spring Data for Apache Geode
Spring Data for Apache Solr
Spring Data for Pivotal GemFire
Spring Data Couchbase (community module)
Spring Data Elasticsearch (community module)
Spring Data Neo4j (community module)

而在使用时,难免会不动声色的写出一堆 bug。

1 注意读、取一致性

当使用 Spring Data Redis 时,我们有时候会在项目升级的过程中,发现存储后的数据有读取不到的情况;另外,还会出现解析出错的情况。

案例

使用了 Redis 提供的两种 Template:

  • RedisTemplate
  • stringRedisTemplate

但当使用后者去存一个数据后,发现使用前者取不到对应数据:

这不很显然吗?是因为这俩 Template 不同呀!

发散一下思维,试想若我们是不同项目的开发。一个项目只负责存储,另外一个项目只负责读取,两个项目之间缺乏沟通。如此看来,这种问题是不是就很常见了?

解析

我们不可能直接将数据存取到 Redis,毕竟一些数据是对象类型,例如 String或自定义对象。因此需要在存取前对数据进行序列化或反序列化。

带着key去存取数据时,会执行

AbstractOperations#rawKey

在执行存储 K.V 到 Redis或从 Redis 读数据前,对 key 进行序列化操作:


可见,若存在 keySerializer,则利用它序列化 key。
对于 StringRedisSerializer,它指定的 StringRedisSerializer:

public class StringRedisSerializer implements RedisSerializer<String> {

   private final Charset charset;
   
   @Override
   public byte[] serialize(@Nullable String string) {
      return (string == null ? null : string.getBytes(charset));
   }
 
}

若使用 RedisTemplate,则使用的JDK序列化:

public class JdkSerializationRedisSerializer implements RedisSerializer<Object> {

   @Override
   public byte[] serialize(@Nullable Object object) {
      if (object == null) {
         return SerializationUtils.EMPTY_ARRAY;
      }
      try {
         return serializer.convert(object);
      } catch (Exception ex) {
         throw new SerializationException("Cannot serialize", ex);
      }
   }
}

所以最后对 K 的读取处理,采用的JDK序列化:


反序列化结果的确不同。

那如何指定 RedisSerializer 的?

以 StringRedisSerializer 为例。StringRedisTemplate构造器直接指定了KeySerializer为 RedisSerializer.string():


RedisSerializer.string():


修正

一定要注意一致性,例如读写的序列化方法需要一致:

  • 检查自己所有的数据操作,是否使用了相同的 RedisTemplate
  • 即使相同,也要检查所指定各种Serializer是否完全一致

到此这篇关于浅谈Spring Data Redis读不到设进去的值的文章就介绍到这了,更多相关Spring Data Redis读不到值 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

    详解log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析

    这篇文章主要介绍了详解log4j-over-slf4j与slf4j-log4j12共存stack overflow异常分析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • idea中导入项目后main方法无法Run的解决

    idea中导入项目后main方法无法Run的解决

    这篇文章主要介绍了idea中导入项目后main方法无法Run的解决方案,具有很好的参考价值,希望对大家有所帮助。
    2023-03-03
  • springcloud整合openfeign使用实例详解

    springcloud整合openfeign使用实例详解

    这篇文章主要介绍了springcloud整合openfeign使用详解,以springcloud中提供的远程接口调用组件openfeign为例,来聊聊openfeign的详细使用,需要的朋友可以参考下
    2023-03-03
  • Spring MVC文件请求处理MultipartResolver详解

    Spring MVC文件请求处理MultipartResolver详解

    这篇文章主要介绍了Spring MVC文件请求处理详解:MultipartResolver,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-11-11
  • Java HashMap底层实现原理

    Java HashMap底层实现原理

    HashMap在不同的JDK版本下的实现是不同的,在JDK1.7时,HashMap 底层是通过数组+链表实现的;而在JDK1.8时,HashMap底层是通过数组+链表或红黑树实现的,本详细介绍了HashMap底层是如何实现的,需要的朋友可以参考下
    2023-05-05
  • SpringCloud Zuul过滤器和谷歌Gauva实现限流

    SpringCloud Zuul过滤器和谷歌Gauva实现限流

    这篇文章主要介绍了SpringCloud Zuul过滤器和谷歌Gauva实现限流,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • iReport使用指南及常见功能示例详解

    iReport使用指南及常见功能示例详解

    这篇文章主要介绍了iReport使用指南及常见功能,本文以iReport 3.5.1为例,通过示例演示给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Mybatis实现Mapper动态代理方式详解

    Mybatis实现Mapper动态代理方式详解

    这篇文章主要为大家详细介绍了Mybatis实现Mapper动态代理方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • java 三角形类 Triangle的用法详解

    java 三角形类 Triangle的用法详解

    这篇文章主要介绍了java 三角形类 Triangle的用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java并发编程中的Callable、Future和FutureTask详解

    Java并发编程中的Callable、Future和FutureTask详解

    这篇文章主要介绍了Java并发编程中的Callable、Future和FutureTask详解,创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口,这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果,需要的朋友可以参考下
    2023-07-07

最新评论