All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.gitee.apanlh.util.cache.redis.RedisKeyLoad Maven / Gradle / Ivy

There is a newer version: 2.0.0.2
Show newest version
package com.gitee.apanlh.util.cache.redis;

import com.gitee.apanlh.exp.LoadErrorException;
import com.gitee.apanlh.spring.BeanContextUtils;
import com.gitee.apanlh.util.base.IteratorUtils;
import com.gitee.apanlh.util.base.MapUtils;
import com.gitee.apanlh.util.base.StringUtils;
import com.gitee.apanlh.util.cache.local.Cache;
import com.gitee.apanlh.util.cache.local.CacheUtils;
import com.gitee.apanlh.util.cache.redis.api.AbstractRedis;
import com.gitee.apanlh.util.id.IdUtils;
import com.gitee.apanlh.util.reflection.ClassConvertUtils;
import com.gitee.apanlh.util.thread.StackUtils;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Map;

/**	
 * 	RedisKey加载器
 * 
 * 	@author Pan
 */
public class RedisKeyLoad {
	
	static {
		RedisLoadTask.createInitBeansTask();
	}
	
	/** 存放加载对象 */
	static final Cache> LOAD_BEANS = CacheUtils.cache(MapUtils.newConcurrentHashMap(32));
	/**	 初始化加载对象 */
	static Map> initLoadBeans = MapUtils.newConcurrentHashMap(16);
	
	/**
	 * 	构造函数
	 * 
	 * 	@author Pan
	 */
	private RedisKeyLoad() {
		//	不允许外部实例
		super();
	}
	
	/**
	 * 	加载RedisTemplate
	 * 	
	 * 	@author Pan
	 * 	@param       值类型
	 * 	@param 	redisKeyBuilder	Redis构建对象
	 * 	@return RedisKeyBuilder
	 */
	public static  RedisKeyBuilder load(RedisKeyBuilder redisKeyBuilder) {
		//	验证是否重复加载key
		checkKeyExist(redisKeyBuilder);
		//	保存加载对象以及初始化对象
		putInitLoadBean(redisKeyBuilder);
		return putLoadBean(redisKeyBuilder);
	}
	
	/**	
	 * 	添加已经加载完成的Redis对象
	 * 	
	 * 	@author Pan
	 * 	@param 						Redis数据类型
	 * 	@param 	redisKeyBuilder		RedisKey对象
	 * 	@return RedisKeyBuilder
	 */
	static  RedisKeyBuilder putLoadBean(RedisKeyBuilder redisKeyBuilder) {
		LOAD_BEANS.put(redisKeyBuilder.getKey(), redisKeyBuilder);
		return redisKeyBuilder;
	}
	
	/**	
	 * 	添加初始化加载Redis对象
	 * 	
	 * 	@author Pan
	 * 	@param 						Redis数据类型
	 * 	@param 	redisKeyBuilder		RedisKey对象
	 * 	@return RedisKeyBuilder
	 */
	static  RedisKeyBuilder putInitLoadBean(RedisKeyBuilder redisKeyBuilder) {
		initLoadBeans.put(getKey(redisKeyBuilder.getKey()), redisKeyBuilder);
		return redisKeyBuilder;
	}
	
	/**
	 * 	获取初始化键
	 * 	
	 * 	@author Pan
	 * 	@param 	initKey	初始化key键
	 * 	@return	String
	 */
	private static String getKey(String initKey) {
		StackTraceElement stackTraceElement = StackUtils.getStackTraceByKeyword(".");
		
		if (stackTraceElement == null) {
			return IdUtils.generateIdStr();
		}
		return new StringBuilder()
			.append(stackTraceElement.getClassName())
			.append("[")
			.append(initKey)
			.append("]")
		.toString();
	}
	
	/**	
	 * 	获取RedisTemplateBean
	 * 	
	 * 	@author Pan
	 * 	@return	RedisTemplate
	 */
	static RedisTemplate getRedisTemplateBean() {
		if (BeanContextUtils.getApplicationContext() == null) {
			return null;
		}
		return ClassConvertUtils.cast(BeanContextUtils.getBean("redisTemplate"));
	}
	
	/**
	 * 	检测是否重复加载相同key
	 * 	
	 * 	@author Pan
	 * 	@param 	redisKeyBuilder	Key对象
	 */
	static  void checkKeyExist(RedisKeyBuilder redisKeyBuilder) {
		if (LOAD_BEANS.get(redisKeyBuilder.getKey()) != null) {
			throw new LoadErrorException(StringUtils.format("redis key [{}] is exist", redisKeyBuilder.getKey()));
		}
	}

	/**	
	 * 	获取所有初始化加载Redis对象
	 * 
	 * 	@author Pan
	 * 	@return	Map
	 */
	static Map> getInitLoadBeans() {
		return initLoadBeans;
	}

	/**	
	 * 	获取所有加载Redis对象
	 * 	
	 * 	@author Pan
	 * 	@return	Cache
	 */
	public static Cache> getLoadBeans() {
		return LOAD_BEANS;
	}
	
	/**
	 * 	清除所有初始化加载Bean
	 * 	
	 * 	@author Pan
	 */
	static void clearInitLoadBeans() {
		IteratorUtils.entrySet(initLoadBeans, (k, v, iterator) -> iterator.remove());
		initLoadBeans = null;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy