使用redis生成数据库主键自增

开源项目地址: 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,以便自动注入及未来方案修改

	
	



你可能感兴趣的:(Redis)