日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

转:一个PHP实现的ID生成器

發布時間:2025/3/20 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转:一个PHP实现的ID生成器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

通常來說,不管使用什么數據庫,表里都有一個名為 id 的主鍵,既然是主鍵,那么必然要滿足唯一性,對于 MySQL 用戶來說,它多半是一個 auto_increment 自增字段,也有一些別的用戶喜歡使用 UUID 做主鍵,不過對 MySQL(特別是 InnoDB)來說,UUID 通常不是一個好選擇,因為聚簇索引要求物理數據按照主鍵排序,而 UUID 本身是無序的,所以會帶來很多不必要的 IO 消耗。于是乎我們得到一個結論:ID 最好是順序的唯一值。

?

如此說來,就用 MySQL 的?auto_increment?自增字段不就好了?問題是這樣無法滿足高可用性,雖然可以通過多臺服務器設置不同的?auto_increment 步長來提升可用性,但數據庫本身始終就是那塊最短的木板。至于解決方案,網上已經有很多類似的討論:

  • 細聊分布式ID生成方法
  • 業務系統需要什么樣的ID生成器
  • 分布式Unique ID的生成方法一覽
  • 微信序列號生成器架構設計及演變

最流行的解決方案,當然是 twitter 的?snowflake,其大致含義是說:為了避免單點故障,在多個節點上運行 ID 生成器服務,每個節點都有自己獨立的標識,ID 以時間因子為前綴,雖然不同的服務器時間可能存在差異,不能保證絕對的順序,但是整體的趨勢還是可以認為是順序的,IO 負擔可以忽略,同時以一個計數器為后綴,從而保證唯一性。

網上現有的開源 ID 生成器,比如?Chronos,都是運行為服務的形式,不過對我而言,這樣有些太重了,于是我用 PHP?實現了一個非服務化的簡版 ID 生成器,雖然它很簡單,但是它并不簡陋,實現了 snowflake 要求的功能:

<?phpclass Sequence {const EPOCH = 1000000000;const TIME_BITS = 30;const NODE_BITS = 10;const COUNT_BITS = 20;private $node;public function __construct($node){$max = $this->max(self::NODE_BITS);if (is_int($node) === false || $node > $max || $node < 0) {throw new \InvalidArgumentException('node');}$this->node = $node;}public function generate($time = null){if ($time === null) {$time = time();}return ($this->time($time) << (self::NODE_BITS + self::COUNT_BITS)) |($this->node << self::COUNT_BITS) |($this->count($time));}public function restore($id){$binary = decbin($id);$position = -(self::NODE_BITS + self::COUNT_BITS);return array('time' => bindec(substr($binary, 0, $position)) + self::EPOCH,'node' => bindec(substr($binary, $position, - self::COUNT_BITS)),'count' => bindec(substr($binary, - self::COUNT_BITS)),);}private function time($time){$key = 'seq:time';if (apcu_fetch($key) === false && sleep(1) === 0) {apcu_add($key, $time);}$time -= self::EPOCH;$max = $this->max(self::TIME_BITS);if (is_int($time) === false || $time > $max || $time < 0) {throw new \InvalidArgumentException('time');}return $time;}private function count($time){$key = "seq:count:{$time}";while (!$count = apcu_inc($key)) {apcu_add($key, mt_rand(0, 9));}$max = $this->max(self::COUNT_BITS);if ($count > $max) {throw new \UnexpectedValueException('count');}return $count;}private function max($bits){return -1 ^ (-1 << $bits);} }?>

本文中的實現利用?apcu?來保存數據,但是并不需要以服務的形式存在。其中我們自定義了一個時間的原點,這樣時間的位數可以節省點兒,實際使用時,可以用項目立項的時間戳做為時間原點,這樣更有意義些。以 30 位時間為例,如果時間原點是 1000000000 的話,那么理論上最大值可以保存到 2035-09-18,此外我們給節點留了 10 位,計數器留了 20 位,理論上可以容納最多 1023 個節點,每個節點每秒最多?1048575 個 ID。這些閾值基本都足夠了,多半還沒到達上限,系統就已經掛了。

需要說明的是,如果使用秒級的時間,假設在一秒內重啟 php-fpm,那么有可能會產生不唯一的值,所以我在代碼里加上了 sleep(1) 的邏輯來規避此問題。另外,因為代碼里并沒有嚴格判斷服務器可能出現的時間回退問題,所以還是有可能產生不唯一的值,但需要滿足幾個條件:首先,服務器時間發生了回退;其次,回退后生成 ID 時的時間恰好在以前使用過;最后,服務器因為 LRU 等原因清除了相關的緩存。要滿足這些條件,基本是很難的。也就是說,對于絕大部分 PHP 項目而言,本文的代碼可以認為是足夠強壯的。

此外,生成的 ID 最好別直接用,不然別人可以反解出其中的數據,比如你有多少臺服務器等等,解決辦法是在應用層用?hashids?編碼及解碼,如此一來,數據庫里保存的還是原始的 ID(Bigint),但是用戶看到的卻是 HASH ID,從而更好的保護了數據的安全。

轉載于:https://www.cnblogs.com/dasn/articles/6048385.html

總結

以上是生活随笔為你收集整理的转:一个PHP实现的ID生成器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩中文字幕av电影 | 在线不欧美| 日本大胆裸体做爰视频 | 在线观看国产91 | 日韩一区二区视频在线播放 | 成人第四色 | 国产高清小视频 | 欧美aa在线 | 中文字幕免费观看 | 亚洲天堂三级 | 亚洲av无一区二区三区 | www色日本 | 成年人黄视频 | 天天综合网国产 | 国产女主播在线观看 | 精品福利视频导航 | 91成人精品一区在线播放 | 亚洲乱色熟女一区二区三区 | 91在线看黄 | 涩涩视频在线免费看 | 秋霞成人网 | 精品三级国产 | 亚洲资源网站 | 成人欧美一区二区三区在线播放 | 国产私密视频 | 九九激情网 | 麻豆网站免费观看 | 日本三级欧美三级 | 深夜激情网 | 91在线免费看片 | 嫩草影院在线免费观看 | 小镇姑娘国语版在线观看免费 | 99极品视频 | 国产天堂在线观看 | 人妻大战黑人白浆狂泄 | 日韩免费视频一区二区视频在线观看 | 日本黄色a级片 | 色哟哟日韩精品 | 四虎精品在永久在线观看 | 久久国产在线视频 | 韩国一区二区三区四区 | 香蕉视频在线免费播放 | 天天射日日射 | 日日干日日射 | 日本午夜精品理论片a级app发布 | 伊人称影院 | 亚洲精品韩国 | a天堂资源 | 99日韩| 亚洲国产欧美日韩 | 欧美大肥婆大肥bbbbb | 无码精品人妻一区二区三区漫画 | 国产麻豆91视频 | 性欧美18一19性猛交 | 97播播 | 99精品一区二区三区无码吞精 | 久操欧美| 鸥美毛片| 成人av电影在线观看 | 手机在线看片你懂的 | 成人黄色免费网址 | 国产一区二区三区高清视频 | 午夜8888 | 夜夜嗨一区二区三区 | 能看的黄色网址 | 中文字幕免费一区 | 蜜桃成熟时李丽珍在线观看 | 天天槽| 中国亚洲老头同性gay男男… | 中国女人毛片 | 色香蕉av | 少妇特黄一区二区 | 欧美乱大交 | 四虎av网址| 亚洲熟妇一区二区 | 日本不卡影院 | 成人午夜视频网站 | 在线观看日韩视频 | 性奶老妇 视频 | 国产一区二区小视频 | 午夜激情网站 | 国产精品区二区三区日本 | hs网站在线观看 | 国产精品影院在线观看 | 91av视频在线 | 欧美黄色xxx | 欧美午夜一区二区 | 成人国产 | 九一毛片 | 国产免费二区 | 2020亚洲男人天堂 | 成人亚洲区 | 农村黄色片 | 国产成人亚洲综合a∨婷婷 台湾a级片 | 一区二区三区国产在线观看 | 亚洲av无码专区首页 | 老太脱裤让老头玩ⅹxxxx | 国产在线拍揄自揄拍 | 午夜精品免费视频 |