美文网首页程序员
带你进spring-集成redis

带你进spring-集成redis

作者: fad2aa506f5e | 来源:发表于2018-09-06 20:50 被阅读0次

Redis是key-value存储的非关系型数据库。Spring Data Redis包含了多个模板实现,用来完成Redis数据库的数据存取功能

1、如何连接Redis?

Spring Data Redis提供了JedisConnectFactory连接工厂(不止这一个)

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;

@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数据类型的部分方法。注意,最后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 {

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);

}

}

相关文章

网友评论

    本文标题:带你进spring-集成redis

    本文链接:https://www.haomeiwen.com/subject/ccdfgftx.html