spring-data-redis介绍+ 源码解析 +简单配置

一. 简介

Spring Data Redis是spring基于Redis做的一些模块化功能,是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化,支持发布订阅,并对spring 3.1 cache进行了实现。

二. 概念

首先须要了解几个具体类的概念:

RedisConnection:

提供了Redis通信的核心构建块,因为它处理与Redis后端通信。它还自动将底层连接库异常转换为Spring一致的DAO异常层次结构,这样您就可以在不更改任何代码的情况下切换连接器,因为操作语义保持不变。(翻译自官网解释,其实简单理解下,就是用来连接Redis的)

RedisConnectionFactory:

是构建RedisConnection的工厂类

RedisStandaloneConfiguration:

Redis标准配置,用来构建RedisConnectionFactory须要的必要参数,比如host;port;password

RedisSentinelConfiguration:

Redis哨兵模式的相关配置

RedisClusterConfiguration:

Redis集群模式的相关配置

RedisCacheManager:

顾名思义是Redis缓存管理器,是Spring基于Redis实现缓存的核心类

RedisCacheConfiguration:
是RedisCacheManager的具体个性化配置项
RedisCacheManagerBuilder:

是RedisCacheManager的构建器,内部维护了RedisConnectionFactory

RedisTemplate:

同样底层是维护了RedisConnectionFactory,在Spring Data Redis中和RedisCacheManager属于不同的Redis应用模块,RedisCacheManager负责Redis数据缓存的核心实现,RedisTemplate是Spring为方便操作Redis各种命令而封装出来的工具类,其功能类似于jedis。

三. spring-data-redis针对jedis提供了如下功能:

1.连接池自动管理,提供了一个高度封装的“RedisTemplate”类
2.针对jedis客户端中大量api进行了归类封装,将同一类型操作封装为operation接口

  • ValueOperations:简单K-V操作

  • SetOperations:set类型数据操作

  • ZSetOperations:zset类型数据操作

  • HashOperations:针对map类型的数据操作

  • ListOperations:针对list类型的数据操作
    3.提供了对key的“bound”(绑定)便捷化操作API,可以通过bound封装指定的key,然后进行一系列的操作而无须“显式”的再次指定Key,即BoundKeyOperations:

  • BoundValueOperations

  • BoundSetOperations

  • BoundListOperations

  • BoundSetOperations
    | | |
    |–|--|
    | | |

  • BoundHashOperations
    4.将事务操作封装,有容器控制。
    5.针对数据的“序列化/反序列化”,提供了多种可选择策略(RedisSerializer)

四. 序列化器

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。

五. @Transactional注解支持

Spring Data Redis提供了对Redis的事务支持,如:multi, exec, discard命令。

注解事务支持在默认情况下是禁用的,必须通过把RedisTemplate设置明确开启事务支持:setEnableTransactionSupport(true),如果没有错误即成功,有错误就全部回滚。当前连接所有写操作都会进入操作队列,读操作会转移到一个新的连接。

示例配置

@Configuration
public class RedisTxContextConfiguration {
  @Bean
  public StringRedisTemplate redisTemplate() {
    StringRedisTemplate template = new StringRedisTemplate(redisConnectionFactory());
    // explicitly enable transaction support
    template.setEnableTransactionSupport(true);
    return template;
  }

  @Bean
  public PlatformTransactionManager transactionManager() throws SQLException {
    return new DataSourceTransactionManager(dataSource());
  }

  @Bean
  public RedisConnectionFactory redisConnectionFactory( // jedis || lettuce);

  @Bean
  public DataSource dataSource() throws SQLException { // ... }
}

使用约束

// 绑定到当前线程上的连接
template.opsForValue().set("foo", "bar");

// 读操作不参与事务
connection template.keys("*");

// 当在事务中设置的值不可见时返回null
template.opsForValue().get("foo");

六. 简单配置

1.添加jar包支持,使用springboot自带的redis启动器

     <!-- Spring Data Redis启动器 -->
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-data-redis</artifactId>
  	</dependency>
<!-- test启动器 -->
  	<dependency>
  		<groupId>org.springframework.boot</groupId>
  		<artifactId>spring-boot-starter-test</artifactId>
  	</dependency>

2.Redis配置文件

spring.redis.pool.max-idle=10
spring.redis.pool.min-idle=5
spring.redis.pool.max-total=20

spring.redis.hostName=192.168.122.137
spring.redis.port=6379

3.然后修改配置类添加@ConfigurationProperties注解,注解中有个prefix属性,这个属性的作用就是将配置文件中前缀相同的内容创建一个实体

/**
 * 完成对Redis整合的配置
 * @author 机械革命
 *
 */
@Configuration
public class RedisConfig {

	/**
	 * 1.创建JedisPoolConfig对象,在该对象中完成一些连接池配置
	 * @ConfigurationProperties(prefix="spring.redis.pool")可以将配置文件中前缀相同的内容创建一个实体
	 */
	@Bean
	@ConfigurationProperties(prefix="spring.redis.pool")
	public JedisPoolConfig jedisPoolConfig(){
	
		JedisPoolConfig config = new JedisPoolConfig();
		
		return config;
	}
	
	/**
	 * 2.创建JedisConnectionFactory,配置redis连接信息
	 */
	@Bean
	@ConfigurationProperties(prefix="spring.redis")
	public JedisConnectionFactory jedisConnectionFactory(JedisPoolConfig config){
		
		JedisConnectionFactory factory = new JedisConnectionFactory();
		//关联链接池的配置对象
		factory.setPoolConfig(config);
		
		return factory;
	}
	
	/**
	 * 3.创建RedisTemplate:用于执行Redis操作的方法
	 */
	@Bean
	public RedisTemplate< String, Object> redisTemplate(JedisConnectionFactory factory){
		
		RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
		
		//关联
		template.setConnectionFactory(factory);
		
		//设置key的序列化器
		template.setKeySerializer(new StringRedisSerializer());
		
		//为value设置序列化器
		template.setValueSerializer(new StringRedisSerializer());
		
		return template;
	}
}

4.创建一个实体类

package com.liuzhe.pojo;

import java.io.Serializable;

public class Users implements Serializable{

	private Integer id;
	private String name;
	private Integer age;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Integer getAge() {
		return age;
	}
	public void setAge(Integer age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Users [id=" + id + ", name=" + name + ", age=" + age + "]";
	}	
}

5.编写测试代码

/**
	 * 添加一个Users对象
	 */
	@Test
	public void testSetUsers(){
		Users users = new Users();
		users.setAge(20);
		users.setName("王五");
		users.setId(1);
		//重新设置序列化器
		this.redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
		this.redisTemplate.opsForValue().set("users", users);
	}
	
	/**
	 * 从redis中取出Users对象
	 */
	@Test
	public void testGetUsers(){
		//重新设置序列化器
		this.redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
		Users users = (Users) this.redisTemplate.opsForValue().get("users");
		System.out.println(users);
	}

你可能感兴趣的:(spring-data-redis介绍+ 源码解析 +简单配置)