redis 在當前的技術社群裡是非常熱門的。從來自 antirez 乙個小小的個人專案到成為記憶體資料儲存行業的標準,redis已經走過了很長的一段路。隨之而來的一系列最佳實踐,使得大多數人可以正確地使用 redis。
下面我們將探索正確使用 redis 的10個技巧。
**1、停止使用 keys ***
okay,以挑戰這個命令開始這篇文章,或許並不是乙個好的方式,但其確實可能是最重要的一點。很多時候當我們關注乙個redis例項的統計資料,我們會快速地輸入」keys *」命令,這樣key的資訊會很明顯地展示出來。平心而論,從程式化的角度出發往往傾向於寫出下面這樣的偽**:
for key in'keys *'
:doallthethings
()
但是當你有1300萬個key時,執行速度將會變慢。因為keys命令的時間複雜度是o(n),其中n是要返回的keys的個數,這樣這個命令的複雜度就取決於資料庫的大小了。並且在這個操作執行期間,其它任何命令在你的例項中都無法執行。
作為乙個替代命令,看一下 scan 吧,其允許你以一種更友好的方式來執行… scan 通過增量迭代的方式來掃瞄資料庫。這一操作基於游標的迭代器來完成的,因此只要你覺得合適,你可以隨時停止或繼續。
2、找出拖慢 redis 的罪魁禍首
由於 redis 沒有非常詳細的日誌,要想知道在 redis 例項內部都做了些什麼是非常困難的。幸運的是 redis 提供了乙個下面這樣的命令統計工具:
127.0.0.1:6379> info commandstats
# commandstats
cmdstat_get:calls=78,usec=608,usec_per_call=7.79
cmdstat_setex:calls=5,usec=71,usec_per_call=14.20
cmdstat_keys:calls=2,usec=42,usec_per_call=21.00
cmdstat_info:calls=10,usec=1931,usec_per_call=193.10
通過這個工具可以檢視所有命令統計的快照,比如命令執行了多少次,執行命令所耗費的毫秒數(每個命令的總時間和平均時間)
只需要簡單地執行 config resetstat 命令就可以重置,這樣你就可以得到乙個全新的統計結果。
3、 將 redis-benchmark 結果作為參考,而不要一概而論
redis 之父 salvatore 就說過:「通過執行get/set命令來測試redis就像在雨天檢測法拉利的雨刷清潔鏡子的效果」。很多時候人們跑到我這裡,他們想知道為什麼自己的redis-benchmark統計的結果低於最優結果 。但我們必須要把各種不同的真實情況考慮進來,例如:
redis-benchmark的測試結果提供了乙個保證你的 redis-server 不會執行在非正常狀態下的基準點,但是你永遠不要把它作為乙個真實的「壓力測試」。壓力測試需要反應出應用的執行方式,並且需要乙個盡可能的和生產相似的環境。
4、hashes 是你的最佳選擇
以一種優雅的方式引入 hashes 吧。hashes 將會帶給你一種前所未有的體驗。之前我曾看到過許多類似於下面這樣的key結構:
foo:first_name
foo:last_name
foo:address
上面的例子中,foo 可能是乙個使用者的使用者名稱,其中的每一項都是乙個單獨的 key。這就增加了 犯錯的空間,和一些不必要的 key。使用 hash 代替吧,你會驚奇地發現竟然只需要乙個 key :
127.0.0.1:6379> hset foo first_name 'joe'
(integer) 1
127.0.0.1:6379> hset foo last_name 'engel'
(integer) 1
127.0.0.1:6379> hset foo address '1 fanatical pl'
(integer) 1
127.0.0.1:6379> hgetall foo
1)'first_name'
2)'joe'
3)'last_name'
4)'engel'
5)'address'
6)'1 fanatical pl'
127.0.0.1:6379> hget foo first_name
'joe'
5、設定 key 值的存活時間
無論什麼時候,只要有可能就利用key超時的優勢。乙個很好的例子就是儲存一些諸如臨時認證key之類的東西。當你去查詢乙個授權key時——以oauth為例——通常會得到乙個超時時間。這樣在設定key的時候,設成同樣的超時時間,redis就會自動為你清除!而不再需要使用keys *來遍歷所有的key了,怎麼樣很方便吧?
6、 選擇合適的**策略
既然談到了清除key這個話題,那我們就來聊聊**策略。當 redis 的例項空間被填滿了之後,將會嘗試**一部分key。根據你的使用方式,我強烈建議使用 volatile-lru 策略——前提是你對key已經設定了超時。但如果你執行的是一些類似於 cache 的東西,並且沒有對 key 設定超時機制,可以考慮使用 allkeys-lru **機制。我的建議是先在這裡檢視一下可行的方案。
7、如果你的資料很重要,請使用 try/except
如果必須確保關鍵性的資料可以被放入到 redis 的例項中,我強烈建議將其放入 try/except 塊中。幾乎所有的redis客戶端採用的都是「傳送即忘」策略,因此經常需要考慮乙個 key 是否真正被放到 redis 資料庫中了。至於將 try/expect 放到 redis 命令中的複雜性並不是本文要講的,你只需要知道這樣做可以確保重要的資料放到該放的地方就可以了。
8、不要耗盡乙個例項9、核心越多越好嗎?!
當然是錯的。redis 是乙個單執行緒程序,即使啟用了持久化最多也只會消耗兩個核心。除非你計畫在一台主機上執行多個例項——希望只會是在開發測試的環境下!——否則的話對於乙個 redis 例項是不需要2個以上核心的。
10、高可用
到目前為止 redis sentinel 已經經過了很全面的測試,很多使用者已經將其應用到了生產環境中(包括 objectrocket )。如果你的應用重度依賴於 redis ,那就需要想出乙個高可用方案來保證其不會掉線。當然,如果不想自己管理這些東西,objectrocket 提供了乙個高可用平台,並提供7×24小時的技術支援,有意向的話可以考慮一下。
原來微信還能這麼玩,很多人不知道!
手機教授 很多朋友都知道微信的功能,也都在用。但大部分人用得比較 初級 www.cppcns.com,看到好文章,點個,哪天想看的時候,就去翻夾 其實,微信這個功能非常強大,今天小編就和大家來分享一下,微信的功能有哪些隱藏的玩法 拼長圖平時聊天 工作,免不了要分享一些有趣好笑或者很有用的給好友 同事...
很多人不知道這是採用雲技術的最大陷阱,包括你
上個禮拜,我在結束了三周的差旅工作生活後啟程返回東海岸。在這幾周內,我相繼參加了於舊金山 倫敦以及雪梨召開的aws峰會,並與數十位來自不同領域的企業高管人員就其雲服務旅程交換了意見。令人振奮的是,如今世界上的各個行業都開始重視並積極推進it技術的發展與部署,而我個人也從美國 歐洲以及澳大利亞的同行從...
超好用但是很多人不知道的的串列埠(網路)除錯助手推薦
這裡的小眾指的是我覺得我周圍很少人在用,不是軟體本身小眾,軟體本身極度強大好吧。串列埠 網路 除錯助手相信是很多任務程師使用頻率極高的乙個工具,所以,它的易用性實用性以及美觀性成為了我們考量的標準,我就一度苦於找不到滿足自己使用需求的工具而奔波於各種帖子去尋找真正好用的那個它,基本上市場上有的都試用...