`
y806839048
  • 浏览: 1132745 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

spring-data-redis 使用过程中需要注意的一点(序列化选择)

阅读更多

在项目中需要用到redis做缓存,于是采用spring-data-redis,并且打算自己封装一个redis的静态工具类。后来在进行单元测试的过程中发现了一个容易出错的地方,于是打算记录下来,并分享给各位朋友。

这里主要说下碰到的问题,首先,采用了spring-data-redis(以下简称SDR)中的Template进行redis的操作。

因为考虑到后期的使用场景,于是同时采用了StringRedisTemplate和RedisTemplate,并且对存储String与存储Java对象采用不同的Template进行了简单的封装。

首先是测试 保存与取出方法。分别用不同的template可以完美通过。

然后在测试删除的方法中,测试出现了问题。

问题如下:

    在采用StringRedisTemplate进行保存的数据,用StringRedisTemplate去删除可以成功删除。

    在采用RedisTemplate进行保存的数据,用RedisTemplate去删除也可以删除成功。

    在用RedisTemplate去删除StringRedisTemplate保存的数据时,发现删除失败。

    在用StringRedisTemplate去删除RedisTemplate保存的数据时,删除失败。

因为,需要封装一套通用的删除方法,并且需要封装一个批量删除的方法。所以研究了下问题出现的原因。

经过查看SDR官方给出的文档,发现是因为序列化策略的问题。

这里简单说下:

    SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。StringRedisSerializer

    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。JdkSerializationRedisSerializer

就是因为序列化策略的不同,即使是同一个key用不同的Template去序列化,结果是不同的。所以根据key去删除数据的时候就出现了删除失败的问题。

解决方法如下,手动指定RedisTemplate的key的序列化策略

<!-- redis 序列化策略 ,通常情况下key值采用String序列化策略, -->
<!-- 如果不指定序列化策略,StringRedisTemplate的key和value都将采用String序列化策略; -->
<!-- 但是RedisTemplate的key和value都将采用JDK序列化 这样就会出现采用不同template保存的数据不能用同一个template删除的问题 -->
<bean id="stringRedisSerializer" 
    class="org.springframework.data.redis.serializer.StringRedisSerializer" />

<bean id='redisWriteTemplate' class="org.springframework.data.redis.core.RedisTemplate">
    <property name="connectionFactory" ref="jedisWriteConnectionFactory" />
    <property name="keySerializer" ref="stringRedisSerializer" />
    <property name="hashKeySerializer" ref="stringRedisSerializer" />
</bean>

这样就能完美的删除了。

这里推荐将所有Templatekey都采用String的序列化方式,而value的序列化方式可以采用不同的序列化方式。(jreids自动选择)(这样还有一个好处就是不必string的也采用jdk的序列化从而导常用数据格式致为了存储数据结构浪费空间)

另外 出来这两个序列化方式之外,SDR还提供了  

JacksonJsonRedisSerializer
Jackson2JsonRedisSerializer
OxmSerializer

等序列化方法,大家可以分别采用各种序列化方式做一些试验。

分享到:
评论

相关推荐

    springMVC集成spring-data-redis

    在实际项目中,根据具体需求,你可能还需要关注数据序列化(如JSON或二进制)、错误处理、性能优化等方面的内容。通过这种方式,你可以充分利用Redis的实时通信能力和SpringMVC的灵活性,构建出高效的分布式系统。

    spring-data-redis 1.7.6

    在处理数据序列化方面,Spring-data-redis允许自定义Serializer,如使用Jackson2JsonRedisSerializer进行JSON序列化。源码中,DefaultRedisSerializer类实现了这一功能,通过反射和反序列化技术,将Java对象与Redis...

    spring-data-redis-1.6.0.RELEASE.jar + jedis-2.7.2.jar

    例如,要使用Spring Data Redis,首先需要在项目中引入`spring-data-redis-1.6.0.RELEASE.jar`。然后,通过配置文件设置Redis服务器的连接信息,包括主机地址、端口、密码等。接着,在Spring的配置类中定义...

    spring-data-redis.jar

    Spring Data Redis支持多种序列化策略,如JdkSerializationRedisSerializer、StringRedisSerializer和JsonRedisSerializer,可根据实际需求选择合适的序列化方式。 4. **事务支持**:Redis支持单个命令的原子性,...

    spring-data-redis

    Spring Data Redis是Spring框架下的一个子项目,它为Redis提供了丰富的支持,使得在Java应用中使用Redis变得极其便捷。Redis是一个高性能的键值数据库,适用于高速读写操作,常被用作缓存、消息中间件、数据存储等...

    spring-data-redis-1.0.1

    总的来说,Spring Data Redis 1.0.1版本是Java开发者使用Redis的强大工具,它不仅简化了Redis的使用,还通过Spring框架的特性增强了Redis在分布式应用中的作用。通过深入理解和熟练掌握这个版本,开发者能够构建出...

    spring-data-redis-1.6.0.RELEASE最新稳定版(个人测试通过)

    9. **数据类型转换**:Spring Data Redis 自动处理 Java 对象与 Redis 值之间的转换,通过序列化器(Serializer)进行对象到字节流的转换,确保数据的正确存储和读取。 10. **集成测试**:Spring Data Redis 提供了...

    spring-data-redis-1.0.2

    源码分析可以帮助我们更好地理解如何实现自定义序列化器、连接池配置、以及如何利用Redis Sentinel或Cluster进行高可用性部署。 同时,这个版本还可能包含了一些性能优化和bug修复。例如,可能针对某些特定操作的...

    Spring-data-redis使用指南

    **Spring Data Redis** 是 **Spring Data** 家族中的一个模块,它为 **Redis** 提供了一套方便的操作接口,使得开发人员可以更加高效地利用 **Redis** 进行数据存储与检索。本章节将对 Spring Data Redis 的主要功能...

    spring-data-redis-1.7.10.RELEASE jar包

    Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,...

    SpringData与Redis集成

    在学习过程中,你可以通过提供的源代码来实践这些步骤,逐步理解SpringData Redis的运作机制。例如,查看如何配置Redis连接,如何定义Repository接口,以及如何在实际应用中使用这些接口。同时,了解不同数据结构在...

    spring-data-redis-demo.rar

    Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,...

    spring-data-redis-demo

    Spring-data-redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,...

    Spring-data-redis操作redis知识总结

    3. **序列化与反序列化策略**:Spring-data-redis提供了多种序列化策略,如`JdkSerializationRedisSerializer`用于序列化Java对象,`StringRedisSerializer`用于处理String类型,以及`JacksonJsonRedisSerializer`,...

    spring-data-redis-1.6.0.RELEASE.jar + jedis-2.7.2.jar包

    1. **依赖管理**:首先,你需要在你的构建系统(如Maven或Gradle)中添加Spring Data Redis和Jedis的依赖。在Maven中,这将涉及到在`pom.xml`文件中添加相应的`&lt;dependency&gt;`标签。 2. **配置**:接着,你需要配置...

    redis-spring-boot-starter.rar

    总结,`redis-spring-boot-starter`通过简化集成过程,使开发者能快速地在Spring Boot应用中使用Redis。通过深入了解其核心组件和配置,我们可以充分利用Redis的强大功能,提升应用性能,同时确保数据的稳定性和安全...

    spring-data-redis英文版

    Spring Data Redis允许用户利用Spring框架中的标准技术,如依赖注入、模板模式等,使得在Spring应用程序中使用Redis变得更加简单。 文档提到的Spring Data Redis版本1.8.0.M1是该框架的一个早期版本,其中包含了...

    spring data redis 官方文档

    - **简化集成**:Spring Data Redis 提供了与 Redis 的无缝集成,减少了开发人员在连接、配置和操作 Redis 过程中的复杂性。 - **统一的编程模型**:提供了一套统一的数据访问抽象层,使得开发者可以专注于业务逻辑...

    spring-redis-maven整合带安装包

    Spring Redis 是一个集成Redis数据库与Spring框架的模块,它提供了对Redis数据存储的全面支持,使得在Java应用中使用Redis变得更加便捷。这个"Maven整合工程"意味着该项目使用Maven作为构建工具,通过管理依赖关系来...

    redis使用过程中由于序列化工具引起的问题

    然而,在实际使用过程中,由于序列化工具的选择和配置不当,可能会引发一系列问题。这篇博客讨论的就是这类问题,特别是如何理解和解决由序列化工具导致的困扰。 在Redis中,当我们存储复杂的数据结构,如Java对象...

Global site tag (gtag.js) - Google Analytics