国产美女精品自在线拍照片,欧美人与兽,欧美成人高清在线播放,欧美成人精品三级网站,两个人免费完整在线观看直播

三穗縣政務oa系統(tǒng):市轄區(qū)政府機關oa中解密hash算法:散列表、布隆過濾器和分布式一致性hash的原理與應用

時間:2024-11-27 13:04:10 信創(chuàng)OA資訊首頁


英國政府以國家安全為由調(diào)查nvidia收購arm案:

arm收購案已經(jīng)引起了全球監(jiān)管部門和競爭對手的嚴格審查。作者 | 來自鎂客星球的家衡早前nvidia以400億美元收購arm的提案已遭到高通等公司的反對,并且受到英國競爭和市場管理局(cma)的審查。 而就在當?shù)貢r間周一,英國政府網(wǎng)發(fā)布公告稱,英國將以國家安全為由,干預此樁收購案。 當?shù)孛襟w報道稱,英國文化大臣奧利弗·道登已下令采取進一步行動,他希望cma加強審查力度,開始進行“第一階段”調(diào)查以評估該收購交易有關競爭、管轄權等特定因素,并且提供一份關于反托拉斯和國家安全問題的報告。 在采訪中,道登這么說到:在仔細考慮了對arm的收購建議后,我今天以國家安全為由發(fā)出了干預通知。 我們希望支持我們蓬勃發(fā)展的英國科技產(chǎn)業(yè),并歡迎外國投資,但我們應該適當考慮這樣的交易對國家安全的影響。此前,cma就曾邀請有關方面就此次交易及其對當?shù)馗偁幍挠绊懱岢鲆庖姟?br>
英飛凌擬收購st半導體,或?qū)⒁卉S成為世界級半導體巨頭 | 熱點:

收購st后,英飛凌年銷售額將達到175億美元。根據(jù)歐洲媒體的最新消息,于德國慕尼黑成立的英飛凌擬收購st半導體公司。而本次收購如果成功的話,英飛凌將一躍成為世界級的半導體巨頭。 而英飛凌想要收購的st半導體公司是什么來頭呢?據(jù)了解,st半導體又稱為意法半導體集團,成立于1988年6月,是有意大利的sgs微電子公司和法國的thomson半導體公司合并而成。 目前,該公司是世界上最大的半導體公司之一。2017意法半導體集團全年凈收入83.5億美元,全年凈利潤則為8.02億美元。?英飛凌為了本次收購事宜可謂付出了不少努力。 因為,法國政府是st半導體公司最大的股東之一,其一直反對st半導體公司被英飛凌收購。法國政府更希望st半導體公司去提升自身的業(yè)務規(guī)模,而非依靠收購并的方式進行資本的擴張。 而兩家合并成功的話,收購st后的英飛凌年銷售額將達到175億美元。同時,在去年全球半導體供貨商排行榜中,英飛凌位于第四,st半導體公司位于第五。

“錢塘工業(yè)百科”正式發(fā)布 ——錢塘數(shù)據(jù)完成平臺矩陣部署:

目前錢塘大數(shù)據(jù)交易平臺是國內(nèi)最大規(guī)模的工業(yè)信息數(shù)據(jù)聚合平臺,近1000家數(shù)據(jù)供應商入駐,基于數(shù)據(jù)形成了500余份應用報告并服務于2000多家企業(yè)用戶。 錢塘號基于大數(shù)據(jù)技術,借助對工業(yè)全產(chǎn)業(yè)鏈資源的整合運營支持,打造新媒體、制造企業(yè)、制造相關服務商等“金三角”垂直資源生態(tài)圈。 錢塘號實現(xiàn)與工業(yè)行業(yè)的全程供應鏈、全域生產(chǎn)服務的媒體、電商和機構、組織的共享、互推、互通。錢塘號完成了工業(yè)領域的信息結合、互動和融媒傳播。 目前已成功推出中國電影行業(yè)招商大數(shù)據(jù)云服務平臺、浦江水晶行業(yè)大數(shù)據(jù)云服務平臺等。其中浦江水晶云平臺已成為浙江省委省政府支持的浦江“四個全面試點”建設重點項目之一。 整合制造加工、研發(fā)設計、金融服務、市場銷售等功能資源,打造水晶行業(yè)產(chǎn)業(yè)資訊、水晶數(shù)據(jù)分析應用、水晶知識產(chǎn)權交易等服務。四、錢塘工業(yè)百科?

浙江大學近五年科研發(fā)展報告:

oa文章數(shù)目?oa文章比例?2015年-2019年各年發(fā)文量最多的雜志以及發(fā)表在此雜志的數(shù)量?????2015-2019年國自然數(shù)量?2015-2019年國自然金額? 2019年國自然金額大于100萬元項目 植物信號轉(zhuǎn)導,徐娟,120萬元 神經(jīng)生物學,崔一卉,120萬元 單細胞技術,韓曉平,120萬元 農(nóng)業(yè)農(nóng)藥殘留信息感知,平建峰,120萬元 生防細菌與赤霉病菌互作機制研究

三穗縣政務政務OA系統(tǒng):市轄區(qū)政府機關oa中解密hash算法:散列表、布隆過濾器和分布式一致性hash的原理與應用

p的特點、優(yōu)勢及其在企業(yè)數(shù)字化轉(zhuǎn)型中的作用進行深入探討。一、移動協(xié)同OA辦公系統(tǒng)app的特點 移動協(xié)同OA辦公系統(tǒng)app是在傳統(tǒng)政務OA系統(tǒng)的基礎上,充分利用移動互聯(lián)網(wǎng)技術而研發(fā)的新一代辦公管理系統(tǒng)。它主要具有以下幾個鮮明特點:移動化辦公:移動協(xié)同OA辦公系統(tǒng)app可以實現(xiàn)隨時隨地的移動辦公,無論在辦公室還是外出在路上,員工都可以通過智能手機、平板電腦等移動終端高效地完成各項工作任務。這大大提高了員工的工作效率和靈活性。協(xié)同化管理:移動協(xié)同OA辦公系統(tǒng)app集成了流程審批、任務管理、即時通訊等功能,實現(xiàn)了企業(yè)內(nèi)部各部門、各崗位之間的高度協(xié)同,打通了信息island,提升了企業(yè)的整體協(xié)作能力。智能化辦公:移動協(xié)同OA辦公系統(tǒng)app融合了大數(shù)據(jù)、云計算、人工智能等前沿技術,可以為企業(yè)提供智能化的辦公一、背景知識 在了解hash算法之前,先思考如下問題: 使用 word 文檔時,word 如何判斷某個單詞是否拼寫正確? 網(wǎng)絡爬蟲程序,怎么讓它不去爬相同的 url 頁面? 垃圾郵件過濾算法如何設計? 公安辦案時,如何判斷某嫌疑人是否在網(wǎng)逃名單中? 緩存穿透問題如何解決? 了解平衡二叉樹: 平衡二叉樹查找數(shù)據(jù)采用二分查找,每次查找排除一半。平衡的目的是增刪改之后,保證下次搜索能夠穩(wěn)定排除一半的數(shù)據(jù)。 平衡二叉樹增刪改查的時間復雜度為o(log2?n)。比如,100萬個節(jié)點,最多比較 20 次;10 億 個節(jié)點,最多比較 30 次; 平衡二叉樹通過比較保證有序,通過每次排除一半的元素達到快速索引的目的。 二、散列表 平衡二叉樹通過比較讓結構有序,從而提升收搜索效率。在平衡二叉樹中,搜索數(shù)據(jù)時總是對key進行比較,如果在海量數(shù)據(jù)中使用這種方式,搜索效率會很低。 相較于平衡二叉樹,散列表是一種不比較key,而是根據(jù)key計算key在表中的位置的數(shù)據(jù)結構;是key和其所在存儲地址的映射關系。散列表通過此方式達到快速索引的目的。 注意:散列表的節(jié)點中key-value是存儲在一起的。 代碼語言:javascript 復制 struct node { void *key; void *val; struct node *next; }; 2.1、散列表的構成 (1)hash函數(shù)。hash函數(shù)的作用是映射,把key映射到具體存儲的位置,通過key找到其存儲地址。 (2)數(shù)組。key通過hash函數(shù)找到數(shù)組的位置(hash出來的值要對數(shù)組長度取余),該位置就是存儲key-value的地方。 2.2、hash函數(shù) 映射函數(shù) hash(key)=addr;hash 函數(shù)可能會把兩個或兩個以上的不同 key 映射到同一地址,這種情況稱之為沖突(或者hash 碰撞);hash函數(shù)的作用是將key映射為地址。 注意,hash函數(shù)可能會把兩個或兩個以上的不同key映射到同一地址,這種現(xiàn)象稱為hash沖突。 hash函數(shù)的選擇: 計算速度快。因為如果計算速度慢,還不如直接比較key。 強隨機分布(等概率、均勻地分布在整個地址空間) 常用的hash函數(shù): murmurhash1:速度快、但質(zhì)量一般。 murmurhash2:速度比較快、質(zhì)量比較好,因此是使用最廣泛的一種。 murmurhash3:計算速度慢,但質(zhì)量是最好的。 siphash: redis6.0 當中使用,rust 等大多數(shù)語言選用的 hash 算法來實現(xiàn) hashmap。 cityhash 等都具備強隨機分布性。 不同hash算法的效率、速度、質(zhì)量測試:測試地址。 siphash 主要解決字符串接近的強隨機分布性 。 2.3、散列表的操作流程 散列表的插入操作和搜索操作都要經(jīng)過hash函數(shù)找到key對應的存儲地址。首先,key經(jīng)過hash函數(shù)hash(key)得到一個64bit或32bit的整數(shù)maddr;然后maddr對數(shù)組長度取余,得到的值就是存儲節(jié)點的位置。 插入流程:key-value對要存儲到散列表中,首先將key通過hash函數(shù)進行hash,生成64位或32位的一個整數(shù);然后利用這個整數(shù)對數(shù)組長度進行取余,得到的值必定能落在數(shù)組的某個槽位中;最后在該槽位增加一個節(jié)點,完成數(shù)據(jù)的存儲池。 搜索流程:同樣的,也是通過將key通過hash函數(shù)進行hash運算生成一個64位或32位的整數(shù);然后利用這個整數(shù)對數(shù)組長度進行取余,得到該值所在數(shù)組的某個槽位。 hans運算是一個線性運算,相同的key通過運算后得到的值總是相同的。相同的值對數(shù)組長度取余必定落在相同的數(shù)組槽位。 散列表的指針數(shù)組通常是動態(tài)增加的過程,最開始定義的數(shù)組長度為4,當數(shù)據(jù)增多時將長度翻倍變成8,以此類推,16、32、… 。隨著刪除元素越來越多,散列表的數(shù)組長度也會自動縮小。 注意,散列表是無序的,通過犧牲有序性來提高它的效率。而平衡二叉樹是通過保證有序性來提高它的搜索效率。散列表通過映射的關系不保證有序性,但可以查詢某個節(jié)點在哪個位置。 2.4、hash沖突 沖突產(chǎn)生原因: 在數(shù)組大小不變情況下,隨著添加的元素(數(shù)據(jù))的越來越多,必然產(chǎn)生沖突;而且hash是隨機性的,這也可能會產(chǎn)生沖突。 比如把n+1個元素放入n大小的數(shù)組,勢必有一個空間需要存放兩個元素,這就是沖突。另外,hash是隨機的,產(chǎn)生的數(shù)對數(shù)組長度取余很可能相同,這也會沖突。 舉個經(jīng)典的數(shù)學原理:抽屜原理。桌上有十個蘋果,要把這十個蘋果放到九個抽屜里,無論怎樣放,我們會發(fā)現(xiàn)至少會有一個抽屜里面放不少于兩個蘋果。這一現(xiàn)象就是我們所說的“抽屜原理”。 抽屜原理的一般含義為:“如果每個抽屜代表一個集合,每一個蘋果就可以代表一個元素,假如有n+1個元素放到n個集合中去,其中必定有一個集合里至少有兩個元素?!?抽屜原理有時也被稱為鴿巢原理。它是組合數(shù)學中一個重要的原理。 hash沖突的定義:多個key經(jīng)過hash函數(shù),然后對數(shù)組長度取余,落在同一個數(shù)組槽位,這時就產(chǎn)生沖突。 描述hash沖突激烈程度和存儲密度的參數(shù)/系數(shù):負載因子。負載因子用于描述沖突的激烈程度和存儲的密度;負載因子越小,沖突概率越小,負載因子越大,沖突概率越大。 計算公式:負載因子=數(shù)組存儲元素的個數(shù) / 數(shù)組長度。 2.5、hash沖突的處理 解決沖突的方法有很多,開源框架中比較常用的有:鏈表法 / 拉鏈法、開放尋址法等。 一般,鏈表法和開放尋址法適用于負載因子在合理范圍內(nèi)的情況,即數(shù)組存儲元素的個數(shù)小于數(shù)組長度的情況。 (1)鏈表法 / 拉鏈法。 使用場景:redis、stl的unordered_*系列、java的一些容器中 等等。 鏈表法是常用的處理沖突的方式。通過引用鏈表來處理hash沖突;散列表中的數(shù)組是指針數(shù)組,通過一個鏈表,將落在同一個槽位的元素連接起來;即將沖突元素用鏈表鏈接起來。 但可能出現(xiàn)極端情況,沖突元素比較多,該沖突鏈表過長;這個時候可以考慮將鏈表轉(zhuǎn)換為紅黑樹、最小堆;由原來鏈表時間復雜度o(n)o(n)轉(zhuǎn)換為紅黑樹時間復雜度o(log?2n)o(log2?n);可以采用超過 256(經(jīng)驗值)個節(jié)點的時候?qū)㈡湵斫Y構轉(zhuǎn)換為紅黑樹或堆結構。 (2)開放尋址法。使用場景:布隆過濾器。 開放尋址法將所有的元素都存放在哈希表的數(shù)組中(這個數(shù)組不再是指針數(shù)組),不使用額外的數(shù)據(jù)結構。一般使用線性探查的的思路解決: 當插入新元素時,使用hash函數(shù)在hash表中定位元素的位置; 檢查數(shù)組中該槽位索引是否存在元素,如果該槽位為空,則插入數(shù)據(jù),否則進入(3)。 在第二點檢測的槽位索引上加一定步長接著檢查第二點;加步長有以下幾種: i+1,i+2,i+3,i+4,…,i+n。這種方式缺點比較大,當key非常接近時,落在數(shù)組的槽位都是非常接近的,一直往下找就可能造成由o(1)的時間復雜度退化成o(n)的時間復雜度。 i-1212,i+2222,i-3232,i+4242,…。對上面的方式進行改進,雖然可以緩解hash聚集,但不能解決hash聚集問題。當hash聚集多了之后,也會慢慢的生成hash聚集問題。 雙重hash。解決hash聚集現(xiàn)象,本質(zhì)上是線性探查的的思路。 前兩種都會產(chǎn)生同類hash聚集,也就是近似值它的hash值也近似,那么它的數(shù)組槽位也靠近,形成 hash 聚集;第一種同類聚集沖突在前,第二種只是將聚集沖突延后; 可以使用雙重哈希來解決上面出現(xiàn)hash聚集現(xiàn)象。比如,在.net hashtable類的hash函數(shù)hk定義如下: hk(key) = [gethash(key) + k * (1 +(((gethash(key) >> 5) + 1) %(hashsize – 1)))] % hashsize 在此 (1 + (((gethash(key) >> 5) + 1) %(hashsize – 1))) 與 hashsize互為素數(shù)(兩數(shù)互為素數(shù)表示兩者沒有共同的質(zhì)因?);執(zhí)?了 hashsize 次探查后,哈希表中的每?個位置都有且只有?次被訪問到,即對于給定的 key,對哈希表中的同?位置不會同時使?hi 和 hj。 (3)擴容和縮容。 上面兩種解決hash沖突的方式都是負載因子在合理范圍內(nèi)的情況。當負載因子不在合理范圍內(nèi)是,即數(shù)組存儲元素的個數(shù)大于數(shù)組長度的情況,可以使用擴容和縮容的方式避免hash沖突。 當used > size,即要使用的空間大于數(shù)組的長度,這時就需要通過擴容來避免或降低沖突。擴容通常采用翻倍擴容。 當used < 0.1 * size,即要使用的空間遠遠小于數(shù)組的長度,這時就需要縮容;縮容不能解決沖突,只能節(jié)約空間,減少內(nèi)存浪費。 rehash,重新hash。因為容量發(fā)生了改變,前面解釋過key在數(shù)組的位置是通過key % size的方式;所以,需要重新做key % new_size找到key的槽位,然后重新放到新的數(shù)組中去。 2.6、stl unordered_* 散列表的實現(xiàn) 在 stl 中 unordered_map、unordered_set、unordered_multimap、unordered_multiset 四個容器的底層實現(xiàn)都是散列表。 一般,hash table里面的槽位單獨通過鏈表串聯(lián)所屬槽位的數(shù)據(jù);stl散列表的槽位指針不再這么做,而是做了優(yōu)化:將后面具體結點串成一個單鏈表,而槽位指針指向上一個的結點。 unordered_map的類定義如下: 代碼語言:javascript 復制 template<class _key, class _tp, class _hash = hash<_key>, class _pred = std::equal_to<_key>, class _alloc = std::allocator<std::pair<const _key, _tp> > > class unordered_map { typedef __umap_hashtable<_key, _tp, _hash, _pred, _alloc> _hashtable; _hashtable _m_h; } 看下_hashtable具體定義: 代碼語言:javascript 復制 template<bool _cache> using __umap_traits = __detail::_hashtable_traits<_cache, false, true>; template<typename _key, typename _tp, typename _hash = hash<_key>, typename _pred = std::equal_to<_key>, typename _alloc = std::allocator<std::pair<const _key, _tp> >, typename _tr = __umap_traits<__cache_default<_key, _hash>::value>> using __umap_hashtable = _hashtable<_key, std::pair<const _key, _tp>, _alloc, __detail::_select1st, _pred, _hash, __detail::_mod_range_hashing, __detail::_default_ranged_hash, __detail::_prime_rehash_policy, _tr>; 舉個例子: 現(xiàn)在的hash table是空的,還沒有數(shù)據(jù)插入,當?shù)谝粋€hash(key) % array_size插入時,假設這個hash(key) % array_size=4,那么4的_hash_node_base*指向頭指針_m_before_begin,_m_before_begin.next等于新插入的_hash_node_base*;后面又來一個插入,假設hash(key) % array_size=1,那么1的_hash_node_base*指向頭結點_m_before_begin,_m_before_begin.next等于新插入的_hash_node_base*,新插入的_hash_node_base.next等于4的_hash_node_base,4的槽位指針指向新插入的_hash_node_base*。目的是將所有的節(jié)點串成一個單鏈表,以便實現(xiàn)迭代器。當前槽位的指針指向上一個槽位的位置是為了方便進行頭插法。 2.7、小結 散列表需要掌握的知識點: 散列表與其他數(shù)據(jù)結構的比較,比如平衡二叉樹。平衡二叉樹通過比較key,增、刪、改操作都要保證結構有序,穩(wěn)定搜索時間復雜度在o(log2n)o(log2?n)(二分查找)。而散列表是找key與存儲位置的映射關系,整個過程是無序的。 散列表的組成:hash函數(shù)、數(shù)組、運算流程/算法;確定映射關系。 函數(shù)函數(shù)有映射的作用,選擇hash時需要注意幾點:計算速度快、強隨機分布性。常用的hash函數(shù)會選擇murmurhash2、cityhash、siphash。 散列表操作流程是根據(jù)hash(key) % size = index找到存儲位置。既使參數(shù)hash沖突了,鏈表法的解決方案還是需要通過比較key來找到value。java的hashmap會將其組織成一個最小堆結構,因為單鏈表的時間復雜度是o(n),通過將其轉(zhuǎn)換為紅黑樹或堆的數(shù)據(jù)結構可以將時間復雜度降低到o(log2n)o(log2?n)。這是一種優(yōu)化思路。 hash沖突中需要注意負載因子的重要性,以及解決沖突的方式。負載因子在合理范圍內(nèi)(負載因子小于1)可以使用鏈表法或開放尋址法解決hash沖突。負載因子不在合理范圍內(nèi)則可以使用擴容并進行rehash來解決hash沖突。 注意stl散列表的優(yōu)化方案。 三、布隆過濾器 (bloom filter) 3.1、背景 無論是使用散列表還是平衡二叉樹(紅黑樹、b樹、b+樹等)的數(shù)據(jù)結構,都存儲了key-value值。而有些場景,內(nèi)存是有限的,僅需要了解key是否存在,不想知道具體內(nèi)容(value)。這時就需要布隆過濾器。 布隆過濾器是一種概率型數(shù)據(jù)結構,它的特點是高效的插入和查詢,能確定某個字符串一定存在或者可能存在。 布隆過濾器不存儲具體數(shù)據(jù),所以占用空間小,查詢結果存在誤差,但誤差可控,同時不支持刪除操作。 布隆過濾器的使用場景: (1)一個巨大的數(shù)據(jù)文件,需要知道是否存在某個key,如果把整個文件讀取進行查找,這個效率就比較低。那么可以添加一個布隆過濾器,插入數(shù)據(jù)時對key做標識,查詢key是否存在時直接查詢key是否在布隆過濾器,從而判斷key是不是存在文件中。布隆過濾器僅僅只能判斷key是否存在,不能獲得value值。 (2)一個數(shù)據(jù)庫查詢,想要查詢數(shù)據(jù)庫中是否存在key,可以添加一個布隆過濾器,查詢key時直接查詢布隆過濾器,不需要io操作,大大提升查詢效率。 3.2、布隆過濾器的構成 布隆過濾器的原理本質(zhì)上和散列表是一樣的。但布隆過濾器為了節(jié)約內(nèi)存,不是使用的數(shù)組,而是使用的位圖(bitmap)。位圖的特點是它的槽位只有兩種狀態(tài):0或者1。 (1)位圖。bit的數(shù)組,實現(xiàn)方式有多種。 代碼語言:javascript 復制 // 例如 vector<char> bitmap;// 一個字節(jié),8個bit位 uint64_t bitmap; (2)n個hash函數(shù)。 映射關系計算公式:m % 2n2n = m &(2n?12n?1) 舉例: 使用byte buf[8]構建64 bit 的位圖,那么n=i*8+j;假設hash(key)=173,先對總長度8×88×8 = 64取余:n=173%64=173&63=45;然后對寬度8進行取余:j=n%8=45%8=5;最后再對寬度8進行整除:i=n/8=45/8=5。因此得到坐標(5,5)位置將其置 1。 3.3、布隆過濾器原理 當一個元素加入位圖時,通過k個hash函數(shù)將元素映射到位圖的k個點,并把它們置1;當檢索時,再通過k個hash函數(shù)運算檢查位圖的k個點是否都為1;如果有不為1的點,那么認為該key不存在;如果全部為1,則可能存在。 布隆過濾器是不支持刪除操作的,原因在于: 在位圖中每個槽位只有兩種狀態(tài)(0或者1),一個槽位被置為1,但不確定它被設置了多少次;也不知道被多少個key hash映射而來;以及具體被哪個hash函數(shù)映射而來。 只要有一個槽位為0,則key一定不存在;如果key映射的所有槽位都為1,不能說明一定存在,只能說明可能存在(假陽率)。 如上圖,位圖長度未知,有兩個key,三個hash函數(shù)。這個怎么進行操作的呢? 存儲:首先將str1分別依次對三個hash函數(shù)進行hash,然后就可以在位圖中鎖定三個存儲位置并相應的置為1。str2也同樣的經(jīng)過三個hash函數(shù)得到三個存儲位置并相應的置為1。 搜索:將key通過三個hash函數(shù)進行hash,找到在位圖上具體的位置,只要發(fā)現(xiàn)其中有一個位置的值為0,則這個key肯定不存在;因為如果key存在,那么所有位置都應該是1。注意,即使所有都為1,不能說明該key一定存在,因為有假陽率。 布隆過濾器可以判斷一個key一定不存在,不能判斷一個key一定存在。布隆過濾器中的位圖大小遠遠大于要存儲的數(shù)據(jù)。 布隆過濾器的假陽率是可控的,可以通過配置來控制假陽率。 3.4、應用場景 前面介紹了布隆過濾器的原理,除了原理還需要掌握如何利用布隆過濾器解決實際問題。布隆過濾器通常用于判斷某個 key 一定不存在的場景,同時允許判斷存在時有誤差的情況。 常見處理場景: 緩存穿透的解決。 熱 key 限流。 緩存場景:為了減輕數(shù)據(jù)庫(mysql)的訪問壓力,在server 端與數(shù)據(jù)庫(mysql)之間加入緩存用來存儲熱點數(shù)據(jù)。 緩存穿透:server端請求數(shù)據(jù)時,緩存和數(shù)據(jù)庫都不包含該數(shù)據(jù),最終請求壓力全部涌向數(shù)據(jù)庫。 數(shù)據(jù)請求步驟,如圖中 2 所示: 先訪問redis,如果存在則直接返回,如果不存在則走2訪問數(shù)據(jù)庫; 訪問數(shù)據(jù)庫,如果不存在直接返回,如果存在則將mysql存在的key寫回redis。 發(fā)生原因:黑客利用漏洞偽造數(shù)據(jù)攻擊或者內(nèi)部業(yè)務 bug 造成大量重復請求不存在的數(shù)據(jù)。 解決方案,如圖中 3 所示: 在redis設置<key,null>鍵值對,依次避免訪問數(shù)據(jù)庫;缺點是<key,null>過多會占用過多內(nèi)存,可以給key設置過期expire key 600ms,停止攻擊后最終由redis自動清除無用的key。 在服務端(server)存儲一個布隆過濾器,將mysql存在的key放入布隆過濾器中,布隆過濾器可以過濾一定不存在的數(shù)據(jù)。 3.5、應用分析 在實際應用中,該選擇多少個 hash 函數(shù)?要分配多少空間的位圖?預期存儲多少元素?如何控制誤差? 通常有四個參數(shù)可以控制布隆過濾器。 n : 預期布隆過濾器中元素的個數(shù),如上圖 只有str1和str2 兩元素 那么 n=2。 p : 假陽率,在0-1之間。 m: 位圖所占空間。 k : hash函數(shù)的個數(shù)。 可以使用如下公式計算: n = ceil(m / (-k / log(1 - exp(log§ / k)))) p = pow(1 - exp(-k / (m / n)), k) m = ceil((n * log(p)) / log(1 / pow(2, log(2)))); k = round((m / n) * log(2)); 這些公式的證明這里就不展開了,這里主要從應用的角度介紹它們。 (1)假陽率p會隨著插入元素的增多而逐漸變高。 (2)假陽率p會隨著位圖所占空間的增大而減小。 (3)假陽率p會隨著hash函數(shù)個數(shù)增多,呈現(xiàn)快速減小后緩慢增長的趨勢。hash函數(shù)個數(shù)在31時假陽率最低。這里可以驗證一個結論:在hash函數(shù)中,在31處出現(xiàn)沖突的概率最低。 在實際使用布隆過濾器時,首先需要確定 n 和 p,通過上面的運算得出 m 和 k;推薦一個布隆過濾器計算器可以選出合適的值。 選擇hash函數(shù): 選擇一個 hash 函數(shù),通過給 hash 傳遞不同的種子偏移值,采用線性探尋的方式構造多個 hash 函數(shù)。 代碼語言:javascript 復制 #define mix_uint64(v) ((uint32_t)((v>>32)^(v))) uint64_t hash1 = murmurhash2_x64(key, len, seed); uint64_t hash2 = murmurhash2_x64(key, len,mix_uint64(hash1)); for (i = 0; i < k; i++) // k 是hash函數(shù)的個數(shù) { pos[i] = (hash1 + i*hash2) % m; // m 是位圖的?? } 所謂不同的hash函數(shù)主要是seed不一樣創(chuàng)造出來的。在實際應用中會有一個seed表,用于不斷的計算偏移值。每次生成hash函數(shù)的時候會把seed值修改,通過不同的數(shù)值運算來得到hash函數(shù)。在使用過程中會先填充一個隨機種子,然后進行偏移計算,最終得到所需的hash函數(shù)。 3.6、布隆過濾器的實際使用 為了避免篇幅過長,代碼已經(jīng)上傳到gitee,感興趣可以點擊了解。里面包含布隆過濾器的實現(xiàn)源碼和三個使用示例。 布隆過濾器的接口分為兩個部分: 計算所需的四個參數(shù):n、p、m、k;主要是根據(jù)n、和p計算出m和k。利用一個類封裝好,包含計算m、k的值。 布隆過濾器。會準備一個位圖,實現(xiàn)插入元素的接口,定義hash函數(shù)的最大個數(shù),確定布隆過濾器的長度,預期插入元素的個數(shù),已經(jīng)插入元素的個數(shù),seed隨機值,具體的假陽率等等。 使用過程:先插入,然后contain。 3.7、小結 布隆過濾器的特征: 能確定一個key一定不存在,可控假陽率確定存在。 不能刪除。可以通過準備兩個布隆過濾器來解決刪除時也降低假陽率,添加放在第一個布隆過濾器,刪除放在第二個布隆過濾器。判斷key是否存在時先判斷key是否在第二個布隆過濾器(目的是檢查之前是否刪除過該key),如果之前刪除過該key,就可以將該key加入第一個布隆過濾器。 使用過程中根據(jù)n和p計算出m和k。hash函數(shù)的生成使用開放尋址法進行。 四、分布式一致性hash 分布式一致性hash主要解決分布式緩存中的擴容問題。 4.1、背景 假設一個服務器,只有一個緩存結點,當存儲的數(shù)據(jù)越來越多時,效率就越來越低,這時就需要增加結點進行分流分壓。那么如何實現(xiàn)優(yōu)雅的擴容(數(shù)據(jù)隨機、均勻分布)?首先想到使用hash方法解決,但擴容時(增加結點)會出現(xiàn)算法改變;比如原來有n個結點,key通過hash(key)%n確定存儲在哪個結點,現(xiàn)在添加新的結點變成了n+1,key通過hash(key)%(n+1)尋找存儲結點就會出現(xiàn)緩存失效。 分布式一致性hash就解決了緩存擴容的問題。為解決緩存失效,首先會固定算法;然后改變查找節(jié)點的映射關系。 分布式一致性hash算法將hash空間組織成一個虛擬的圓環(huán),圓環(huán)大小為232232 。 算法為:hash(ip) % 232232,最終會得到一個 [0, 232?1232?1] 之間的一個無符號整型,這個整數(shù)代表服務器的編號;多個服務器都通過這種方式在 hash 環(huán)上映射一個點來標識該服務器的位置;當用戶操作某個 key,通過同樣的算法生成一個值,沿環(huán)順時針定位某個服務器,那么該 key 就在該服務器中。 4.2、一致性hash原理 (1)映射空間可抽象為一個環(huán),長度為232232,范圍為[0, 232?1232?1],每個服務器節(jié)點根據(jù)自己的哈希值被映射到這個環(huán)上; (2)判斷一條數(shù)據(jù)屬于哪個服務器節(jié)點的方法:根據(jù)數(shù)據(jù)的哈希值,去哈希環(huán)找到第一個大于等于數(shù)據(jù)哈希值的機器(可以理解為離它最近)。如果數(shù)據(jù)的哈希值大于當前最大的機器哈希值,那么就把這個數(shù)據(jù)放在位置最靠前(哈希值最小)的機器上,因為是一個環(huán)。 (3)為了解決實際機器過少導致的數(shù)據(jù)傾斜問題(例如目前一共3個機器,機器a、b的哈希值分別為1和2,而另一個機器c的哈希值為 2^32-1,那么大部分的數(shù)據(jù)都會被分給機器c),引入了虛擬節(jié)點概念,虛擬節(jié)點相當于真實節(jié)點的分身,一個真實節(jié)點可以有很多個虛擬節(jié)點,當數(shù)據(jù)被分配給這些虛擬節(jié)點時,本質(zhì)上是分給這個真實節(jié)點的。由于數(shù)量變多了,數(shù)據(jù)分布的均衡性會有所提高; (4)新增節(jié)點時:例如原本的節(jié)點哈希值列表為[1,100,500,1000],新增節(jié)點800后,在501~799范圍內(nèi)的數(shù)據(jù)原本是分給哈希值為1000的節(jié)點的,現(xiàn)在要把這部分數(shù)據(jù)遷移到節(jié)點800; (5)刪除節(jié)點:例如原本的節(jié)點哈希值列表為[1,100,500,800,1000],刪除節(jié)點500后,原本范圍是101~500的數(shù)據(jù)要遷移到節(jié)點800. 4.3、應用場景 (1)分布式緩存;將數(shù)據(jù)均衡地分散在不同的服務器當中,用來分攤緩存服務器的壓力; (2)解決緩存服務器數(shù)量變化盡量不影響緩存失效. 4.4、hash偏移 hash算法得到的結果是隨機的,不能保證服務器節(jié)點均勻分布在hash環(huán)上;分布不均造成請求訪問不均勻,服務器承受的壓力不均勻。 為了解決實際機器過少導致的數(shù)據(jù)傾斜問題(例如目前一共3個機器,機器a、b的哈希值分別為1和2,而另一個機器c的哈希值為 2^32-1,那么大部分的數(shù)據(jù)都會被分給機器c),引入了虛擬節(jié)點概念,虛擬節(jié)點相當于真實節(jié)點的分身,一個真實節(jié)點可以有很多個虛擬節(jié)點,當數(shù)據(jù)被分配給這些虛擬節(jié)點時,本質(zhì)上是分給這個真實節(jié)點的。由于數(shù)量變多了,數(shù)據(jù)分布的均衡性會有所提高; 4.5、hash遷移 新增節(jié)點時,例如原本的節(jié)點哈希值列表為[1,100,500,1000],新增節(jié)點800后,在501~799范圍內(nèi)的數(shù)據(jù)原本是分給哈希值為1000的節(jié)點的,現(xiàn)在要把這部分數(shù)據(jù)遷移到節(jié)點800。 4.6、虛擬結點 為了解決哈希偏移的問題,增加了虛擬節(jié)點的概念;理論上,哈希環(huán)上節(jié)點數(shù)越多,數(shù)據(jù)分布越均衡;為每個服務節(jié)點計算多個哈希節(jié)點(虛擬節(jié)點);通常做法 是,hash(“ip:port:seqno”) %232232。 添加虛擬節(jié)點解決了哈希偏移的問題,同時使hash遷移的數(shù)據(jù)量變?。贿@對工程應用來說是非常重要的,因為在做數(shù)據(jù)遷移的過程中,整個系統(tǒng)是不能提供服務的。 五、思考 (1)只用 2gb 內(nèi)存在 20 億個整數(shù)中找到出現(xiàn)次數(shù)最多的數(shù)? 關鍵點,內(nèi)存有限、海量數(shù)據(jù)、次數(shù)最多。要找出現(xiàn)次數(shù)最多,那么就一定要統(tǒng)計,使用key-value鍵值對,key保存整數(shù),value保存出現(xiàn)次數(shù)。統(tǒng)計可以使用散列表來解決。 對于key-value鍵值對,key是整數(shù)占4字節(jié),如果按照最壞情況(即1個整數(shù)出現(xiàn)20 億次),value可以使用uint32存儲(uint32可達21億多,剛好能存儲下20億),uint32也是占4字節(jié);因此一個key-value對占8個字節(jié)。如果要在內(nèi)存中處理20億個數(shù)據(jù)就需要2000000000×8=16gb2000000000×8=16gb內(nèi)存,超出2gb內(nèi)存的限制。 要在有限內(nèi)存里處理,可以采用拆分的思維,將20億拆分成若干等份。那么采用什么策略來拆分?首先要清楚,20億的數(shù)據(jù)是散列分布的,不能采用等分的方式,我們的目的要把相同的整數(shù)放在同一個文件中,hash函數(shù)可以實現(xiàn)這個目的(相同的key經(jīng)過hash得到的值總是相同)。 一個hash函數(shù)兩個用途,一方面是對數(shù)據(jù)拆分將相同整數(shù)放入同一個文件或等份,另一方面將其應用到散列表中(散列表的存儲數(shù)據(jù)取余)。hash函數(shù)具有強隨機性,數(shù)據(jù)屬于海量數(shù)據(jù),那么數(shù)據(jù)拆分多少份?可以計算最差情況需要拆分多少份和最好的情況需要拆分多少份,如果隨機性不能達到預期,再增加份數(shù)。 比如,將20億拆分為10份(如果不能達到預期的隨機性再增大),平均的情況是每份2億,具體情況再具體調(diào)整。 六、總結 分布式一致性hash算法通過固定算法,改變查找結點的映射關系,數(shù)據(jù)遷移,避免緩存失效,解決分布式擴容的問題;通過虛擬節(jié)點的方式保證數(shù)據(jù)均衡。 在大數(shù)據(jù)中,涉及到大文件或海量數(shù)據(jù)的,解決方案都是通過hash將大文件拆分為小文件;涉及單臺機器無法承受或處理不過來的問題,解決方案都是通過hash分流到多臺機器;選擇hash的原因是利用其強隨機分布的特性,以及把相同的數(shù)據(jù)分配到相同的位置。

亮相一周年,騰訊智慧零售的進化論:

傳統(tǒng)零售商在漫長的業(yè)務實踐中總結了一套經(jīng)營產(chǎn)品的法則,但他們并不懂得如何經(jīng)營“人”,或者說過去的技術并不支持他們經(jīng)營“人”。 在騰訊副總裁林璟驊看來,消費者的數(shù)字化是零售業(yè)變革的源動力,將推動“人”、“貨”、“場”關系的重構。首先,消費者被全方位數(shù)字化后,成了一個實時在線的角色,可以被隨時觸達。 過去幾年里我們在零售行業(yè)看到的幾乎所有新鮮事物,包括無人便利店、會員識別系統(tǒng)、智能營銷大屏、虛擬試衣鏡等等,本質(zhì)上都是在利用各種物聯(lián)網(wǎng)設備將消費者的線下行為數(shù)字化。這也是騰訊智慧零售正在做的事情。 只不過相比創(chuàng)業(yè)公司布局無人便利店、會員人臉識別系統(tǒng)等,騰訊采用的是一種更輕的模式,即利用微信支付、社交廣告、小程序等工具連接人與商業(yè)。以騰訊和沃爾瑪合作的“掃瑪購”為例。 公司最為倚重的兩大收入版塊——增值服務和游戲收入、社交媒體和廣告收入同時受挫。其中作為騰訊收入支柱的游戲業(yè)務,受到政策嚴管。

2016大數(shù)據(jù)行業(yè)的變與不變:

幾個月后,由中國計算機協(xié)會(ccf)大數(shù)據(jù)專家委員會編撰的第三版關于大數(shù)據(jù)的白皮書將發(fā)布,ccf大數(shù)據(jù)專家委員會副秘書長潘柱延卻“提前泄密”,他分析了大數(shù)據(jù)行業(yè)的幾個關鍵詞:民生、多樣性和融合性、政策拉動 ccf大數(shù)據(jù)專家組認為,該綱要將對大數(shù)據(jù)的發(fā)展起到推動性的作用,成為大數(shù)據(jù)產(chǎn)業(yè)快速發(fā)展的催化劑和政策標桿,也將推動地方政府出臺類似的配套政策。 潘柱延指出:“除了學術、技術、商業(yè)的推動外,政策的扶持會產(chǎn)生很大作用,大數(shù)據(jù)相關的基礎設施建設和大數(shù)據(jù)創(chuàng)業(yè)公司在雙創(chuàng)政策的推動下,兩個驅(qū)動力會快速帶動大數(shù)據(jù)的發(fā)展?!?調(diào)研結果顯示,業(yè)內(nèi)專家都希望能自己收集數(shù)據(jù),并利用收集的數(shù)據(jù)進行數(shù)據(jù)服務,希望能買到“數(shù)據(jù)機”,而專家和其所在的機構計劃賣“數(shù)據(jù)機”的卻非常少。 潘柱延指出,數(shù)據(jù)流轉(zhuǎn)整體處在需求大于供給的狀態(tài),尤其是數(shù)據(jù)國際交換和賣數(shù)據(jù)?!跋Mㄟ^政府開放共享,拉動數(shù)據(jù)交流和交換。

日媒說:中國企業(yè)機器換人,是因為年輕人太容易辭職:

日本經(jīng)濟新聞網(wǎng)12月2日報道,在山東省從事運動服裝的制造與出口的主力企業(yè)“山東岱銀進出口公司”的高管王先生(33歲)就是這些經(jīng)營者中的一人。 企業(yè)和政府或許忘記了一些更重要的東西。對于企業(yè)而言,最重要的是如何生產(chǎn)和提供與其他企業(yè)不同的產(chǎn)品或服務。因此“育人”才是中國企業(yè)面臨的最緊要的課題。 就算在工廠引進機器人能暫時控制住成本,如果各企業(yè)都在生產(chǎn)同樣的產(chǎn)品、提供相同服務的話,經(jīng)營遲早會走進死胡同。雖然耗時耗力,但如果不注重“育人”,就無法培養(yǎng)真正的競爭力,產(chǎn)業(yè)也將無法實現(xiàn)高度化。

自來水也和人工智能有關?看這家公司如何用ai+機器人維護管道:

△ hibot的機器人王新民 | 編譯自fastcompany量子位·qbitai 出品萬萬沒想到,美國人民喝個水也要和人工智能扯上關系了。 然而對于市政府的管道更換項目來說,現(xiàn)有的至少40%的管道是不需要更換的。 這就意味著如果可以進行更有效的,針對性的更換,就能夠省下4億美元或更多的經(jīng)費。這是hibot機器人可以大展身手的地方。 hibot通過其數(shù)據(jù)庫系統(tǒng),基于對已經(jīng)替換管道的檢查和地區(qū)土壤動力學的評估,結合環(huán)境因素,能夠計算出城市中各區(qū)域泄漏的風險。然后,hibot公司的機器人進入自來水管道,以確定水管道的受損程度。 這個機器人本身很小,有三個部分,像只有一節(jié)車廂的火車。 機器人的頭部有一個攝像頭,能夠引導內(nèi)部的磁性傳感器,測量管道中的材料損失量,進而分析管道來了解其特點。 hibot公司目前已經(jīng)和舊金山地區(qū)至少兩家市政管道公司達成合作。斯坦福大學電氣工程系兼職教授richard dasher說:“我認為這項技術能夠真正改變美國城市的管道網(wǎng)絡。

轉(zhuǎn)載請注明出處,本站網(wǎng)址:http://www.opentechcloud.com/news_1918.html
相關推薦