欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何通過雪花算法用Python實(shí)現(xiàn)一個(gè)簡單的發(fā)號器

 更新時(shí)間:2019年07月03日 09:44:21   作者:情話醉心  
這篇文章主要介紹了如何通過雪花算法用Python實(shí)現(xiàn)一個(gè)簡單的發(fā)號器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

實(shí)現(xiàn)一個(gè)簡單的發(fā)號器

根據(jù)snowflake算法的原理實(shí)現(xiàn)一個(gè)簡單的發(fā)號器,產(chǎn)生不重復(fù)、自增的id。

1.snowflake算法的簡單描述


這里的snowflake算法是用二進(jìn)制的,有64位。其中41位的時(shí)間戳表示:當(dāng)前時(shí)間戳減去某個(gè)設(shè)定的起始時(shí)間,10位標(biāo)識表示:不同的機(jī)器、數(shù)據(jù)庫的標(biāo)識ID等等,序列號為每秒或每毫秒內(nèi)自增的id。

我做的時(shí)候沒有用位運(yùn)算去實(shí)現(xiàn),而是做了一個(gè)十進(jìn)制的,16位的(當(dāng)時(shí)項(xiàng)目要求是16位的)。但是實(shí)現(xiàn)發(fā)號器的基本策略是一樣的,通過時(shí)間戳和標(biāo)識來防止重復(fù),通過序列號實(shí)現(xiàn)自增。當(dāng)然啦,重點(diǎn)不是發(fā)號器多少位,而是根據(jù)項(xiàng)目的實(shí)際情況,利用snowflake算法的原理,實(shí)現(xiàn)一個(gè)適合自己項(xiàng)目的發(fā)號器。

2.Python實(shí)現(xiàn)

時(shí)間戳:9位,起始時(shí)間為2018-01-01 00:00:00 ,時(shí)間戳為當(dāng)前時(shí)間減去起始時(shí)間。時(shí)間戳有9為,可用時(shí)間為 999999999/(606024*365)≈31(年)。

標(biāo)識ID:2位,我用的時(shí)候比較簡單,只是涉及一個(gè)數(shù)據(jù)庫的情況,所以用一張數(shù)據(jù)表對應(yīng)一個(gè)標(biāo)識ID,可用100張表。

序列號:5位,我時(shí)間戳用的是秒級的,但是5位是10萬個(gè)序列號,經(jīng)過測試在一秒內(nèi)是完全夠用的。

所以時(shí)間戳、標(biāo)識ID、序列號的位數(shù)也沒規(guī)定說一定要多少,根據(jù)自己項(xiàng)目的實(shí)際來即可。

代碼如下:

import time
class MySnow:
  def __init__(self,dataID):
    self.start = int(time.mktime(time.strptime('2018-01-01 00:00:00', "%Y-%m-%d %H:%M:%S")))
    self.last = int(time.time())
    self.countID = 0
    self.dataID = dataID  # 數(shù)據(jù)ID,這個(gè)自定義或是映射

  def get_id(self):
    # 時(shí)間差部分
    now = int(time.time())
    temp = now-self.start
    if len(str(temp)) < 9: # 時(shí)間差不夠9位的在前面補(bǔ)0
      length = len(str(temp))
      s = "0" * (9-length)
      temp = s + str(temp)
    if now == self.last:
      self.countID += 1  # 同一時(shí)間差,序列號自增
    else:
      self.countID = 0  # 不同時(shí)間差,序列號重新置為0
      self.last = now
    # 標(biāo)識ID部分
    if len(str(self.dataID)) < 2:
      length = len(str(self.dataID))
      s = "0" * (2-length)
      self.dataID = s + str(self.dataID)
    # 自增序列號部分
    if self.countID == 99999: # 序列號自增5位滿了,睡眠一秒鐘
      time.sleep(1)
    countIDdata = str(self.countID)
    if len(countIDdata) < 5: # 序列號不夠5位的在前面補(bǔ)0
      length = len(countIDdata)
      s = "0"*(5-length)
      countIDdata = s + countIDdata
    id = str(temp) + str(self.dataID) + countIDdata
    return id

使用方法:

snow = MySnow(dataID="00")
print(snow.get_id())

其中dataID即為標(biāo)識ID,countID為自增序列號。dataID可以一個(gè)通過自定義的映射表獲得,這個(gè)視實(shí)際的項(xiàng)目情況而定。

3.關(guān)于并發(fā)

首先,直接用這個(gè)發(fā)號器是不能進(jìn)行并發(fā)操作,會產(chǎn)生重復(fù)的id。如果真的要進(jìn)行并發(fā),那么就要權(quán)衡一下并發(fā)和位數(shù)的哪個(gè)更重要了!

拿實(shí)際例子來說吧,比如我并發(fā)的目的是為了節(jié)省時(shí)間,讓程序更快的跑完,這時(shí)候?yàn)榱瞬l(fā),我把dataID中拿出一位來,標(biāo)識不同的子進(jìn)程,這樣可以防止產(chǎn)生重復(fù)的id。但是實(shí)際上這用了位數(shù)去換取時(shí)間,如果是id位數(shù)比較少的情況,比如16位的,dataID比較少,我個(gè)人認(rèn)為這樣是不值得的,有些奢侈。這時(shí)候便是位數(shù)比并發(fā)重要啦。

當(dāng)時(shí)如果位數(shù)充裕,比如20位的,需要并發(fā)就并發(fā)啦。

還有一種實(shí)現(xiàn)并發(fā)的方法,就是給發(fā)號器加鎖,發(fā)號的時(shí)候加鎖,發(fā)完了解鎖。這個(gè)我沒有試過,有興趣的可以試一下哈哈。但是我有個(gè)疑惑啊,就是不斷加鎖和解鎖切換,帶來的時(shí)間和資源開銷會不會很大呢。

相關(guān)文章

  • 給Python中的MySQLdb模塊添加超時(shí)功能的教程

    給Python中的MySQLdb模塊添加超時(shí)功能的教程

    這篇文章主要介紹了給Python中的MySQLdb模塊添加超時(shí)功能的教程,timeout功能在服務(wù)器的運(yùn)維當(dāng)中非常有用,需要的朋友可以參考下
    2015-05-05
  • pytorch中permute()函數(shù)用法補(bǔ)充說明(矩陣維度變化過程)

    pytorch中permute()函數(shù)用法補(bǔ)充說明(矩陣維度變化過程)

    這篇文章主要給大家介紹了關(guān)于pytorch中permute()函數(shù)用法補(bǔ)充說明的相關(guān)資料,本文詳細(xì)說明了permute函數(shù)里維度變化的詳細(xì)過程,需要的朋友可以參考下
    2022-04-04
  • Python中出現(xiàn)"No?module?named?'requests'"的圖文解決辦法

    Python中出現(xiàn)"No?module?named?'requests'"

    這篇文章主要給大家介紹了關(guān)于Python中出現(xiàn)"No?module?named?'requests'"的解決辦法,"No?module?named?requests"是Python報(bào)錯(cuò)提示,意味著你在使用某個(gè)Python程序或腳本時(shí),沒有找到名為requests的模塊,需要的朋友可以參考下
    2023-11-11
  • 如何使用python爬取B站排行榜Top100的視頻數(shù)據(jù)

    如何使用python爬取B站排行榜Top100的視頻數(shù)據(jù)

    本文章向大家介紹python爬取b站排行榜,包括python爬取b站排行榜的具體代碼,對大家的學(xué)習(xí)或工作具有一定的參考價(jià)值,需要的朋友可以參考一下
    2021-09-09
  • Python 中導(dǎo)入文本文件的示例代碼

    Python 中導(dǎo)入文本文件的示例代碼

    這篇文章主要介紹了如何在 Python 中導(dǎo)入文本文件,在Python中導(dǎo)入文本文件是很常見的操作,我們可以使用內(nèi)置的open函數(shù)和with語句來讀取或?qū)懭胛谋疚募枰呐笥芽梢詤⒖枷?/div> 2023-05-05
  • Python面向?qū)ο蟪绦蛟O(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)用法分析

    Python面向?qū)ο蟪绦蛟O(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)用法分析

    這篇文章主要介紹了Python面向?qū)ο蟪绦蛟O(shè)計(jì)構(gòu)造函數(shù)和析構(gòu)函數(shù)用法,結(jié)合具體實(shí)例形式分析了Python面向?qū)ο蟪绦蛟O(shè)計(jì)中構(gòu)造函數(shù)與析構(gòu)函數(shù)的概念、原理、功能及相關(guān)使用技巧,需要的朋友可以參考下
    2019-04-04
  • python安裝TA-Lib庫報(bào)錯(cuò)問題的解決方法

    python安裝TA-Lib庫報(bào)錯(cuò)問題的解決方法

    TaLib是一個(gè)Python金融指數(shù)處理庫,包含了很多技術(shù)分析里的常用參數(shù)指標(biāo),例如MA、SMA、WMA、MACD、ATR等,這篇文章主要給大家介紹了關(guān)于python安裝TA-Lib庫報(bào)錯(cuò)問題的解決方法,需要的朋友可以參考下
    2024-01-01
  • Python中列表的常用操作詳解

    Python中列表的常用操作詳解

    這篇文章主要為大家詳細(xì)介紹了python字典的常用操作方法,主要內(nèi)容包含Python中列表(List)的詳解操作方法,包含創(chuàng)建、訪問、更新、刪除、其它操作等,需要的朋友可以參考下
    2021-09-09
  • Python基于多線程操作數(shù)據(jù)庫相關(guān)問題分析

    Python基于多線程操作數(shù)據(jù)庫相關(guān)問題分析

    這篇文章主要介紹了Python基于多線程操作數(shù)據(jù)庫相關(guān)問題,結(jié)合實(shí)例形式分析了Python使用數(shù)據(jù)庫連接池并發(fā)操作數(shù)據(jù)庫避免超時(shí)、連接丟失相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2018-07-07
  • pandas將DataFrame的列變成行索引的方法

    pandas將DataFrame的列變成行索引的方法

    下面小編就為大家分享一篇pandas將DataFrame的列變成行索引的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04

最新評論