使用zookeeper实现自增主键

导入依赖

<properties> 
	<curator.version>4.2.0</curator.version>
 </properties>
  <!-- curator ZK 客户端 -->
 <dependency>
     <groupId>org.apache.curator</groupId>
     <artifactId>curator-framework</artifactId>
     <version>${curator.version}</version>
 </dependency>
 <dependency>
     <groupId>org.apache.curator</groupId>
     <artifactId>curator-recipes</artifactId>
     <version>${curator.version}</version>
 </dependency>

配置文件

根路径下新建zookeeper.properties

zk.host=192.168.81.128:2181
# zk自增存储node
zk.sequence-path=/news/sequence/

枚举封装

创建com.demo.common.zookeeper.sequence.ZkSequenceEnum文件,用于定义通过Zk生成自增ID的枚举,在项目中规范要求与物理表名项目,使用与当前项目阶段的枚举如下:

package com.demo.common.zookeeper.sequence;

public enum ZkSequenceEnum {
   
   
    AP_LIKES,
    AP_READ_BEHAVIOR,
    AP_COLLECTION,
    AP_USER_FOLLOW,
    AP_USER_FAN
}

序列封装

创建com.demo.common.zookeeper.sequence.ZkSequence文件,用于封装程序在运行时每个表对应的自增器,这里主要通过分布式原子自增类(DistributedAtomicLong)实现,注意每500毫秒重试3次后仍然生成失败则返回null,由上层处理,相关实现代码如下:

package com.demo.common.zookeeper.sequence;

import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.recipes.atomic.AtomicValue;
import org.apache.curator.framework.recipes.atomic.DistributedAtomicLong;
import org.apache.curator.retry.ExponentialBackoffRetry;

public class ZkSequence {
   
   
    RetryPolicy retryPolicy = new ExponentialBackoffRetry(500, 3);
    DistributedAtomicLong distAtomicLong;

    public ZkSequence(String sequenceName, CuratorFramework client) {
   
   
        distAtomicLong = new DistributedAtomicLong(client, sequenceName, retryPolicy);
    }

    /***
     *  生成序列
     *  @return
     *  @throws Exception
     *  */
    public Long sequence() throws Exception {
   
   
        AtomicValue<Long> sequence = this.distAtomicLong.increment();
        if (sequence.succeeded(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值