線上找的雪花演算法及說明:
較真的態度,驗證如下:
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...