標籤:還原序列化 puts util key path ack factory OLE pack
Redis是key-value儲存的非關係型資料庫。Spring Data Redis包含了多個模板實現,用來完成Redis資料庫的資料存取功能
1、如何串連Redis?
Spring Data Redis提供了JedisConnectFactory串連工廠(不止這一個)
<bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="192.168.1.106"></property></bean>
2、使用模板
Spring Data Redis提供了RedisTemplate 和 StringRedisTemplate模板。模板封裝了對redis操作,提供了較進階的資料訪問方案。從名字可以看出後者只關注字串類型,當redis的key和value都是字串時候建議使用StringRedisTemplate
RedisTemplate的很多功能以子API的形式提供,他們區分了單個值和集合值得情境。
package com.cn.util;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import java.util.List;import java.util.Set;@Componentpublic class JedisUtil { @Autowired private RedisTemplate<String, Object> redisTemplate; //字串 public void setStr(String key, Object value){ redisTemplate.opsForValue().set(key, value); } public Object getStr(String key){ return redisTemplate.opsForValue().get(key); } //list集合 public void lpush(String key, Object value){ redisTemplate.opsForList().leftPush(key, value); } public Object lpop(String key){ return redisTemplate.opsForList().leftPop(key); } public List<Object> lrange(String key, long start , long end){ return redisTemplate.opsForList().range(key, start, end); } //set集合 public void addSet(String key, String value){ redisTemplate.opsForSet().add(key, value); } public Set<Object> getSet(String key){ return redisTemplate.opsForSet().members(key); } //hash集合 public void hset(String key, String key1, String value){ redisTemplate.opsForHash().put(key, key1, value); } public Object hget(String key, String key1){ return redisTemplate.opsForHash().get(key, key1); } public Set<Object> getKeys(String key){ return redisTemplate.opsForHash().keys(key); }}
測試類別
@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:springMvc.xml", "classpath:spring-source.xml"})public class JedisUtilTest { @Autowired private JedisUtil jedisUtil; @Test public void setStr() throws Exception { jedisUtil.setStr("shoudu","beijing"); } @Test public void getStr() throws Exception { Object obj=jedisUtil.getStr("shoudu"); System.out.println(obj); } @Test public void lpush() throws Exception { jedisUtil.lpush("testlist",new User("ii","ll")); } @Test public void lpop() throws Exception { Object obj= jedisUtil.lpop("testlist"); System.out.println(obj); } @Test public void lrange() throws Exception { List<Object> list=jedisUtil.lrange("testlist", 0 , -1); System.out.println(list); } @Test public void addSet() throws Exception { jedisUtil.addSet("testset", "jj2"); } @Test public void getSet() throws Exception { Object obj = jedisUtil.getSet("testset"); System.out.println(obj); } @Test public void hset() throws Exception { jedisUtil.hset("testhash", "name", "liming"); } @Test public void hget() throws Exception { Object obj=jedisUtil.hget("testhash","name"); System.out.println(obj); } @Test public void getKeys() throws Exception { Set<Object> keys=jedisUtil.getKeys("testhash"); System.out.println(keys); } @Test public void muchOps() throws Exception{ BoundHashOperations<String, String, Object> boundHashOperations= jedisUtil.redisTemplate.boundHashOps("testhash"); String str=boundHashOperations.getKey(); System.out.println(str); Object obj=boundHashOperations.get("name"); System.out.println(obj); boundValueOperations.put("age",123); boundValueOperations.put("school","beida"); Set<String> keys=boundHashOperations.keys(); System.out.println(keys); }}
以上測試方法,僅僅測試了每種redis資料類型的部分方法。注意,最後muchOps()測試方法,redisTemplate提供綁定key(此處為hash類型的key,其它類型類似)的方式執行操作,整個方法中僅僅一個地方使用了key,即jedisUtil.redisTemplate.boundHashOps("testhash"),對返回的boundValueOperations執行的所有操作都會應用到這個key上。
3、使用key和value的序列化器
當某個key-value條目儲存到Redis儲存時候,key和value都會使用Redis序列化器進行序列化。Spring Date Redis 提供了多個序列化器:
1)JdkSerializationRedisSerializer:POJO對象的存取情境,使用JDK本身序列化機制,將pojo類通過ObjectInputStream/ObjectOutputStream進行序列化操作,最終redis-server中將儲存位元組序列。是目前最常用的序列化策略。
2)StringRedisSerializer:Key或者value為字串的情境,根據指定的charset對資料的位元組序列編碼成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封裝。是最輕量級和高效的策略。
3)JacksonJsonRedisSerializer:jackson-json工具提供了javabean與json之間的轉換能力,可以將pojo執行個體序列化成json格式儲存在redis中,也可以將json格式的資料轉換成pojo執行個體。因為jackson工具在序列化和還原序列化時,需要明確指定Class類型,因此此策略封裝起來稍微複雜。【需要jackson-mapper-asl工具支援】
4)OxmSerializer:提供了將javabean與xml之間的轉換能力,目前可用的三方支援包括jaxb,apache-xmlbeans;redis儲存的資料將是xml工具。不過使用此策略,編程將會有些難度,而且效率最低;不建議使用。【需要spring-oxm模組的支援
- RedisTemplate中需要聲明4種serializer,預設為“JdkSerializationRedisSerializer”:
a) keySerializer :對於普通K-V操作時,key採取的序列化策略
b) valueSerializer:value採取的序列化策略
c) hashKeySerializer: 在hash資料結構中,hash-key的序列化策略
d) hashValueSerializer:hash-value的序列化策略
- StringRedisTemplate也需要申明4中serializer,但是預設為“StringRedisSerializer”,可以看StringRedisTemplate類的源碼:
package org.springframework.data.redis.core;import org.springframework.data.redis.connection.DefaultStringRedisConnection;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.serializer.RedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;public class StringRedisTemplate extends RedisTemplate<String, String> { public StringRedisTemplate() { RedisSerializer<String> stringSerializer = new StringRedisSerializer(); //StringRedisSerializer序列器 this.setKeySerializer(stringSerializer); this.setValueSerializer(stringSerializer); this.setHashKeySerializer(stringSerializer); this.setHashValueSerializer(stringSerializer); } public StringRedisTemplate(RedisConnectionFactory connectionFactory) { this(); this.setConnectionFactory(connectionFactory); this.afterPropertiesSet(); } protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) { return new DefaultStringRedisConnection(connection); }}
spring-整合redis