解决雪花ID重复问题

This commit is contained in:
caoqianming 2022-10-11 17:51:21 +08:00
parent b2534d5471
commit 415db7d998
3 changed files with 6 additions and 7 deletions

View File

@ -69,14 +69,13 @@ class BaseModel(models.Model):
abstract = True abstract = True
def save(self, *args, **kwargs) -> None: def save(self, *args, **kwargs) -> None:
# 出现了雪花ID重复,不知道怎么处理,先这样异常处理一下 # 出现了雪花ID重复,不知道怎么处理,先这样异常处理一下;已经修改了snowflake, 以防万一, 这里依然保留
gen_id = False gen_id = False
if not self.id: if not self.id:
gen_id = True gen_id = True
self.id = idWorker.get_id() self.id = idWorker.get_id()
try: try:
x = super().save(*args, **kwargs) return super().save(*args, **kwargs)
return x
except IntegrityError as e: except IntegrityError as e:
if gen_id: if gen_id:
time.sleep(0.01) time.sleep(0.01)

View File

@ -1,8 +1,9 @@
# Twitter's Snowflake algorithm implementation which is used to generate distributed IDs. # Twitter's Snowflake algorithm implementation which is used to generate distributed IDs.
# https://github.com/twitter-archive/snowflake/blob/snowflake-2010/src/main/scala/com/twitter/service/snowflake/IdWorker.scala # https://github.com/twitter-archive/snowflake/blob/snowflake-2010/src/main/scala/com/twitter/service/snowflake/IdWorker.scala
from random import randint
import time import time
from server.settings import SNOW_DATACENTER_ID, SNOW_WORKER_ID from server.settings import SNOW_DATACENTER_ID
class InvalidSystemClock(Exception): class InvalidSystemClock(Exception):
@ -14,7 +15,7 @@ class InvalidSystemClock(Exception):
class Constant(object): class Constant(object):
# 64位ID的划分 # 64位ID的划分
WORKER_ID_BITS = 5 WORKER_ID_BITS = 6
DATACENTER_ID_BITS = 5 DATACENTER_ID_BITS = 5
SEQUENCE_BITS = 12 SEQUENCE_BITS = 12
@ -101,7 +102,7 @@ class IdWorker(object):
return timestamp return timestamp
idWorker = IdWorker(SNOW_DATACENTER_ID, SNOW_WORKER_ID) idWorker = IdWorker(SNOW_DATACENTER_ID, randint(1, 60))
if __name__ == '__main__': if __name__ == '__main__':
print(idWorker.get_id()) print(idWorker.get_id())

View File

@ -167,7 +167,6 @@ EMAIL_USE_TLS = conf.EMAIL_USE_TLS
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
# 雪花ID生成配置 # 雪花ID生成配置
SNOW_DATACENTER_ID = conf.SNOW_DATACENTER_ID SNOW_DATACENTER_ID = conf.SNOW_DATACENTER_ID
SNOW_WORKER_ID = conf.SNOW_WORKER_ID
# restframework配置 # restframework配置
REST_FRAMEWORK = { REST_FRAMEWORK = {