Browse Source

auto commit

tags/v1.0.0
yitter 4 years ago
parent
commit
5bc679976e
2 changed files with 37 additions and 15 deletions
  1. +9
    -2
      C#.NET/source/YitIdGen.WinFormApp/StartForm.cs
  2. +28
    -13
      Go/source/regworkerid/reghelper.go

+ 9
- 2
C#.NET/source/YitIdGen.WinFormApp/StartForm.cs View File

@@ -29,7 +29,7 @@ namespace WInFormApp
//public static extern ulong RegisterWorkerId2(); //public static extern ulong RegisterWorkerId2();
[DllImport("yitidgengo.dll", CallingConvention = CallingConvention.StdCall)] [DllImport("yitidgengo.dll", CallingConvention = CallingConvention.StdCall)]
public static extern long UnRegisterWorkerId();
public static extern void UnRegisterWorkerId();
[DllImport("yitidgen.dll", CallingConvention = CallingConvention.StdCall)] [DllImport("yitidgen.dll", CallingConvention = CallingConvention.StdCall)]
@@ -67,7 +67,14 @@ namespace WInFormApp
private void button1_Click(object sender, EventArgs e) private void button1_Click(object sender, EventArgs e)
{ {
UnRegisterWorkerId();
try
{
UnRegisterWorkerId();
}
catch (Exception ex)
{
txtIdList.Text = ex.Message;
}
// GetWorkerId("localhost", 6379); // GetWorkerId("localhost", 6379);
} }
} }


+ 28
- 13
Go/source/regworkerid/reghelper.go View File

@@ -23,6 +23,9 @@ var _MaxLoopCount = 10 // 最大循环次数(无可用WorkerId
var _SleepMillisecondEveryLoop = 200 // 每次循环后,暂停时间 var _SleepMillisecondEveryLoop = 200 // 每次循环后,暂停时间
var _MaxWorkerId int = 0 // 最大WorkerId值,超过此值从0开始 var _MaxWorkerId int = 0 // 最大WorkerId值,超过此值从0开始


var _ConnString = ""
var _Password = ""

const _WorkerIdIndexKey string = "IdGen:WorkerId:Index" // redis 中的key const _WorkerIdIndexKey string = "IdGen:WorkerId:Index" // redis 中的key
const _WorkerIdValueKeyPrefix string = "IdGen:WorkerId:Value:" // redis 中的key const _WorkerIdValueKeyPrefix string = "IdGen:WorkerId:Value:" // redis 中的key
const _WorkerIdFlag = "Y" // IdGen:WorkerId:Value:xx 的值(将来可用 _token 替代) const _WorkerIdFlag = "Y" // IdGen:WorkerId:Value:xx 的值(将来可用 _token 替代)
@@ -47,13 +50,13 @@ func UnRegisterWorkerId() {
_lifeIndex = -1 _lifeIndex = -1
_workerIdLock.Unlock() _workerIdLock.Unlock()


_client.Quit(_ctx)
_client.Close()
} }


func RegisterWorkerId(ip string, port int, password string, maxWorkerId int) int { func RegisterWorkerId(ip string, port int, password string, maxWorkerId int) int {
// maxWorkerId不能小于0 // maxWorkerId不能小于0
if maxWorkerId < 0 { if maxWorkerId < 0 {
return -1
return -2
} }


// 如果当前已注册过 WorkerId,则先注销,并终止先前的自动续期线程 // 如果当前已注册过 WorkerId,则先注销,并终止先前的自动续期线程
@@ -62,15 +65,9 @@ func RegisterWorkerId(ip string, port int, password string, maxWorkerId int) int
} }


_MaxWorkerId = maxWorkerId _MaxWorkerId = maxWorkerId
_client = redis.NewClient(&redis.Options{
Addr: ip + ":" + strconv.Itoa(port),
Password: password,
DB: 0,
//PoolSize: 1000,
//ReadTimeout: time.Millisecond * time.Duration(100),
//WriteTimeout: time.Millisecond * time.Duration(100),
//IdleTimeout: time.Second * time.Duration(60),
})
_ConnString = ip + ":" + strconv.Itoa(port)
_Password = password
_client = newRedisClient()


_, err := _client.Ping(_ctx).Result() _, err := _client.Ping(_ctx).Result()
if err != nil { if err != nil {
@@ -79,12 +76,25 @@ func RegisterWorkerId(ip string, port int, password string, maxWorkerId int) int
if _Log { if _Log {
fmt.Println("init redis ok") fmt.Println("init redis ok")
} }
defer _client.Close()
} }


_loopCount = 0 _loopCount = 0
return getNextWorkerId() return getNextWorkerId()
} }


func newRedisClient() *redis.Client {
return redis.NewClient(&redis.Options{
Addr: _ConnString,
Password: _Password,
DB: 0,
//PoolSize: 1000,
//ReadTimeout: time.Millisecond * time.Duration(100),
//WriteTimeout: time.Millisecond * time.Duration(100),
//IdleTimeout: time.Second * time.Duration(60),
})
}

func getNextWorkerId() int { func getNextWorkerId() int {
// 获取当前 WorkerIdIndex // 获取当前 WorkerIdIndex
r, err := _client.Incr(_ctx, _WorkerIdIndexKey).Result() r, err := _client.Incr(_ctx, _WorkerIdIndexKey).Result()
@@ -104,9 +114,12 @@ func getNextWorkerId() int {
setWorkerIdIndex(-1) setWorkerIdIndex(-1)
endReset() // 此步有可能不被执行? endReset() // 此步有可能不被执行?
_loopCount++ _loopCount++

// 超过一定次数,直接终止操作 // 超过一定次数,直接终止操作
if _loopCount > _MaxLoopCount { if _loopCount > _MaxLoopCount {
_loopCount = 0 _loopCount = 0

// 返回错误
return -1 return -1
} }


@@ -163,7 +176,7 @@ func extendWorkerIdLifeTime(lifeIndex int) {


// 循环操作:间隔一定时间,刷新 WorkerId 在 redis 中的有效时间。 // 循环操作:间隔一定时间,刷新 WorkerId 在 redis 中的有效时间。
for { for {
time.Sleep(time.Duration(_WorkerIdLifeTimeSeconds/3) * time.Millisecond)
time.Sleep(time.Duration(_WorkerIdLifeTimeSeconds/3) * time.Second)


// 上锁操作,防止跟 UnRegisterWorkerId 操作重叠 // 上锁操作,防止跟 UnRegisterWorkerId 操作重叠
_workerIdLock.Lock() _workerIdLock.Lock()
@@ -206,7 +219,9 @@ func setWorkerIdFlag(index int) {
} }


func extendWorkerIdFlag(index int) { func extendWorkerIdFlag(index int) {
_client.Expire(_ctx, _WorkerIdValueKeyPrefix+strconv.Itoa(index), time.Duration(_WorkerIdLifeTimeSeconds)*time.Second)
var client = newRedisClient()
defer client.Close()
client.Expire(_ctx, _WorkerIdValueKeyPrefix+strconv.Itoa(index), time.Duration(_WorkerIdLifeTimeSeconds)*time.Second)
} }


func canReset() bool { func canReset() bool {


Loading…
Cancel
Save