九九精品久久久久久久久|亚洲福利精品一区二区三区|国产精品自产拍在线观看免费|日韩在线播放欧美字幕

游客 你可以選擇到 登錄 注冊帳號 忘記密碼?
  • 服務(wù)熱線(xiàn):
    13999268016
Haisql_memcache最佳實(shí)踐方案
來(lái)源:未知 | 發(fā)布時(shí)間:2017-05-15 | 瀏覽次數:
                                                         Haisql_memcache的最佳實(shí)踐方案
一:Haisql_memcache基本設置
1.啟動(dòng)haisql_memcache的服務(wù)器端
(1):~$./haisql_memcache_linux -x 100000 -s 127.0.0.1 -p 1971 -e 200 -t /var/log/haisql/ -f haisql.pid -o 4 -M 1 -w 3
    -x是分配給haisql_memcache的每張數據表的最大使用數量
    -s是監聽(tīng)的服務(wù)器的IP地址,可以指定多個(gè)地址,這里指定服務(wù)器IP地址127.0.0.1
    -p是設置haisql_Memcache監聽(tīng)的端口,這里設置1971,最好是1024以上的端口
    -e選項是最大運行的并發(fā)連接數,這里設置200,按照你服務(wù)器的負載量來(lái)設定
    -t設置保存haisql_memcache的pid文件路徑,保存路徑為:/var/log/haisql/
    -f設置保存haisql_memcache的pid文件名,保存文件名為:haisql.pid
    -o設置haisql_memcache的并發(fā)工作線(xiàn)程數量,這里指定并發(fā)線(xiàn)程數為4
    -M設置數據表超出空間限制后的處理模式,這里為1,自動(dòng)刪除過(guò)期數據并重試
    -w設置數據日志工作模式,這里指定為模式3,保存數據日志并每秒刷進(jìn)硬盤(pán)
(2):~$./haisql_memcache_linux
    表示:全部以默認參數配置啟動(dòng)服務(wù)器。
2.如果要結束haisql_memcache進(jìn)程,執行:
    ~$Kill 進(jìn)程號
二.采用一致性hash算法的目的?
    采用hash算法的目的有兩個(gè):一是節點(diǎn)變動(dòng)后其他節點(diǎn)影響盡可能??;二是節點(diǎn)變動(dòng)后數據重新分配盡可能均衡.
三.什么是haisql_memcache?
    Haisql_memcache是一個(gè)高性能的分布式內存的緩存系統,本質(zhì)上是通用的,但其目的是為了加速動(dòng)態(tài)web應用程序,減輕數據庫訪(fǎng)問(wèn)壓力而設計的,并且用來(lái)提高網(wǎng)站的速度,一個(gè)網(wǎng)站一般由大批的web服務(wù)器和數據庫服務(wù)器構成,以此可以為其一百萬(wàn)用戶(hù)甚至更多用戶(hù)提供每天上千萬(wàn)次的動(dòng)態(tài)頁(yè)面訪(fǎng)問(wèn)量,haisql_memcache大大降低了數據庫的負擔,加快了頁(yè)面的加載時(shí)間,提高了資源利用效率,加快了緩存未命中情況下的數據庫訪(fǎng)問(wèn)時(shí)間。
四.哪些環(huán)境可以運行haisql_memcache?
    隨便哪里,只要有空閑的內存就可以,haisql_memcache運行在linux,BSD上,它一般很少占用CPU資源,這樣就可以運行在任何有空閑內存的地方了。
五.為什么要運行haisql_memcache?
    如果網(wǎng)站的高流量很大并且大多數的訪(fǎng)問(wèn)會(huì )造成數據庫高負荷的狀況下,使用 haisql_memcache能夠減輕數據庫的壓力。
六.適合haisql_memcache的業(yè)務(wù)場(chǎng)景
    1)如果網(wǎng)站包含了訪(fǎng)問(wèn)量很大的動(dòng)態(tài)網(wǎng)頁(yè),因而數據庫的負載將會(huì )很高。由于大部分數據庫請求都是讀操作,那么haisql_memcache可以顯著(zhù)地減小數據庫負載.
    2)如果數據庫服務(wù)器的負載比較低但CPU使用率很高,這時(shí)可以緩存計算好的結果(computed objects)和渲染后的網(wǎng)頁(yè)模板(enderred templates).
    3)利用memcached可以緩存session數據臨時(shí)數據以減少對他們的數據庫寫(xiě)操作.
    4)緩存被頻繁訪(fǎng)問(wèn)的文件.
    5)對key和value的長(cháng)度沒(méi)有限制(最大4G).
    6)對需要保存的數據可以永久保存.
    7)在系統崩潰/故障等情況下,支持數據的掉電保護,可以保證數據庫的一致性.
七.不適合haisql_memcache的業(yè)務(wù)場(chǎng)景
    1)虛擬主機不讓運行haisql_memcache服務(wù),如果應用本身托管在低端的虛擬私有服務(wù)器上,想vmware,xen這類(lèi)虛擬化技術(shù)并不適合運行haisql_memcache,haisql_memcache需要接管和控制大塊的內存,如果haisql_memcache管理的內存被os或hypervisor交換出去,haisql_memcache的性能將大打折扣.
    2)應用運行在不安全的環(huán)境中,haisql_memcache未提供任何安全策略,僅
僅通過(guò)telnet就可以訪(fǎng)問(wèn)到haisql_memcache,如果應用運行在共享的系統
上,需要著(zhù)重考慮安全問(wèn)題.
八.能夠遍歷haisql_memcache中所有的數據?
    可以遍歷haisql_memcache中所有數據,這個(gè)操作不會(huì )阻塞其他的操作,haisql_memcache中的getg命令可以獲取查詢(xún)當前表中的所有數據。
九.Haisql_memcache是怎么工作的?
    Haisql_memcache的高性能源于兩端哈希結構,haisql_memcache就像一個(gè)巨大的存儲了很多<key,value>對的哈希表,通過(guò)key,可以存儲或查
詢(xún)任意的數據,客戶(hù)端可以把數據存儲在多臺haisql_memcache上,當查詢(xún)數據時(shí),客戶(hù)端首先參考節點(diǎn)列表計算出key的哈希值(階段一哈希),進(jìn)而選中一個(gè)節點(diǎn);客戶(hù)端將請求發(fā)送給選中的節點(diǎn),然后haisql_memcache節點(diǎn)通過(guò)一個(gè)內部的哈希算法(階段二哈希);查找真正的數據并返回給客戶(hù)端。
十.Haisql_memcache最大的優(yōu)勢是什么?
    1. Haisql_memcache最大的好處是它有極佳的可擴展性,特別是在一個(gè)巨大的系統中。由于客戶(hù)端自己做了一次哈希,那么我們很容易增加大量haisql_memecache到集群中。Haisql_memcache之間沒(méi)有互相通信,因此不會(huì )增加 haisql_memcache的負載。   
    2.haisql_memcache的性能比Redis和memcached更快,比Memcached更多功能,支持事務(wù),支持微線(xiàn)程,支持pipeling,支持數據日志,支持掉電保護的高性能KV數據庫,具有高并發(fā)性,性能非???,并且haisql_memcache兼容memcached指令集,包括返回的內容和錯誤提示均一致,可作為一個(gè)特殊版本的服務(wù)器直接與memcached客戶(hù)端相連接。
十一.haisql_memcache和MySQL的query cache相比,有什么優(yōu)缺點(diǎn)?
query cache的優(yōu)點(diǎn):
    1)MySQL的query cache,可以自動(dòng)地緩存SQL查詢(xún)的結果,被緩存的SQL查詢(xún)可以被反復、快速的執行。
query cache的缺點(diǎn):
    1)當修改表時(shí),MySQL的query cache會(huì )立刻被刷新(flush)。當寫(xiě)操作很頻繁時(shí),MySQL的query cache會(huì )經(jīng)常讓所有緩存數據都失效。
    2)在多核CPU上,MySQL的query cache會(huì )遇到擴展問(wèn)題(scalability
issues)。在多核CPU上,query cache會(huì )增加一個(gè)全局鎖(global lock), 由于需要刷新更多的緩存數據,速度會(huì )變得更慢。
    3)在MySQL的query cache中,是不能存儲任意的數據的(只能是SQL查詢(xún)結果)。利用haisql_memcache,我們可以搭建出各種高效的緩存。比如,可以執行多個(gè)獨立的查詢(xún),構建出一個(gè)用戶(hù)對象(user object),然后將用戶(hù)對象緩存到haisql_memcache中。而query cache是SQL語(yǔ)句級別的,不可能做到這一點(diǎn)。在小的網(wǎng)站中,query cache會(huì )有所幫助,但隨著(zhù)網(wǎng)站規模的增加,query cache的弊將大于利。
    4)query cache能夠利用的內存容量受到MySQL服務(wù)器空閑內存空間的限制。給數據庫服務(wù)器增加更多的內存來(lái)緩存數據,固然是很好的。但是,有了haisql_memcache,只要您有空閑內存,都可以用來(lái)增加haisql_memcache集群的規模,然后您就可以緩存更多的數據。
十二.Haisql_memcache和服務(wù)器的local cache(比如PHP的APC、mmap文件等)相比,有什么優(yōu)缺點(diǎn)?
    1)首先,local cache面臨著(zhù)嚴重的內存限制,能夠利用的內存容量受到(單臺)服務(wù)器空閑內存空間的限制,而haisql_memcache則不受內存的限制。
    2)local cache缺少集體失效(group invalidation)的特性。在haisql_memcache集群中,刪除或更新一個(gè)key會(huì )讓所有的觀(guān)察者覺(jué)察到。但是在local cache中, 我們只能通知所有的服務(wù)器刷新cache(很慢,不具擴展性)或者僅僅依賴(lài)緩存超時(shí)失效機制。
十三.Haisql_memcache和memcached相比有什么優(yōu)缺點(diǎn)?
    (1)memcached采用單表的方式存儲,而haisql_memcache存儲的方式是采用多表并且全部數據內存存儲的方式,查詢(xún)數據不涉及硬盤(pán)IO,因此,性能比memcached快很多,各操作平均花費是數十微秒。支持多數據表并發(fā), 也支持單數據表并發(fā),內部將數據庫單數據表分為256個(gè)組,使用256把獨立的鎖分別負責每組數據的并發(fā)問(wèn)題,減少了數據存取時(shí)的鎖沖突。將工作線(xiàn)程數量與CPU數量一致,減少了線(xiàn)程切換,提供了更高的性能和更低的鎖沖突,利用hash檢索的方法,實(shí)現了O(1)級別的檢索復雜度,因此具備極高的性能。
    (2)memcached的緩存區大小為固定值,當要存儲的數據很少時(shí),會(huì )造成許多內存資源的浪費,并且當內存存滿(mǎn)數據時(shí),會(huì )自動(dòng)覆蓋原來(lái)的數據,這樣便又會(huì )導致許多重要數據的丟失。而haisql_memcache則會(huì )根據要存儲的數據的大小自動(dòng)進(jìn)行內存的分配,當要保存大量的數據信息時(shí),haisql_memcache便會(huì )自動(dòng)擴展內存,而當要保存的數據很少時(shí),會(huì )自動(dòng)減少內存空間的分配,這樣便大大減少了內存的占用率.
    (3)與memcached相比,haisql_memcache的處理性能更高高,因為haisql_memcache的網(wǎng)絡(luò )層使用了keep_live進(jìn)行自動(dòng)循環(huán)檢測,定時(shí)掃描,每秒進(jìn)行1次掃描有沒(méi)有拆掉的線(xiàn)程。為保證不會(huì )造成數據的丟失,和普通的簡(jiǎn)單的網(wǎng)絡(luò )層處理流程相比,我們最主要的區別體現在close上,是通過(guò)一系列的復雜流程close:通過(guò)向客戶(hù)端發(fā)送shutdown狀態(tài),讓客戶(hù)端檢測到并主動(dòng)發(fā)起拆線(xiàn)請求,使服務(wù)器端在正常拆線(xiàn)后不會(huì )出現time_wait的情況,并要讓time_wait留在客戶(hù)端,除非客戶(hù)端響應超時(shí)的極少數情況time_wait狀態(tài)會(huì )留在服務(wù)器端,這樣極大的提高了服務(wù)器端的處理性能。
    (4)Memcached對Value和key大小長(cháng)度有限制,Key字符串的長(cháng)度不能超過(guò)255個(gè)字符;Value字符串的長(cháng)度不能超過(guò)1024 * 1024個(gè)字符, 即存儲數據不能超過(guò)1M,而haisql_memcache對value和key的大小長(cháng)度均無(wú)限制,可以為任意長(cháng)度。
    (5)memcached對網(wǎng)絡(luò )層的并發(fā)數量有限制,而haisql_memcache的并發(fā)數量在內存足夠的情況下沒(méi)有上限。 Haisql_memcache的網(wǎng)絡(luò )層具有高并發(fā)的性能,在內存足夠的情況下,單機并發(fā)數量是沒(méi)有上限的,理論上可以支持百萬(wàn)以上連接同時(shí)并發(fā)(需要設置系統的最大打開(kāi)文件句柄數量,需要設置TCP socket數量等限制)。  
    (6)haisql_memcache支持全局數據查詢(xún),使用命令集getg<group_number>*\r\n,表示獲取<group_number>組的全部數據,當不帶參數時(shí),表示獲取當前表的全部數據,執行全表掃描和輸出全部數據,而memcached不支持數據的全局查詢(xún)。
    (7)Haisql_memcache支持類(lèi)似于like的指令集getl,而memcached不支持。在haisql_memecach服務(wù)器監聽(tīng)端口1971中輸入命令getl,將會(huì )讀取前面與X匹配的數據,即從當前數據表中獲取鍵值為字符串<x>開(kāi)頭的多條數據.
十四.Haisql_memcache和memcached的性能測試對比情況?
1.測試方法:
    當需要打開(kāi)的的文件句柄數大于108萬(wàn)時(shí),web服務(wù)器如果存在高并發(fā)下大量連接被拆除的問(wèn)題,那么可能是如下原因:
    linux的socket 在內部使用了文件句柄來(lái)獲取操作系統資源,因此,如果需要同時(shí)并發(fā)10萬(wàn)個(gè)連接,需要設置最大打開(kāi)文件句柄數為11萬(wàn),才能進(jìn)行測試和使用。在/etc/security/limits.conf文件中設置最大打開(kāi)文件句柄數,添加如下這2行:
    * soft nofile 110000 
    * hard nofile 110000 
運行服務(wù)器
1) 運行 memcached, 需要指定8192M內存, 以便可以測試百萬(wàn)以上的數據量, 指定端口號是1983,命令如下:
memcached -m 8192 -p 1983
2) 我們的程序是動(dòng)態(tài)申請內存,因此,不需要指定預先分配的內存量, 直接運行就可以了,啟動(dòng)運行服務(wù)器命令如下:
./haisql_memcache_chinese
我們的軟件默認運行端口是1971
每次測試后需要清理運行環(huán)境, memcached直接ctrl_C退出就可以了.
我們的軟件因為退出時(shí)默認自動(dòng)保存內存數據, 因此,需要在退出程序后,執行 rm *.txt;sync;sync 清理掉自動(dòng)保存的數據, 相當于清空全部數據,這樣下次啟動(dòng)時(shí)就是空數據表了.
2.使用 memcslap的測試情況
1)先測試 讀性能
  測試軟件自動(dòng)寫(xiě)入1萬(wàn)條記錄, 然后測試讀取900萬(wàn)次, 我們的軟件執行時(shí)間是23.631秒, memcache執行時(shí)間是38.828秒, 我們的軟件比memcache快64%.
   我們的軟件讀性能如下: 讀4.1Kbyte的數據包大小, 4核8線(xiàn)程3.4G主頻DDR3內存, 讀900萬(wàn)次數據, 900并發(fā), 花費時(shí)間 23.631秒, 讀性能38萬(wàn)QPS。
讀性能 測試結果:
第1次是memcached的測試結果, 第2次是我們的軟件測試結果
guo@guo-desktop:~$ memcslap --concurrency=900  --servers=127.0.0.1:1983 --test=get
    Threads connecting to servers 900
    Took 38.828 seconds to read data
guo@guo-desktop:~$ memcslap --concurrency=900  --servers=127.0.0.1:1971 --test=get
    Threads connecting to servers 900
    Took 23.631 seconds to read data
2)測試 寫(xiě)性能 
   測試軟件測試寫(xiě)入100萬(wàn)條記錄, 我們的軟件執行時(shí)間是3.136秒, memcache執行時(shí)間是4.078秒, 我們的軟件比memcache快30%.
   我們的軟件寫(xiě)性能如下: 寫(xiě)4.1Kbyte的數據包大小, 4核8線(xiàn)程3.4G主頻DDR3內存, 寫(xiě)100萬(wàn)次數據, 100并發(fā), 花費時(shí)間3.136秒, 寫(xiě)性能32萬(wàn)TPS.
寫(xiě)性能 測試結果:
第1次是memcached的測試結果, 第2次是我們的軟件測試結果
guo@guo-desktop:~$ memcslap --concurrency=100  --servers=127.0.0.1:1983
    Threads connecting to servers 100
    Took 4.078 seconds to load data 
guo@guo-desktop:~$ memcslap --concurrency=100  --servers=127.0.0.1:1971
    Threads connecting to servers 100
    Took 3.136 seconds to load data
十五.Haiqsl_memcache的cache機制是怎樣的?
    Haisql_Memcache主要的cache機制是超時(shí)失效。當您存數據到haisql_memcache中,可以自行指定該數據在緩存中的過(guò)期時(shí)間。
    在haisql_memcache中,當設置數據的過(guò)期時(shí)間為0時(shí),表示數據會(huì )永久保存,因此當釋放內存空間時(shí),就會(huì )根據數據過(guò)期的時(shí)間進(jìn)行釋放,永遠都不會(huì )造成數據的丟失,大大保障了數據信息的安全性。同時(shí)haisql_memcache采用動(dòng)態(tài)空間分配的方式,將數據庫分為32個(gè)表,再將數據庫的這32個(gè)表分為256個(gè)塊區,保存的數據會(huì )存儲在其中一個(gè)區塊里,并且會(huì )根據要存儲的數據的大小自動(dòng)進(jìn)行內存的分配,當要保存大量的數據信息時(shí),haisql_memcache便會(huì )自動(dòng)擴展內存,而當要保存的數據很少時(shí),會(huì )自動(dòng)減少內存空間的分配,這樣便大大減少了內存的占用率。
十六.Haisql_memcache如何實(shí)現冗余機制?
    沒(méi)有冗余機制。因為haisql_memcache是應用的緩存層,在設計上沒(méi)有任何的數據冗余的概念。如果一個(gè)節點(diǎn)丟失了它的數據,可以重新從數據源獲取所有數據,并且應用能夠在丟失haisql_memcache實(shí)例的情況下繼續運行,這一點(diǎn)非常重要。
十七.如何將haisql_memcache中的數據批量導入導出?
    Haisql_memcache數據庫不適合數據的批量導入導出。
十八.Haisql_memcache是如何做身份驗證的?
hasiql_memcache是沒(méi)有身份認證機制!Hasiql_memcache是運行在應用下層的軟件(身份驗證應該是應用上層的職責)。Haisql_memcache的客戶(hù)端和服務(wù)器端之所以是輕量級的,部分原因就是完全沒(méi)有實(shí)現身份驗證機制。這樣,haisql_memcache可以很快地創(chuàng )建新連接,服務(wù)器端也無(wú)需任何配置。如果您希望限制訪(fǎng)問(wèn),您可以使用防火墻,或者讓haisql_memcache監聽(tīng)unix domain socket。
十九.Haisql_memcache的微線(xiàn)程是什么?
Haisql_memcache對于微線(xiàn)程的主要思路是實(shí)現stackless 用戶(hù)態(tài)微線(xiàn)程,通過(guò)C++函數對象, 使得一些狀態(tài)可以保存到成員變中. C++的函數對象,既可以像普通函數那樣調用, 又可以像通常的對象那樣攜帶成員變量. 因此通過(guò)將變量置于對象而不是棧上, 并且通過(guò)用戶(hù)態(tài)的任務(wù)隊列,C++就可以實(shí)現無(wú)棧用戶(hù)態(tài)微線(xiàn)程. 微線(xiàn)程的開(kāi)銷(xiāo)不過(guò)就是一個(gè)函數對象, 通常大小不過(guò)幾個(gè)字節到幾KB字節. 因此無(wú)棧用戶(hù)態(tài)微線(xiàn)程無(wú)需當心內存開(kāi)銷(xiāo),也沒(méi)有CPU線(xiàn)程切換的開(kāi)銷(xiāo),性能非常好。
微線(xiàn)程的優(yōu)點(diǎn):
     (1)消耗小,切換快,一個(gè)進(jìn)程可以創(chuàng )建成千上萬(wàn)個(gè)微線(xiàn)程.
     (2)小任務(wù)順序編程很符合人的思維方式, 規避純異步編程中狀態(tài)機的復雜性. 使得使用微線(xiàn)程寫(xiě)的程序將更加的直觀(guān),邏輯描述方便, 簡(jiǎn)化編程.纖程用于化異步為同步,你可以進(jìn)行一個(gè)異步操作以后就切換纖程,等到異步操作完成以后在切換回來(lái),這樣,在邏輯上相關(guān)的代碼就可以寫(xiě)到一個(gè)函數里面,而不用人為的分到多個(gè)回調函數中.
     (3)每個(gè)CPU只綁定一個(gè)線(xiàn)程,每個(gè)線(xiàn)程處理多個(gè)微線(xiàn)程的TCP/IP數據包,形成一個(gè)N個(gè)CPU:M個(gè)連接的架構,這樣就完全避免了線(xiàn)程的切換,極大的提高了網(wǎng)絡(luò )層的并發(fā)量.
二十.Haisql_memcache能接受的key的最大長(cháng)度是多少?
    haisql_memcache對key的大小長(cháng)度均無(wú)限制,可以為任意長(cháng)度(最大32位)。
二十一.Haisql_memcache能接受的value的最大長(cháng)度是多少?
    haisql_memcache對value的大小長(cháng)度均無(wú)限制,可以為任意長(cháng)度(最大32位)。
二十二.Haisql_memcache對數據的過(guò)期時(shí)間有什么限制?
    haisql_memcache對數據的過(guò)期時(shí)間沒(méi)有限制,用戶(hù)可以自行設置數據的過(guò)期時(shí)間,當設置過(guò)期時(shí)間為0時(shí),表示數據會(huì )永久保存,因此當釋放內存空間時(shí),就會(huì )根據數據老化的時(shí)間進(jìn)行釋放,永遠都不會(huì )造成數據的丟失,大大保障了數據信息的安全性。
二十三. 可以在不同的haisql_memcache節點(diǎn)上使用大小不等的緩存空間嗎?如果這么做之后,haisql_memcache能夠更有效地使用內存嗎?
    Hasiql_Memcache客戶(hù)端僅根據哈希算法來(lái)決定將某個(gè)key存儲在哪個(gè)節點(diǎn)上,而不考慮節點(diǎn)的內存大小。因此,可以在不同的節點(diǎn)上使用大小不等的內存作為緩存空間。一般這樣做:擁有較多內存的節點(diǎn)上可以運行多個(gè)haisql_memcache實(shí)例,每個(gè)實(shí)例使用的內存跟其他節點(diǎn)上的實(shí)例相同。
二十四. Haisql_memcache的內存分配器是如何工作的?為什么不使用slabs?
    haisql_memcache的內存分配器是采用動(dòng)態(tài)空間分配的方式,將數據庫分為32個(gè)表,再將數據庫的這32個(gè)表分為256個(gè)塊區,保存的數據會(huì )存儲在其中一個(gè)區塊里,同時(shí)會(huì )根據要存儲的數據的大小自動(dòng)進(jìn)行內存的分配,當要保存大量的數據信息時(shí),haisql_memcache便會(huì )自動(dòng)擴展內存,而當要保存的數據很少時(shí),會(huì )自動(dòng)減少內存空間的分配,這樣便大大減少了內存的占用率。同時(shí)haisql_memcache中,用戶(hù)可以設置數據老化的時(shí)間,當設置老化時(shí)間為0時(shí),表示數據會(huì )永久保存,因此當釋放內存空間時(shí),就會(huì )根據數據老化的時(shí)間進(jìn)行釋放,永遠都不會(huì )造成數據的丟失,大大保障了數據信息的安全性。
    不使用slabs分配器是因為,如果item的大小與被選擇存放它的slab不是很合適,就會(huì )十分浪費內存。
二十五. Haisql_memcache是原子的嗎?
所有的被發(fā)送到haisql_memcache的單個(gè)命令是完全原子的。如果針對同一份數據同時(shí)發(fā)送了一個(gè)set命令和一個(gè)get命令,它們不會(huì )影響對方。它們將被串行化、先后執行。即使在多線(xiàn)程模式,所有的命令都是原子的。但是,命令序列不是原子的。如果首先通過(guò)get命令獲取了一個(gè)value,修改了它,然后再把它set回haisql_memcache,系統不保證這個(gè)value沒(méi)有被其他進(jìn)程(process,未必是操作系統中的進(jìn)程)操作過(guò)。Haisql_memcached 提供了gets和cas命令,它們可以解決上面的問(wèn)題。如果使用gets命令查詢(xún)某個(gè)key的value,haisql_memcache會(huì )返回該value值的唯一標識。如果客戶(hù)端程序覆寫(xiě)了這個(gè)value并想把它寫(xiě)回到haisql_memcache中,可以通過(guò)cas命令把那個(gè)唯一標識一起發(fā)送給hasiql_memcache。如果該value存放在haisql_memcache中的唯一標識與您提供的一致,寫(xiě)操作將會(huì )成功。如果另一個(gè)進(jìn)程在這期間也修改了這個(gè)value,那么該value存放在haisql_memcache中的唯一標識將會(huì )改變,寫(xiě)操作就會(huì )失敗。
二十六. Haisql_memcache比memcached的性能快,體現在哪里?
    1)有一個(gè)快速的網(wǎng)絡(luò )層,基于Boost::asio基礎上二次封裝優(yōu)化改進(jìn)后的網(wǎng)絡(luò )庫,網(wǎng)絡(luò )層總行數超過(guò)4000行。
 2)比std::unordered_map更快,rehash性能抖動(dòng)小的自主研發(fā)的高性能 基于 環(huán)形隊列 結構的 circular_hash_map 庫。環(huán)形隊列大小自動(dòng)收縮擴展。
 3)log日志單獨線(xiàn)程處理,因此, 有更快的速度,有更多的合并寫(xiě),極大提高了日志的寫(xiě)性能。
 4)wait_free_mpsc_queue 多生產(chǎn)者單消費者無(wú)等待隊列的應用, 極大的提高了多線(xiàn)程的并發(fā)性能。 多線(xiàn)程寫(xiě)日志就是通過(guò)此隊列傳遞給log單線(xiàn)程實(shí)現。
 自主研發(fā)的多生產(chǎn)者單消費者無(wú)等待隊列,性能非常好,比boost庫中最快的wait_free_spsc_queue快很多, 時(shí)延更小,可以支持任意對象放入到隊列中(boost庫中的那個(gè)只支持普通POD數據,最大長(cháng)度8字節),支持雙向數據傳送(boost庫只支持單向,我們的版本支持pop處理后的push線(xiàn)程的callback回調數據的傳送),支持無(wú)任務(wù)自動(dòng)休眠,支持push,自動(dòng)pop處理, 自動(dòng)調用after_pop_all,自動(dòng)call_back調用.  內部主要是基于std::atomic和memory_order相關(guān)的命令來(lái)實(shí)現,有一定的技術(shù)難度。使用時(shí),預先設置各function函數,主程序只要push數據,其他過(guò)程都是自動(dòng)完成的。
 5)各種高性能外圍庫的實(shí)現,重寫(xiě)了很多std庫。 例如:常用的二進(jìn)制和十進(jìn)制互轉,常規std庫一般是循環(huán)將二進(jìn)制除10來(lái)實(shí)現的, 我們的庫是使用了 5的魔術(shù)數字的 乘法+移位來(lái)實(shí)現的,性能提高了很多。類(lèi)似std::to_string(T&)之類(lèi)的庫, 性能都有了幾倍的提高。
 6)各類(lèi)鎖,很多公司和產(chǎn)品都有提供自己寫(xiě)的鎖,以便提供比std:;mutex更好的性能,例如:mysql中的自旋鎖, 與很多公司此類(lèi)庫直接使用cas指令不同,我們主要是用std::atomic來(lái)實(shí)現,兼容性更好,參考了C++標準化委員會(huì )的建議代碼,增加了鎖沖突后yield()的機制,無(wú)其他任務(wù)可執行時(shí)候每次spin檢查延遲時(shí)間只有0.1微秒,有其他任務(wù)可執行時(shí)將切換線(xiàn)程釋放CPU,標準鎖class大小只有1個(gè)字節, 兼容所有操作系統和所有CPU。
 庫中已經(jīng)實(shí)現的鎖包括:標準鎖,讀寫(xiě)鎖(寫(xiě)優(yōu)先鎖), 讀寫(xiě)鎖(讀優(yōu)先鎖),可重入鎖。所有的鎖在用法上與std庫兼容, 因此,可以直接使用std::lock_guard等各類(lèi)上鎖的標準std操作。
 性能指標是測試 KV 數據包大小4.1Kbyte, 4核8線(xiàn)程3.4G主頻DDR3內存,讀900萬(wàn)次數據,900并發(fā),讀性能38萬(wàn)QPS;寫(xiě)100萬(wàn)次數據, 100并發(fā),寫(xiě)性能32萬(wàn)TPS。
二十七. 使用不同的客戶(hù)端庫,可以訪(fǎng)問(wèn)到haisql_memcache中相同的數據嗎?
從技術(shù)上說(shuō),是可以的。但是可能會(huì )遇到下面三個(gè)問(wèn)題:
    1)不同的庫采用不同的方式序列化數據。而haisql_memcache采用的序列化方式與其他語(yǔ)言的客戶(hù)端庫采用的方式很可能不同,就會(huì )不能讀取這種格式的數據。如果您要存儲復雜的數據并且想被多種客戶(hù)端庫讀取,那么應該以簡(jiǎn)單的string格式來(lái)存儲,并且這種格式可以被JSON、XML等外部庫解析。
    2)從某個(gè)客戶(hù)端來(lái)的數據被壓縮了,從另一個(gè)客戶(hù)端來(lái)的卻沒(méi)被壓縮。
    3)各個(gè)客戶(hù)端庫可能使用不同的哈希算法(階段一哈希)。在連接到多個(gè)hasiql_memcache服務(wù)端的情況下,客戶(hù)端庫根據自身實(shí)現的哈希算法把key
映射到某臺hasiql_memcache上。正是因為不同的客戶(hù)端庫使用不同的哈希算法,所以被Perl客戶(hù)端庫映射到haisql_memcache A的key,可能又會(huì )被Python客戶(hù)端庫映射到hasiql_memcache B,等等。Perl客戶(hù)端庫還允許為每臺haisql_memcache指定不同的權重(weight),這也是導致這個(gè)問(wèn)題的一個(gè)因素。
二十八. 什么時(shí)候失效的數據項會(huì )從緩存中刪除?
    Haisql_memcache是通過(guò)給數據設置過(guò)期時(shí)間,來(lái)管理緩存的數據,當檢測到數據過(guò)期時(shí),即數據老化,會(huì )自動(dòng)刪除這些老化了的數據,從而來(lái)管理數據庫內部存儲的數據,在重啟電腦時(shí),也會(huì )刪除緩存的的數據。    
二十九在設計應用時(shí),可以通過(guò)haisql_Memcache緩存些內容?
    1) 緩存簡(jiǎn)單的查詢(xún)結果:查詢(xún)緩存存儲了給定查詢(xún)語(yǔ)句對應的整個(gè)結果集,最合適緩存那些經(jīng)常被用到,但不會(huì )改變的 SQL 語(yǔ)句對查詢(xún)到的結果集,比如載入特定的過(guò)濾內容。
    2) 緩存簡(jiǎn)單的基于行的查詢(xún)結果:基于行的緩存會(huì )檢查緩存數據key的列表,那些在緩存中的行可以直接被取出,不在緩存中的行將會(huì )從數據庫中取出并以唯一的鍵為標識緩存起來(lái),最后加入到最終的數據集中返回。隨著(zhù)時(shí)間的推移,大多數數據都會(huì )被緩存,這也意味著(zhù)相比與數據庫,查詢(xún)語(yǔ)句會(huì )更多地從 haisql_memcache中得到數據行。如果數據是相當靜態(tài)的,我們可以設置一個(gè)較長(cháng)的緩存時(shí)間.
    3)緩存的不只是 SQL 數據,可以緩存最終完成的部分顯示頁(yè)面,以節省CPU計算時(shí)間,例如:
    例如正在制作一張顯示用戶(hù)信息的頁(yè)面,你可能得到一段關(guān)于用戶(hù)的信息(姓名,生日,家庭住址,簡(jiǎn)介),然后你可能會(huì )將XML格式的簡(jiǎn)介信息轉化為 HTML 格式或做其他的一些工作。相比單獨存儲這些屬性,你可能更愿意存儲經(jīng)過(guò)渲染的數據塊。那時(shí)你就可以簡(jiǎn)單地取出被預處理后的 HTML 直接填充在頁(yè)面中,這樣節省了寶貴的 CPU 時(shí)間.
三十. 使用分層的緩存
Haisql_memcache 可以高速處理大量的緩存數據,但是還是要根據系統的情況考慮維護多層的緩存結構。例如除了Haisql_memcache緩存之外,還可以通過(guò)本地緩存(如ehcache、oscache等)建立起多級緩存。例如,可以采用本地緩存緩存一些基本數據,例如少量但訪(fǎng)問(wèn)頻繁的數據(如產(chǎn)品分類(lèi),連接信息,服務(wù)器狀態(tài)變量,應用配置變量等),緩存這些數據并讓他們盡可能的接近處理器是有意義的 , 這樣可以幫助減少生成頁(yè)面的時(shí)間,并且在 Haisql_memcache 失效的情況下可以增加可靠性。
三十. 當數據更新時(shí)需要更新緩存
    用戶(hù)編輯了自己的信息,當保存信息到數據庫時(shí),需要更新緩存中的數據或是簡(jiǎn)單地刪除老的數據。如果馬上更新數據,要防止從數據庫讀取那些剛剛更新過(guò)的數據。當用戶(hù)習慣性地重新載入自己的用戶(hù)信息來(lái)確認是否修改成功時(shí),數據將從緩存中直接取出,這時(shí)他們獲得了最新的數據.
三十. 怎樣理解“并發(fā)數量無(wú)上限”?
    "并發(fā)數量無(wú)上限"主要是由網(wǎng)絡(luò )層的架構比較先進(jìn),不是過(guò)去那種每個(gè)連接1個(gè)線(xiàn)程,然后一般不超1000--幾千個(gè)線(xiàn)程,連接數受限于線(xiàn)程數的模型。我們的網(wǎng)絡(luò )層架構是屬于比較新的 N個(gè)線(xiàn)程:M個(gè)連接的架構,網(wǎng)絡(luò )層工作線(xiàn)程數量=CPU數量,每個(gè)線(xiàn)程處理多個(gè)連接,這樣在高并發(fā)的情況下,基本沒(méi)有線(xiàn)程切換的開(kāi)銷(xiāo),每個(gè)CPU都能跑到最大效能。這種網(wǎng)絡(luò )層架構下,服務(wù)器可以接受的最大并發(fā)數量理論上只受限于內存的數量,即使同時(shí)并發(fā)上萬(wàn)個(gè)連接,也會(huì )有比較好的性能。
    Haisql_memcache在普通4核8線(xiàn)程3.4G主頻CPU下,網(wǎng)絡(luò )層每秒新建連接的能力大約是 每秒新建4萬(wàn)個(gè)連接, 每秒Echo Server包轉發(fā)能力超過(guò)百萬(wàn)QPS, 測試工具是ab(apache benmark), 這個(gè)性能指標是超越Apache http和Nginx的。
三十不需要預熱緩存
    haisql_Memcache不需要進(jìn)行預熱緩存,當電腦突然斷電或關(guān)閉服務(wù)器時(shí),所有的數據會(huì )自動(dòng)保存到硬件上,當服務(wù)器啟動(dòng)時(shí),會(huì )自動(dòng)加載所有數據,所以不需要進(jìn)行預熱緩存。
三十Value的組織問(wèn)題?
    主要涉及被緩存的數據的顆粒度,比如要保存一個(gè)數據表,是一行數據保存在一個(gè)鍵值還是統一保存為一個(gè)鍵值。如果數據保存的粒度很小的話(huà)最好是在獲取的時(shí)候能夠批量獲取,在保存的時(shí)候也能夠批量保存,也就是說(shuō)對于跨網(wǎng)絡(luò )的調用次數越少越好。
三十. 緩存更新策略
    緩存里的數據是根據過(guò)期時(shí)間來(lái)判斷是否失效的。當有數據更新的時(shí)候,客戶(hù)端先查詢(xún)haisql_memcache,如果命中,返回結果,如果沒(méi)命中(沒(méi)有數據或者數據已經(jīng)過(guò)期),則從數據庫中加載最新數據,并寫(xiě)回到haisql_memcache中,最后返回結果。
三十.haisql_memcache的單個(gè)套接字連續操作次數該如何設置?
    haisql_memcache的單個(gè)套接字連續操作次數最大為255,如果為了降低時(shí)延,可適當減小單個(gè)套接字的連續操作次數;如果為了追求性能,可適當增加單個(gè)套接字的連續操作次數,當設置為128時(shí),性能達到最大。
?
?
?上一篇:haisql_memcache版本更新情況(帶動(dòng)態(tài)鏈接庫)
?下一篇:haisql_memcache產(chǎn)品優(yōu)點(diǎn)介紹
咨詢(xún)熱線(xiàn):13999268016
地址:新疆維吾爾自治區烏魯木齊市水磨溝區南湖東路77號新疆上??萍己献骰匕藢?01室 固話(huà):6583723