Spring-data-redis: serializer实例
spring-data-redis提供了多种serializer策略,这对使用jedis的开发者而言,实在是非常便捷。sdr提供了4种内置的serializer:
- JdkSerializationRedisSerializer:使用JDK的序列化手段(serializable接口,ObjectInputStrean,ObjectOutputStream),数据以字节流存储
- StringRedisSerializer:字符串编码,数据以string存储
- JacksonJsonRedisSerializer:json格式存储
- OxmSerializer:xml格式存储
其中JdkSerializationRedisSerializer和StringRedisSerializer是最基础的序列化策略,其中“JacksonJsonRedisSerializer”与“OxmSerializer”都是基于stirng存储,因此它们是较为“高级”的序列化(最终还是使用string解析以及构建java对象)。
RedisTemplate中需要声明4种serializer,默认为“JdkSerializationRedisSerializer”:
1) keySerializer :对于普通K-V操作时,key采取的序列化策略
2) valueSerializer:value采取的序列化策略
3) hashKeySerializer: 在hash数据结构中,hash-key的序列化策略
4) hashValueSerializer:hash-value的序列化策略
无论如何,建议key/hashKey采用StringRedisSerializer。
接下来,通过实例描述如何使用它们,可以首先参考“spring-data-redis特性”:
一. JdkSerializationRedisSerializer/StringRedisSerializer
1) spring配置文件
- <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
- <property name="connectionFactory" ref="jedisConnectionFactory"></property>
- <property name="keySerializer">
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
- </property>
- <property name="hashKeySerializer">
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
- </property>
- <property name="valueSerializer">
- <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
- </property>
- <property name="hashValueSerializer">
- <bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/>
- </property>
- </bean>
2) 程序实例:
- ValueOperations<String, User> valueOper = redisTemplate.opsForValue();
- User user = new User("zhangsan",12);
- valueOper.set("user:1", user);
- System.out.println(valueOper.get("user:1").getName());
其中User为pojo类,且需要实现Serializable接口。
二.sdr与json
1) spring配置:
- <bean id="jsonSerializer" class="com.sample.redis.sdr.JsonRedisSerializer"/>
- <bean id="jedisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
- <property name="connectionFactory" ref="jedisConnectionFactory"></property>
- <property name="defaultSerializer">
- <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
- </property>
- </bean>
并没有在配置文件中,使用JacksonJsonRedisSerializer,因为这样实在是麻烦而且不灵活(主要是jackson需要ClassType)。我们将在java代码进行转换,因为通过java代码,使用jackson工具将json字符串转换成javabean是非常简单的。
2) 程序实例:
- /**
- * 不使用sdr自带的json序列化工具,一切操作基于string
- **/
- public class JsonRedisSeriaziler{
- public static final String EMPTY_JSON = "{}";
- public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
- protected ObjectMapper objectMapper = new ObjectMapper();
- public JsonRedisSeriaziler(){}
- /**
- * java-object as json-string
- * @param object
- * @return
- */
- public String seriazileAsString(Object object){
- if (object== null) {
- return EMPTY_JSON;
- }
- try {
- return this.objectMapper.writeValueAsString(object);
- } catch (Exception ex) {
- throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);
- }
- }
- /**
- * json-string to java-object
- * @param str
- * @return
- */
- public <T> T deserializeAsObject(String str,Class<T> clazz){
- if(str == null || clazz == null){
- return null;
- }
- try{
- return this.objectMapper.readValue(str, clazz);
- }catch (Exception ex) {
- throw new SerializationException("Could not write JSON: " + ex.getMessage(), ex);
- }
- }
- }
- public class RedisClientTest {
- private JsonRedisSeriaziler seriaziler;
- private RedisTemplate redisTemplate;
- public void setSeriaziler(JsonRedisSeriaziler seriaziler) {
- this.seriaziler = seriaziler;
- }
- public void setRedisTemplate(RedisTemplate redisTemplate) {
- this.redisTemplate = redisTemplate;
- }
- public void insertUser(User user){
- ValueOperations<String, String> operations = redisTemplate.opsForValue();
- operations.set("user:" + user.getName(), seriaziler.seriazileAsString(user));
- }
- public User getUser(String name){
- ValueOperations<String, String> operations = redisTemplate.opsForValue();
- String json = operations.get("user:" + name);
- return seriaziler.deserializeAsObject(json, User.class);
- }
- }
三.sdr与xml
实施办法可以参见本文“sdr与json”,同时参考spring-oxm相关文档。
Spring-data-redis: serializer实例的更多相关文章
- Spring Data Redis简介以及项目Demo,RedisTemplate和 Serializer详解
一.概念简介: Redis: Redis是一款开源的Key-Value数据库,运行在内存中,由ANSI C编写,详细的信息在Redis官网上面有,因为我自己通过google等各种渠道去学习Redis, ...
- spring mvc Spring Data Redis RedisTemplate [转]
http://maven.springframework.org/release/org/springframework/data/spring-data-redis/(spring-data包下载) ...
- spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- Spring Data Redis 详解及实战一文搞定
SDR - Spring Data Redis的简称. Spring Data Redis提供了从Spring应用程序轻松配置和访问Redis的功能.它提供了与商店互动的低级别和高级别抽象,使用户免受 ...
- Spring Data Redis学习
本文是从为知笔记上复制过来的,懒得调整格式了,为知笔记版本是带格式的,内容也比这里全.点这里 为知笔记版本 Spring Data Redis 学习 Version 1.8.4.Release 前言 ...
- Redis(八):spring data redis 理解
前言 Spring Data Redis project,应用了Spring概念来开发使用键值形式的数据存储的解决方案.我们(官方)提供了一个 "template" ,这是一个高级 ...
- Redis与Spring Data Redis
1.Redis概述 1.1介绍 官网:https://redis.io/ Redis是一个开源的使用ANSIC语言编写.支持网络.可基于内存 亦可持久化的日志型.Key-Value型的高性能数据库. ...
- Spring Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- Spring Data Redis—Pub/Sub(附Web项目源码) (转)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- org.springframework.data.redis.serializer.SerializationException: Cannot serialize;
前言 本文中提到的解决方案,源码地址在:perfect-ssm,希望可以帮你解决问题. 问题描述 在Spring与Redis整合过程中,出现了如下报错: org.springframework.dat ...
随机推荐
- docker remote api 的安全隐患
开启docker的api,首先要知道docker的守护进程daemon,在下认为daemon作为Client和service连接的一个桥梁,负责代替将client的请求传递给service端. 默认情 ...
- 20165234 2017-2018-2《Java程序设计》课程总结
2017-2018-2<Java程序设计>课程总结 一.作业链接汇总 每周作业链接 预备作业一:我期望的师生关系 预备作业二:学习基础和C语言基础调查 预备作业三:Linux安装及学习 第 ...
- auto 和 decltype
一, auto 1, auto的作用 一般来说, 在把一个表达式或者函数的返回值赋给一个对象的时候, 我们必须要知道这个表达式的返回类型, 但是有的时候我们很难或者无法知道这个表达式或者函数的 ...
- CF1105E Helping Hiasat
题目地址:CF1105E Helping Hiasat 首先将问题转化成图论:对每个人建立一个点,将同一次修改后的所有人代表的点两两连一条边,那么最终所求的就是这个图的最大独立集 我们知道最大独立集是 ...
- qemu中使用9p,支持host和guest中共享目录【转】
转自:https://blog.csdn.net/ayu_ag/article/details/52956351 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...
- centos6.8上PHP5.3升级到PHP5.4及更高版本方法
执行命令下载.安装yum源,当前是针对Centos6并且64位版本的源: [root@T_249 yum.repos.d]# rpm -ivh http://dl.fedoraproject.org/ ...
- 范数(norm) 几种范数的简单介绍
原文地址:https://blog.csdn.net/a493823882/article/details/80569888 我们知道距离的定义是一个宽泛的概念,只要满足非负.自反.三角不等式就可以称 ...
- 增加一台web机注意事项
2017年4月18日 15:23:57 星期二 增加一台web机时, 先不要挂载进lb 1. 需要将此机器的ip加入到其它服务的白名单内: 数据库, 缓存, 第三方接口等 2. 绑定hosts, 点点 ...
- CF 2B The least round way DP+Math
题意: 找出一条路, 使每个节点相乘,得到的数末尾 0 最少 每次移动只能向右或者向下, 找到后打印路径 ///按照题目要求,就是找出一条从左上角到右下角中每个数含2 or 5 最少的路 ///可以用 ...
- UVA 1395 MST
给你一个图, 求一个生成树, 边权Max – Min 要最小,输出最小值, 不能构成生成树的 输出 -1: 思路: Keuksal 算法, 先排序边, 然后枚举 第一条边, 往后加入边, 直到有 n- ...