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

来源:互联网 发布:纽约特朗普大厦知乎 编辑:程序博客网 时间:2024/05/16 00:48

开源项目地址: 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{@Overridepublic String generateStringKey(KeyGenerateEnum em) {return StringUtil.getUUID()+StringUtil.getNonceStr(6);}@Overridepublic 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;@Overridepublic String generateStringKey(KeyGenerateEnum em) {Long key = generateLongKey(em);if (key!=null) {return key.toString();}//为了防止redis挂了程序能够继续运行return new BaseKeyGenerate().generateStringKey(em);}@Overridepublic 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>



0 0