`
QING____
  • 浏览: 2250668 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 1.7.6

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

    Spring mvc整合redis实例(redis连接池)

    &lt;bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /&gt; ``` 现在我们已经配置好了基础的Redis连接,接下来是实现业务逻辑。在Spring MVC的控制器中,可以注入`...

    spring-redis jar

    2. **创建RedisTemplate实例**:`RedisTemplate`是Spring Data Redis提供的核心模板类,用于执行Redis的各种操作。我们需要配置一个`RedisTemplate` bean,并指定`RedisConnectionFactory`: ```xml ...

    spring-boot-redis-lock:实现reids分布式锁定

    &lt;artifactId&gt;spring-boot-starter-data-redis ``` 接着,配置 Redis 连接信息。在 `application.yml` 或 `application.properties` 文件中添加以下配置: ```yaml spring: redis: host: localhost port: 6379...

    搭建springboot与redis集群关联操作.doc

    import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.io.Serializable; @...

    Spring整合Redis完整实例代码

    &lt;bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" /&gt; &lt;!-- StringRedisTemplate 配置 --&gt; &lt;bean id="stringRedisTemplate" class="org.springframework.data....

    springboot-redis:redis操作

    一旦配置完成,Spring Boot会自动创建RedisTemplate和StringRedisTemplate实例,它们是操作Redis的主要工具。你可以通过@Autowired注解注入到你需要的类中,例如: ```java @Autowired private RedisTemplate, ...

    redis和spring整合,redis集群

    1. **引入依赖**: 首先,你需要在项目中添加 Redis 和 Spring Data Redis 相关的依赖。如果是 Maven 项目,可以在 `pom.xml` 文件中添加以下依赖: ```xml &lt;groupId&gt;org.springframework.boot &lt;artifactId&gt;...

    SpringMVCRedis

    &lt;bean class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/&gt; ``` (4) 在SpringMVC Controller中注入RedisTemplate,实现数据操作。 ```java @Autowired private ...

    spring整合redis小demo

    &lt;artifactId&gt;spring-boot-starter-data-redis ``` 接下来,配置Redis连接。在Spring Boot项目中,通常通过application.yml或application.properties文件来配置: ```yaml spring: redis: host: localhost ...

    spring 集成 redis 使用例子

    Spring提供了`spring-data-redis`模块,使得与Redis的交互变得简单。通过使用Spring Data Redis,开发者可以利用注解驱动的方法来操作Redis数据库。 在项目结构中,`com.kevin.server`包可能包含了我们的核心业务...

    SpringRedis整合源码

    &lt;bean class="org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer"&gt; &lt;constructor-arg&gt; &lt;value type="java.lang.Class"&gt;com.example.YourDomainClass&lt;/value&gt; &lt;/constructor-arg&gt; ```...

    Redis+Spring.zip

    Spring Data Redis项目提供了一套完整的Redis集成方案。在Maven工程中,可以在pom.xml文件中引入以下依赖: ```xml &lt;groupId&gt;org.springframework.data &lt;artifactId&gt;spring-data-redis &lt;version&gt;2.5.x.RELEASE ...

    java-redis jar

    1. **RedisTemplate**:Spring Data Redis提供的核心模板类,它封装了对Redis的操作,如字符串、哈希、列表、集合、有序集合等数据类型的CRUD操作。使用`@Autowired`注解可以将其注入到需要使用Redis的类中。 2. **...

    Spring整合Redis代码

    在Spring中,我们通常会使用`RedisTemplate`来操作Redis,通过@Bean注解实例化: ```java @Configuration public class RedisConfig { @Bean public RedisConnectionFactory redisConnectionFactory() { ...

    Spring Boot中Redis数据库的使用实例

    Spring Data Redis 提供了丰富的 API 来操作 Redis 数据结构,如字符串(String)、哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)。 总结来说,Spring Boot 结合 Redis 提供了一种高效、便捷的...

    SpringBoot使用Redis缓存的实现方法

    import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import ...

    征服 Redis + Jedis + Spring (三)—— 列表操作

    Jedis 是 Java 开发者常用的 Redis 客户端库,而 Spring Data Redis 是 Spring 框架的一部分,它提供了与 Redis 集成的高级抽象。在“征服 Redis + Jedis + Spring (三)—— 列表操作”这一主题中,我们将深入探讨...

    redis 增删(obj,list)

    在Spring框架中整合Redis,我们可以使用Spring Data Redis模块,它提供了一套丰富的RedisTemplate和StringRedisTemplate接口,简化了与Redis的交互。例如,对于对象的存储,我们可以创建一个实体类,通过注解`@Redis...

Global site tag (gtag.js) - Google Analytics