redisを使用してデータベース・プライマリ・キーの自己増加を生成

2516 ワード

オープンソースプロジェクトアドレス:githubオープンソースリンク
データベースが増えるなんて面倒でたまらない.特にこれからは分散処理を考えて、怠け者を盗んで、直接redisをしなければならない.
次のコード
プライマリ・キー生成ポリシー・インタフェースを定義してから、拡張が容易になります.
/**
 *           ,      
 * @author LeiYong
 *
 */
public interface KeyGenerate {
	/**
	 *   String    
	 * @param em
	 * @return
	 */
	public String generateStringKey(KeyGenerateEnum em);
	/**
	 *   long    
	 * @param em
	 * @return
	 */
	public Long generateLongKey(KeyGenerateEnum em);
}

次に、ランダム数(Long)またはUUID(String)方式で生成される補欠選手を提供する.
/**
 *         ,      UUID+   
 * @author LeiYong
 *
 */
public class BaseKeyGenerate implements KeyGenerate{
	@Override
	public String generateStringKey(KeyGenerateEnum em) {
		return StringUtil.getUUID()+StringUtil.getNonceStr(6);
	}
	@Override
	public Long generateLongKey(KeyGenerateEnum em) {
		return System.currentTimeMillis()*1000000+NumberUtil.random(6);
	}
}

主役のRedisのキャッシュキークラスが登場
/**
 *   Redis          
 * @author LeiYong
 *
 */
public class RedisKeyGenerate implements KeyGenerate{
	/**
	 * Logger for this class
	 */
	private final Logger logger = LoggerFactory.getLogger(RedisKeyGenerate.class);

	private final String SEQUENCE_KEY = "SEQ";
	@Autowired
	@Qualifier("redisClientSupport")
	private RedisClientSupport redisClientSupport;
	
	@Override
	public String generateStringKey(KeyGenerateEnum em) {
		Long key = generateLongKey(em);
		if (key!=null) {
			return key.toString();
		}
		//    redis          
		return new BaseKeyGenerate().generateStringKey(em);
	}

	@Override
	public Long generateLongKey(KeyGenerateEnum em) {
		synchronized (em) {
			try {
				Long key = redisClientSupport.incrementHash(SEQUENCE_KEY, em.name(), 1l);
				if (key != null) {
					return key;
				}
			} catch (CacheAccessException e) {
				logger.warn("generateStringKey(KeyGenerateEnum) - exception ignored", e); //$NON-NLS-1$
			}
		}
		//    redis          
		return new BaseKeyGenerate().generateLongKey(em);
	}

}

よし、大功告成、また列挙を使って、非常に簡単な列挙を定義すればいいのに、前のコードにしましょう...谁かが列挙を知らないことを避けて、胜手に例を挙げて、会社のデータテーブルを明らかにしないようにして、列挙名をModel类と一致させるようにすればいい.Redisを借りてプライマリ・キーを生成するすべてのクラスの新規化を実現するには、手動でプライマリ・キーを構成する必要はありません.シーケンスなどはGGに通じています.
public enum KeyGenerateEnum {
	ActAttend,
	ActRecommendDetail,ActType,
	LogLogin
}

最後に、変更を容易にするためにspringでbeanを構成し、自動的に注入し、将来のシナリオを変更します.