解决雪花ID重复问题
This commit is contained in:
parent
b2534d5471
commit
415db7d998
|
@ -69,14 +69,13 @@ class BaseModel(models.Model):
|
|||
abstract = True
|
||||
|
||||
def save(self, *args, **kwargs) -> None:
|
||||
# 出现了雪花ID重复,不知道怎么处理,先这样异常处理一下
|
||||
# 出现了雪花ID重复,不知道怎么处理,先这样异常处理一下;已经修改了snowflake, 以防万一, 这里依然保留
|
||||
gen_id = False
|
||||
if not self.id:
|
||||
gen_id = True
|
||||
self.id = idWorker.get_id()
|
||||
try:
|
||||
x = super().save(*args, **kwargs)
|
||||
return x
|
||||
return super().save(*args, **kwargs)
|
||||
except IntegrityError as e:
|
||||
if gen_id:
|
||||
time.sleep(0.01)
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
# 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
|
||||
|
||||
from random import randint
|
||||
import time
|
||||
from server.settings import SNOW_DATACENTER_ID, SNOW_WORKER_ID
|
||||
from server.settings import SNOW_DATACENTER_ID
|
||||
|
||||
|
||||
class InvalidSystemClock(Exception):
|
||||
|
@ -14,7 +15,7 @@ class InvalidSystemClock(Exception):
|
|||
|
||||
class Constant(object):
|
||||
# 64位ID的划分
|
||||
WORKER_ID_BITS = 5
|
||||
WORKER_ID_BITS = 6
|
||||
DATACENTER_ID_BITS = 5
|
||||
SEQUENCE_BITS = 12
|
||||
|
||||
|
@ -101,7 +102,7 @@ class IdWorker(object):
|
|||
return timestamp
|
||||
|
||||
|
||||
idWorker = IdWorker(SNOW_DATACENTER_ID, SNOW_WORKER_ID)
|
||||
idWorker = IdWorker(SNOW_DATACENTER_ID, randint(1, 60))
|
||||
|
||||
if __name__ == '__main__':
|
||||
print(idWorker.get_id())
|
||||
|
|
|
@ -167,7 +167,6 @@ EMAIL_USE_TLS = conf.EMAIL_USE_TLS
|
|||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||
# 雪花ID生成配置
|
||||
SNOW_DATACENTER_ID = conf.SNOW_DATACENTER_ID
|
||||
SNOW_WORKER_ID = conf.SNOW_WORKER_ID
|
||||
|
||||
# restframework配置
|
||||
REST_FRAMEWORK = {
|
||||
|
|
Loading…
Reference in New Issue