Redis是key-value存儲的非關(guān)系型數(shù)據(jù)庫。Spring Data Redis包含了多個模板實現(xiàn)赖欣,用來完成Redis數(shù)據(jù)庫的數(shù)據(jù)存取功能
1转绷、如何連接Redis?
Spring Data Redis提供了JedisConnectFactory連接工廠(不止這一個)
2笛钝、使用模板
Spring Data Redis提供了RedisTemplate 和 StringRedisTemplate模板。模板封裝了對redis操作低零,提供了較高級的數(shù)據(jù)訪問方案婆翔。從名字可以看出后者只關(guān)注字符串類型,當redis的key和value都是字符串時候建議使用StringRedisTemplate
RedisTemplate的很多功能以子API的形式提供掏婶,他們區(qū)分了單個值和集合值得場景啃奴。
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;
@Component
public class JedisUtil {
@Autowired
private RedisTemplate 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 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 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 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 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 keys=jedisUtil.getKeys("testhash");
System.out.println(keys);
}
@Test
public void muchOps() throws Exception{
BoundHashOperations 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 keys=boundHashOperations.keys();
System.out.println(keys);
}
}
以上測試方法,僅僅測試了每種redis數(shù)據(jù)類型的部分方法雄妥。注意最蕾,最后muchOps()測試方法,redisTemplate提供綁定key(此處為hash類型的key老厌,其它類型類似)的方式執(zhí)行操作瘟则,整個方法中僅僅一個地方使用了key,即jedisUtil.redisTemplate.boundHashOps("testhash")枝秤,對返回的boundValueOperations執(zhí)行的所有操作都會應(yīng)用到這個key上醋拧。
3、使用key和value的序列化器
當某個key-value條目保存到Redis存儲時候,key和value都會使用Redis序列化器進行序列化丹壕。Spring Date Redis 提供了多個序列化器:
1)JdkSerializationRedisSerializer:POJO對象的存取場景庆械,使用JDK本身序列化機制,將pojo類通過ObjectInputStream/ObjectOutputStream進行序列化操作菌赖,最終redis-server中將存儲字節(jié)序列缭乘。是目前最常用的序列化策略。
2)StringRedisSerializer:Key或者value為字符串的場景琉用,根據(jù)指定的charset對數(shù)據(jù)的字節(jié)序列編碼成string堕绩,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封裝。是最輕量級和高效的策略邑时。
3)JacksonJsonRedisSerializer:jackson-json工具提供了javabean與json之間的轉(zhuǎn)換能力奴紧,可以將pojo實例序列化成json格式存儲在redis中,也可以將json格式的數(shù)據(jù)轉(zhuǎn)換成pojo實例晶丘。因為jackson工具在序列化和反序列化時绰寞,需要明確指定Class類型,因此此策略封裝起來稍微復(fù)雜铣口。【需要jackson-mapper-asl工具支持】
4)OxmSerializer:提供了將javabean與xml之間的轉(zhuǎn)換能力觉壶,目前可用的三方支持包括jaxb脑题,apache-xmlbeans;redis存儲的數(shù)據(jù)將是xml工具铜靶。不過使用此策略叔遂,編程將會有些難度,而且效率最低争剿;不建議使用已艰。【需要spring-oxm模塊的支持
RedisTemplate中需要聲明4種serializer蚕苇,默認為“JdkSerializationRedisSerializer”:
a) keySerializer :對于普通K-V操作時哩掺,key采取的序列化策略
b) valueSerializer:value采取的序列化策略
c) hashKeySerializer: 在hash數(shù)據(jù)結(jié)構(gòu)中,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 {
public StringRedisTemplate() {
RedisSerializer 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);
}
}