使用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,以便自动注入及未来方案修改

	<bean id="keyGenerate" class="com.cykj.base.core.key.RedisKeyGenerate">
	</bean>



  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值