測試IIS多程序下,c 版雪花演算法的值大量重複

2021-10-16 13:19:26 字數 3568 閱讀 7788

線上找的雪花演算法及說明:

較真的態度,驗證如下:

1.修正**,示例**有呼叫錯誤:nuget安裝sqlsugar,framework4.6.1版本

//核心演算法

namespace webapi2   

//機器標識

public long datacenterid //資料中心

//public long sequence = 0l;//序列號

//// internal set

//}private readonly datetime jan1st1970 = new datetime(1970, 1, 1, 0, 0, 0, datetimekind.utc);

private readonly object _lock = new object();

public snowflakenet(long machineid, long datacenterid)

", maxmachinenum));

}if (datacenterid > maxdatacenternum || datacenterid < 0)

", maxdatacenternum));

}//先檢驗再賦值

machineid = machineid;

datacenterid = datacenterid;

//_sequence = sequence;

}//public static init(long machineid, long datacenterid)

//public long nextid()

毫秒生成id", _lasttimestamp - timestamp));

}//如果上次生成時間和當前時間相同,在同一毫秒內

if (_lasttimestamp == timestamp)

}else

_lasttimestamp = timestamp;

return ((timestamp - startstmp) << timestampleftshift) | (datacenterid << datacenteridshift) | (machineid << machineshift) | _sequence;}}

// 防止產生的時間比之前的時間還要小(由於ntp回撥等問題),保持增量的趨勢.

protected virtual long tilnextmillis(long lasttimestamp)

return timestamp;

}// 獲取當前的時間戳

protected virtual long timegen()}}

//封裝呼叫

namespace webapi2

static idworkerhelper()

public static long genid64()}}

//資料入庫

namespace webapi2

public datetime dt }}

namespace webapi2}}

//webapi呼叫

2.部署iis:設定最大程序數==2

3.壓測工具:tcpbenchmarks壓測工具,

4.壓測結果:果然大量重複,26萬資料,產生9成多行重複

5.如果只用乙個iis程序,不會出現此問題,已驗證,50併發下一分鐘產生40萬條資料,一條也沒重複。

6.原因:

iis多程序下,相當於部署到多台機器,但每台機器配置的機器碼一致,所以產生的碰撞機率很高。

7.解決:

思路一:保持現有**不同,部署到iis上設定只能單程序使用。

思路二:使用nginx反向**使用,後面部署多台iis機器,但每台機器只能單程序並設定不同的機器碼,也就是此行**的構造引數不同。這才是分布式id的常用方法吧。

static idworkerhelper()

思路三:使用互斥鎖中的程序鎖mutex,**修改

//生成id的核心方法,把互斥鎖-執行緒鎖lock替換為mutex

public static mutex mutex = new mutex();

public long nextid()

else if (timestamp == lasttimestamp) //如果是同一時間生成的,則進行毫秒內序列

}else //當前時間小於上一次id生成的時間戳,證明系統時鐘被回撥,此時需要做回撥處理

else //毫秒內序列溢位

//throw new exception(string.format("clock moved backwards. refusing to generate id for milliseconds", lasttimestamp - timestamp));

}lasttimestamp = timestamp; //上次生成id的時間截

//移位並通過或運算拼到一起組成64位的id

var id = ((timestamp - twepoch) << timestampleftshift)

| (datacenterid << datacenteridshift)

| (workerid << workeridshift)

| sequence;

mutex.releasemutex();

return id;

//}}

效能:配置2程序,使用程序鎖(mutex),一分鐘壓測:

效能:配置1程序,使用執行緒鎖(lock),一分鐘壓測:

可以看出效能相差並不多

思路四:換成netcore版本的snowflake待測試!!!!!

Linux下C語言驗證多程序

include include include include using namespace std int main 上面是父程序的執行結果 下面是子程序的執行結果。建立乙個子程序,父子程序併發執行 子程序複製父程序的如下屬性 段 資料段的內容,父子程序擁有相同的 和資料 開啟檔案列表 不複製程...

c 多程序程式設計

執行緒的優點 1 建立乙個新執行緒的代價要比建立乙個新程序小得多 2 與程序之間的切換相比,執行緒之間的切換需要作業系統做的工作要少很多 3 執行緒占用的資源要比程序少很多 4 能充分利用多處理器的可並行數量 5 在等待慢速i o操作結束的同時,程式可執行其他的計算任務 6 計算密集型應用,為了能在...

linux下多程序服務框架

使用者只需要在程式最下面修改handle connection函式,在裡面實現對客戶請求的處理邏輯即可,訊號處理及程序組控制都由框架完成。在rhes 3 2.4kernel和debian etch 2.6kernel下測試通過。歡迎指正。include include include include...