不要短時間大量重複讀寫相同的key
server端的原理是網絡收包後,放入到工作隊列(讀寫隊列分離,但都只有一個),再由工作線程從隊列中取出進行處理。這裏一個問題是,爲保證數據的正確性,會對同一個key的讀寫加鎖,而如果存在大量讀寫同一個key的情況,則勢必會阻塞其他線程(鎖不慢,鎖競爭才慢),導致拖慢整個服務端的處理速度。
不要使用時間戳作爲key的一部分,容易導致一段時間內所有流量都訪問一臺服務端機器,導致服務端壓力過大而出現大量超時
Value大小多大合適
value建議不超過50KB,value越大,服務端能承受qps越低,請求耗時越大,當value大小超過1MB時,緩存失效,讀寫性能將嚴重受影響
超時時間設置多少合適
普通kv接口:單key請求超時時間建議設置100ms以上,批量請求超時時間建議設置200ms以上
特殊數據結構接口:超時時間建議設置500ms左右
超時是否需要重試
寫超時:除非服務端壓力過大丟棄請求,否則所有寫請求在服務端都會執行成功,只是沒有返回結果給客戶端,除非業務邏輯依賴數據的強一致性,否則不需要重試
讀超時:如果是批量接口,建議設置返回比例(參數爲BatchReturnPercent),如果需要重試,建議sleep 100ms左右後重試,重試不要超過3次
批量請求使用注意
批量請求key個數
批量請求key個數建議不要超過100個
batchGet請求如何提升可用性
可以設置批量請求返回比例(參數爲BatchReturnPercent)
複雜數據結構中元素不宜過多
tair目前引擎對於複雜數據結構,如list,set,map,prefix接口,支持的不夠友好。
這些複雜數據結構的元素不要存儲超過2000個,後續服務端會限制元素個數,個數超過後禁止寫入。
作爲緩存使用時,不要在獲取數據失敗時直接重寫緩存數據
獲取數據失敗的原因很多,但是只有在確定數據不存在的情況下,才需要重寫緩存數據。如果沒有正確區分失敗的情況就直接重寫緩存數據,則可能會加劇失敗的可能,同時會對集羣造成更大的壓力。例如在超時的情況下重寫緩存數據,超時次數可能會更多,且有雪崩的風險。
只有出現下面其中一個返回碼時,才需要重寫緩存數據:
- NOTEXIST (-3998) - 數據不存在
- EXPIRED (-3988) - 數據已過期
Prefix接口相關
不要在同一個pkey下存放過多skey
一個pkey下skey個數建議小於1000,在同一個pkey下存放過多的skey可能會導致性能問題。同一個pkey下的所有skey數據在物理上都存放在同一個機器上,當skey數量過多時,到同一臺機器的請求也會增多。如果存在一個pkey是熱點key, 則熱點流量會集中到一臺機器上,且無法通過擴容均衡壓力。一種極端的錯誤使用情況是,整個數據空間只有一個pkey, 所有數據都作爲skey,這個情況下整個集羣的全部流量都集中在集羣中的一臺機器上,造成整個集羣的性能降低爲只相當於單機的性能。爲了避免這些情況,不要在pkey下存放過多skey, 並且在整個數據空間中需要存在足夠數量的pkey,以將流量均衡到集羣中的各臺機器上。
batchPrefixGetMulti接口使用注意
該接口沒有部分返回機制和重試機制,容易受網絡問題、熱點問題等影響而出現少量超時,減少每個包中的pkey個數可以緩解
優先使用prefixGet,而不是getRange
prefixGet比getRange擁有更好的性能。prefixGet會優先從內存緩存中獲取數據,而getRange只能通過磁盤掃描來獲取數據。
注意傳入getRange接口的參數
傳入getRange接口的參數,對於getRange接口的性能,以及對集羣造成的壓力都有很重要的影響,因此傳入正確的參數非常重要。
儘量設置skey的範圍,即skey_start和skey_end
offset不宜較大,可以通過設置skey_start,而避免設置offset爲較大的數值
可能需要多次調用getRange來獲取全部數據
getRange接口最多返回1M的數據。如果pkey下面skey的value較大,全部數據大小超過了1M,getRange只會返回1M的數據,同時返回碼爲HAS_MORE_DATA。
getRange接口有三個較重要的返回碼:
- OK (0) - 表示參數中要求的所有數據都已正確獲取
- HAS_MORE_DATA (150) - 只獲取了參數中要求的部分數據,需要再次調用來獲取剩餘數據。需要注意的是,再次調用時需要調用者調整調用參數。
- NOTEXIST (-3998) - 參數中要求的數據不存在
因此,當getRange接口返回HAS_MORE_DATA時,則需要調用者根據已經獲取到的數據,調整調用參數,繼續調用getRange來獲取剩餘的數據,直到getRange返回OK或者NOT_EXIST。
歡迎關注 高廣超的簡書博客 與 收藏文章 !
歡迎關注 頭條號:互聯網技術棧 !
個人介紹:
高廣超:多年一線互聯網研發與架構設計經驗,擅長設計與落地高可用、高性能、可擴展的互聯網架構。
本文首發在 高廣超的簡書博客 轉載請註明!