Redis系列--7、RedisTemplate和 Serializer详解

<bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
   <property name="connectionFactory" ref="connectionFactory" />
      <!--如果不配置Serializer,那么存储的时候智能使用String,如果用User类型存储,那么会提示错误User can‘t cast to String!!!  -->       
   <property name="keySerializer">
      <bean
        class="org.springframework.data.redis.serializer.StringRedisSerializer" />
   </property>
   <property name="valueSerializer">
      <bean
        class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />
   </property>
</bean>

可以看到我在代码中注释掉了一段代码,现在可以解释上面留下的两个问题了,第一个是在redis.xml中配置redistemplate的时候,同时配置了两个Serializer:keySerializer实现了StringRedisSerializer,valueSerializer实现了JdkSerializationRedisSerializer。

  一、为什么要使用Serializer

  因为redis是以key-value的形式将数据存在内存中,key就是简单的string,key似乎没有长度限制,不过原则上应该尽可能的短小且可读性强,无论是否基于持久存储,key在服务的整个生命周期中都会在内存中,因此减小key的尺寸可以有效的节约内存,同时也能优化key检索的效率。

  value在redis中,存储层面仍然基于string,在逻辑层面,可以是string/set/list/map,不过redis为了性能考虑,使用不同的“encoding”数据结构类型来表示它们。(例如:linkedlist,ziplist等)。

  所以可以理解为,其实redis在存储数据时,都把数据转化成了byte[]数组的形式,那么在存取数据时,需要将数据格式进行转化,那么就要用到序列化和反序列化了,这也就是为什么需要配置Serializer的原因。

  二、SDR支持的序列化策略:

(详细可查阅API文档)

  • JdkSerializationRedisSerializer:
  • StringRedisSerializer:
  • JacksonJsonRedisSerializer:
  • OxmSerializer:

  其中JdkSerializationRedisSerializer和StringRedisSerializer是最基础的序列化策略,其中“JacksonJsonRedisSerializer”与“OxmSerializer”都是基于stirng存储,因此它们是较为“高级”的序列化(最终还是使用string解析以及构建java对象)。

  基本推荐使用JdkSerializationRedisSerializer和StringRedisSerializer,因为其他两个序列化策略使用起来配置很麻烦,如果实在有需要序列化成Json和XML格式,可以使用java代码将String转化成相应的Json和XML。

  三、使用Serializer

  在本项目中,是在配置文件中直接配置了相应的Serializer,key用的是StringRedisSerializer,value用的是JdkSerializationRedisSerializer,因为在此项目中,key为userId,为String类型,value为user为java类,即POJO,所以使用JdkSerializationRedisSerializer。

  在redistemplate中直接配置Serializer当然比较方便,因为在后面想redis中存取数据时,就不用再次配置Serializer,但是这仅限于只有一种数据类型的情况,比如在本项目中只有<String userId,User user>类型的数据需要存储,如果有多种数据类型时,在配置文件中配置就显得不方便了,那么我们可以在存取数据时,即Service的实现类存取数据操作时分别指定相应的Serializer。

所以在编程时有两种选择:

1.在redistemplate中配置Serializer(本项目即采用这种方式)

ValueOperations<String, User> valueops = redisTemplate.opsForValue();
valueops.set(user.getId(), user);

2.不在redistemplate中配置Serializer,而是在Service的实现类中单独指定Serializer。就如同UserOperationsServiceImpl.java注释的代码:

boolean result = redisTemplate.execute(new RedisCallback<Boolean>() {
      public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException {
          RedisSerializer<String> redisSerializer = redisTemplate .getStringSerializer();
         byte[] key = redisSerializer.serialize(user.getId());
          byte[] value = redisSerializer.serialize(user.getName());
          return redisConnection.setNX(key, value); } });
     return result;
 }
时间: 2024-10-10 10:02:30

Redis系列--7、RedisTemplate和 Serializer详解的相关文章

Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解

一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis,走了不少弯路,所以总结一条我认为不错的学习路径给大家: 1.<The Little Redis Book> 是一本开源PDF,只有29页的英文文档,看完后对Redis的基本概念应该差不多熟悉了,剩下的可以去Redis官网熟悉相关的命令. 2.<Redis设计与实现> 如果想继续深入,推

高并发架构系列:Redis并发竞争key的解决方案详解

需求由来 1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争. 这里的并发指的是多个redis的client同时set key引起的并发问题. 2.出现并发设置Key的原因 Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘.由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端

深入浅出Mybatis系列(四)---配置详解之typeAliases别名(mybatis源码篇)[转]

上篇文章<深入浅出Mybatis系列(三)---配置详解之properties与environments(mybatis源码篇)> 介绍了properties与environments, 本篇继续讲剩下的配置节点之一:typeAliases. typeAliases节点主要用来设置别名,其实这是挺好用的一个功能, 通过配置别名,我们不用再指定完整的包名,并且还能取别名. 例如: 我们在使用 com.demo.entity. UserEntity 的时候,我们可以直接配置一个别名user, 这样

&quot;MindManager&quot;学习iOS系列之&quot;CAAnimation-核心动画&quot;详解,让你的应用“动”起来。

"MindManager"学习iOS系列之"CAAnimation-核心动画"详解,思维导图内展示了CAAnimation-核心动画的大多数基本功能和知识,每个part都有代码讲解,展示出CAAnimation-核心动画的清晰轮廓,编者提供了"JPG"."SWF"."PDF"."Word"."Mmap"格式的源文件供给使用.注意:JPG格式仅为图片总览,SWF格式使用

构建安全的Xml Web Service系列之wse之错误代码详解

原文:构建安全的Xml Web Service系列之wse之错误代码详解 WSE3.0现在还没有中文版的可以下载,使用英文版的过程中,难免会遇到各种各样的错误,而面对一堆毫无头绪的错误异常,常常会感到迷茫和无助,我起初就觉得这个框架使用起来真的很难用,有时候一些莫名其妙的错误会困扰我半天或者几天的时间,而一些英文的解释理解起来似是而非,很难一针见血的获得哪里出了问题,我将用几篇文章将wse所涉及到的错误代码和错误消息翻译成中文,并且根据个人的一点经验,提出引发错误的原因,并总结出解决建议,不是很

Redis for Windows(C#缓存)配置文件详解

Redis for Windows(C#缓存)配置文件详解 前言 在上一篇文章中主要介绍了Redis在Windows平台下的下载安装和简单使用http://www.cnblogs.com/aehyok/p/3478282.html.当然我也在上一篇中指定过配置文件,并且修改其中的端口port.本文将主要来探讨redis强大的配置文件. 我现在使用的redis版本为2.6.首先奉上配置文件的源文件. # Redis configuration file example # Note on unit

##redis在linux上的安装详解

redis在linux上的安装详解 1.redis介绍 (1)Redis是Remote Dictionary Server(远程数据服务)的缩写,由意大利人antirez(Salvatore Sanfilippo)开发的一款内存高速缓存数据库. (2)该软件由C语言编写,它的数据模型为key-value. (3)它支持存储的calue类型很多,包括String(字符串).hash(哈希).list(链表).set(集合).Zset(有序集合). (4)为了保证效率数据都是缓存在内存中,它也可以周

高并发架构系列:Redis缓存和MySQL数据一致性方案详解

一.需求起因在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库.这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作.读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题. 不管是先写MySQL数据库,再删除Redis缓存:还是先删除缓存,再写库,都有可能出现数

Spartan6系列之芯片配置模式详解

1.   配置概述 Spartan6系列FPGA通过把应用程序数据导入芯片内部存储器完成芯片的配置.Spart-6 FPGA可以自己从外部非易失性存储器导入编程数据,或者通过外界的微处理器.DSP等对其进行编程.对以上任何一种情况,都有串行配置和并行配置之分,串行配置可以减少芯片对引脚的要求,并行配置对8bit/16bit Flash或者微处理器来说更合适. 因为Xilinx的FPGA器件的配置数据存储在CMOS 配置锁存器内(CCL),因此Spartan6 FPGA器件上电后必须重新配置.Sp