Spring Data Redis配置+源码解析

Spring Data Redis配置+源码解析

Spring Data Redis简介

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

Spring对redis缓存的设计思想则更加精妙,更加全面,不得不说大佬终究还是大佬,Spring能够一统Java不是没有原因的

Spring Data Redis概念

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

  1. RedisConnection:

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

  1. RedisConnectionFactory:

​ 是构建RedisConnection的工厂类

  1. RedisStandaloneConfiguration:

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

  1. RedisSentinelConfiguration:

​ Redis哨兵模式的相关配置

  1. RedisClusterConfiguration:

​ Redis集群模式的相关配置

  1. RedisCacheManager:

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

  1. RedisCacheConfiguration:

​ 是RedisCacheManager的具体个性化配置项

redis的缓存基本架构:

Spring Data Redis配置+源码解析_第1张图片

Spring Data Redis缓存源码实现

spring底层通过封装多个RedisCache来实现不同场景下的缓存配置,其成员变量如下:

public class RedisCache extends AbstractValueAdaptingCache {
	private final String name;
	private final RedisCacheWriter cacheWriter;
	private final RedisCacheConfiguration cacheConfig;
	private final ConversionService conversionService;
}

name:标识不同的缓存,类似分组的概念。

RedisCacheWriter:是对Redis底层操作的封装,我们是通过RedisCache的相关接口来执行redis命令的,而RedisCache内部又是通过RedisCacheWriter来间接操作redis。

RedisCacheConfiguration:前面说RedisCacheConfiguration是RedisCacheManager的具体配置信息,更准确的说其实是对应RedisCache中的配置信息,因为RedisCacheManager内部维护了一个由若干个RedisCacheConfiguration组成的Map,在其初始化时会通过这个Map组装生成对应的RedisCache。

public class RedisCacheManager extends AbstractTransactionSupportingCacheManager {
    private final RedisCacheWriter cacheWriter;
	private final RedisCacheConfiguration defaultCacheConfig;
	private final Map<String, RedisCacheConfiguration> initialCacheConfiguration;
	private final boolean allowInFlightCacheCreation;
 
    /**
	 * 根据initialCacheConfiguration这个Map生成所有的RedisCache
	 * initialCacheConfiguration是通过外部的配置类中调用以下方法加载的
	 * @see RedisCacheManagerBuilder#withInitialCacheConfigurations(Map)
	 * @see RedisCacheManagerBuilder#withCacheConfiguration(String, RedisCacheConfiguration)
	 * 由它的抽象父类的初始化方法触发
	 * @see AbstractCacheManager#initializeCaches()
	 * (non-Javadoc)
	 * @see org.springframework.cache.support.AbstractCacheManager#loadCaches()
	 */
    @Override
	protected Collection<RedisCache> loadCaches() {
 
		List<RedisCache> caches = new LinkedList<>();
 
		for (Map.Entry<String, RedisCacheConfiguration> entry : 
        initialCacheConfiguration.entrySet()) {
			caches.add(createRedisCache(entry.getKey(), entry.getValue()));
		}
 
		return caches;
	}
    /**
	 * 这里创建的时候如果不存在配置则会使用默认的缓存配置
	 */
    protected RedisCache createRedisCache(String name, @Nullable RedisCacheConfiguration 
    cacheConfig) {
		return new RedisCache(name, cacheWriter, cacheConfig != null ? cacheConfig : 
    defaultCacheConfig);
	}
}

其父类AbstractCacheManager的初始化方法中会调用子类实现的loadCaches方法,所以所有的RedisCache实例都存在父类AbstractCacheManager的成员变量cacheMap中,通过实现的getCache方法获取指定的RedisCache实例:

public abstract class AbstractCacheManager implements CacheManager, InitializingBean {
	
    private final ConcurrentMap<String, Cache> cacheMap = new ConcurrentHashMap(16);
    private volatile Set<String> cacheNames = Collections.emptySet();
 
    public void initializeCaches() {
		Collection<? extends Cache> caches = loadCaches();
 
		synchronized (this.cacheMap) {
			this.cacheNames = Collections.emptySet();
			this.cacheMap.clear();
			Set<String> cacheNames = new LinkedHashSet<>(caches.size());
			for (Cache cache : caches) {
				String name = cache.getName();
				this.cacheMap.put(name, decorateCache(cache));
				cacheNames.add(name);
			}
			this.cacheNames = Collections.unmodifiableSet(cacheNames);
		}
	}
    
    @Override
    @Nullable
    public Cache getCache(String name) {
		Cache cache = this.cacheMap.get(name);
		if (cache != null) {
			return cache;
		}
		else {
			// Fully synchronize now for missing cache creation...
			synchronized (this.cacheMap) {
				cache = this.cacheMap.get(name);
				if (cache == null) {
					cache = getMissingCache(name);
					if (cache != null) {
						cache = decorateCache(cache);
						this.cacheMap.put(name, cache);
						updateCacheNames(name);
					}
				}
				return cache;
			}
		}
	}
 
}

总结:RedisCacheManager和RedisCache是核心,前者是管理器,负责生成和获取RedisCache实例,后者封装了具体的redis操作。可以自定义RedisCache和RedisCacheManager,通过实现createRedisCache接口和getCache接口管理自定义的RedisCache实例。

你可能感兴趣的:(Spring Data Redis配置+源码解析)