解决雪花ID重复问题
This commit is contained in:
parent
b2534d5471
commit
415db7d998
|
@ -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)
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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 = {
|
||||||
|
|
Loading…
Reference in New Issue