专栏首页代码人生Redis系列(6)——RedisTemplate操作模板

Redis系列(6)——RedisTemplate操作模板

转载地址: http://blog.csdn.net/hotdust/article/details/51832926

RedisTemplate是spring-data-redis中用于操作redis的操作模版、可以对redis进行序列化操作,由于redis存储的本质是数组,而操作模板就是把对象、json这些对象序列化成string存储到redis、也可以把序列化的对象、json字符串反序列化成java对象、json对象。

spring-data-redis的序列化类有下面这几个:

l GenericToStringSerializer: 可以将任何对象泛化为字符串并序列化

l Jackson2JsonRedisSerializer: 跟JacksonJsonRedisSerializer实际上是一样的

l JacksonJsonRedisSerializer: 序列化object对象为json字符串

l JdkSerializationRedisSerializer: 序列化java对象

l StringRedisSerializer: 简单的字符串序列化

1.用JdkSerializationRedisSerializer序列化

用JdkSerializationRedisSerializer序列化的话,被序列化的对象必须实现Serializable接口。

在存储内容时,除了属性的内容外还存了其它内容在里面,总长度长,且不容易阅读。

对于最下面的代码,存到redis里的内容如下:

redis127.0.0.1:6379> get users/user1
"\xac\xed\x00\x05sr\x00!com.oreilly.springdata.redis.User\xb1\x1c\n\xcd\xed%\xd8\x02\x00\x02I\x00\x03ageL\x00\buserNamet\x00\x12Ljava/lang/String;xp\x00\x00\x00\x14t\x00\x05user1"

2.用JacksonJsonRedisSerializer序列化

如果需要保存对象为json的话推荐使用JacksonJsonRedisSerializer,它不仅可以将对象序列化,还可以将对象转换为json字符串并保存到redis中,但需要和jackson配合一起使用。

用JacksonJsonRedisSerializer序列化的话,被序列化的对象不用实现Serializable接口。

Jackson是利用反射和getter和setter方法进行读取的,如果不想因为getter和setter方法来影响存储,就要使用注解来定义被序列化的对象。

Jackson序列化的结果清晰,容易阅读,而且存储字节少,速度快,推荐。

对于最下面的代码,存到redis里的内容如下:

redis127.0.0.1:6379> get json/user1
"{\"userName\":\"user1\",\"age\":20}"
redis127.0.0.1:6379> strlen json/user1
(integer) 29

3.用StringRedisSerializer序列化

一般如果key-value都是string的话,使用StringRedisSerializer就可以了

代码:

@Test
public voidtestJacksonSerialiable()
{   
    RedisTemplate<String, Object> redis =new RedisTemplate<String, Object>();   
   redis.setConnectionFactory(connectionFactory);   
   redis.setKeySerializer(ApplicationConfig.StringSerializer.INSTANCE);   
    redis.setValueSerializer(newJacksonJsonRedisSerializer<User>(User.class));   
    redis.afterPropertiesSet();   
   
   
    ValueOperations<String, Object> ops =redis.opsForValue();   
    User user1 = new User();   
    user1.setUserName("user1");   
    user1.setAge(20);   
    User user11 = null;   
    String key1 = "json/user1";   
    long begin =System.currentTimeMillis();   
    for (int i = 0; i < 100; i++) {       
        ops.set(key1,user1);       
        user11 = (User)ops.get(key1);   
    }   
    long time = System.currentTimeMillis() -begin;    System.out.println("jsontime:"+time);   
   assertThat(user11.getUserName(),is("user1"));
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于Spring Data redis几种对象序列化的比较

    http://zhaozhiming.github.io/blog/2015/04/12/spring-data-redis/

    逝兮诚
  • 蓝桥杯 java 01字串

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • unicode字符串解析

    在http接口接收时,很多接口提供方都喜欢把汉字通过unicode的方式传过来,而数字和字母保持不变,就像这样。

    逝兮诚
  • 逆向分析Spotify.app并hook其功能获取数据

    在开始本文的正式内容之前我想先来吐槽下。大多数的软件开发人员可能都有着这样一个烦恼,就是由于工作和其他责任,不得不搁置自己的一些个人项目甚至是最终完全的遗忘和埋...

    FB客服
  • 最简教程!写个UC浏览器

    文章转载自 https://juejin.im/post/5a212638f265da431523b663 项目github地址: https://github...

    企鹅号小编
  • 曲线折叠

    万木逢春
  • Linux O(1)调度器

    O(n)调度器采用一个runqueue运行队列来管理所有可运行的进程,在主调度schedule函数中会选择一个优先级最高,也就是时间片最大的进程来运行,同时也会...

    DragonKingZhu
  • RTOS内功修炼记(二)—— 优先级抢占式调度到底是怎么回事?

    本文从任务如何切换开始讲起,引出RTOS内核中的就绪列表、优先级表,一层一层为你揭开RTOS内核优先级抢占式调度方法的神秘面纱,只有对内核的深入了解,才能创造出...

    Mculover666
  • ORA-00932: inconsistent datatypes: expected - got CLOB

          最近数据库从10.2.0.3升级到了10.2.0.5之后,一些对象无法编译通过。查看了这些对象主要表现在之前写法不严格的SQL语法导致了这些pack...

    Leshami
  • 腾讯云存储最佳实践系列一:使用对象存储COS托管静态网站

    在此实践中,用户可以在腾讯云对象存储(以下简称 COS)上托管静态网站,访客可以通过自定义域名(例如 www.example.com )访问托管的静态网站。无论...

    云加社区

扫码关注云+社区

领取腾讯云代金券