最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Redis 使用小技巧有哪些?

2020-07-15 09:17 作者:自學(xué)Python的小姐姐呀  | 我要投稿

Redis在當(dāng)前的技術(shù)社區(qū)里是非常熱門的。隨著數(shù)據(jù)體積的激增,MySQL+memcache已經(jīng)滿足不了大型互聯(lián)網(wǎng)類應(yīng)用的需求,許多機(jī)構(gòu)也紛紛選擇Redis作為其架構(gòu)上的補(bǔ)充。從來(lái)自Antirez一個(gè)小小的個(gè)人項(xiàng)目到成為內(nèi)存數(shù)據(jù)存儲(chǔ)行業(yè)的標(biāo)準(zhǔn),Redis已經(jīng)走過(guò)了很長(zhǎng)的一段路。

  當(dāng)然,Redis,備受關(guān)注的Nosql數(shù)據(jù)庫(kù)之一,已為眾多知名互聯(lián)網(wǎng)公司使用,比如新浪微博、Pinterest及Viacom。然而,天生不支持SQL卻讓他看起來(lái)很不容易接近,這里我們一起看Redis探索的兩個(gè)問(wèn)題。



 探索之一:Redis? What is it?

  簡(jiǎn)而言之,Redis是一種強(qiáng)大的key-value數(shù)據(jù)庫(kù),之所以強(qiáng)大有兩點(diǎn):響應(yīng)速度快(所以數(shù)據(jù)內(nèi)存存儲(chǔ),只在必要時(shí)寫入磁盤),特性豐富(支持多種數(shù)據(jù)類型,以及各類型上的復(fù)雜操作)。

  事實(shí)上,Redis的一個(gè)重要特性就是它并非通常意義上的數(shù)據(jù)庫(kù),雖然稱之為數(shù)據(jù)庫(kù)是因?yàn)樗梢詾槟愦鎯?chǔ)和維護(hù)數(shù)據(jù),但它并不像關(guān)系數(shù)據(jù)庫(kù)那樣提供任何的SQL方言。不過(guò)不用擔(dān)心,Redis并不是吞噬數(shù)據(jù)的黑洞,它只是不支持SQL及相關(guān)功能,但卻提供了穩(wěn)健的協(xié)議用于與之交互。

  在Redis中,沒(méi)有數(shù)據(jù)表的概念,也無(wú)須關(guān)心select、join、view等操作或功能,同時(shí)也不提供類似于int或varchar的數(shù)據(jù)字段。你面對(duì)的將是相對(duì)原始的數(shù)據(jù)集合及數(shù)據(jù)類型。

探索之二:Available data types

  下面我們深入看下這個(gè)奇怪的數(shù)據(jù)庫(kù)是如何工作的。如上所見(jiàn),Redis是基于key-value范式存儲(chǔ)數(shù)據(jù),所以先來(lái)重點(diǎn)看下"key"的概念。

  key本質(zhì)上就是簡(jiǎn)單的字符串,諸如"username"、"password"等。在定義key時(shí),除了不能使用空格,你可以隨意的使用普通的字符、數(shù)字等,像".",":","_"等在定義key時(shí)都能正常使用,所以像"user_name","user:123:age","user:123:username"都是不錯(cuò)的key的定義方式。

  不像RDBMS中的字段名稱,這里的key是Redis中的重要組成部分,所以我們必須在處理key時(shí)多加小心。在下面的講述中,Redis并沒(méi)有table的概念,所以像"SELECTusernamefromusersWHEREuser_id=123;"這種簡(jiǎn)單任務(wù)都只能換種方式實(shí)現(xiàn),為了達(dá)到這種目的,在Redis上,一種方式是通過(guò)key"user:123:username"來(lái)獲取結(jié)果value。如你所見(jiàn),key的定義中攜帶了神秘信息(像userIDS)。在Redis中,key的重要性可見(jiàn)一斑。(其他key-value數(shù)據(jù)庫(kù)中key的地位也是如此。)

 那么我們又要怎樣才能正確使用Redis呢?小編給大家介紹十個(gè)小技巧:

  1、停止使用KEYS*

  Okay,以挑戰(zhàn)這個(gè)命令開始這篇文章,或許并不是一個(gè)好的方式,但其確實(shí)可能是最重要的一點(diǎn)。很多時(shí)候當(dāng)我們關(guān)注一個(gè)redis實(shí)例的統(tǒng)計(jì)數(shù)據(jù),我們會(huì)快速地輸入”KEYS*”命令,這樣key的信息會(huì)很明顯地展示出來(lái)。平心而論,從程序化的角度出發(fā)往往傾向于寫出下面這樣的偽代碼:



  但是當(dāng)你有1300萬(wàn)個(gè)key時(shí),執(zhí)行速度將會(huì)變慢。因?yàn)镵EYS命令的時(shí)間復(fù)雜度是O(n),其中n是要返回的keys的個(gè)數(shù),這樣這個(gè)命令的復(fù)雜度就取決于數(shù)據(jù)庫(kù)的大小了。并且在這個(gè)操作執(zhí)行期間,其它任何命令在你的實(shí)例中都無(wú)法執(zhí)行。

  作為一個(gè)替代命令,看一下SCAN吧,其允許你以一種更友好的方式來(lái)執(zhí)行…SCAN通過(guò)增量迭代的方式來(lái)掃描數(shù)據(jù)庫(kù)。這一操作基于游標(biāo)的迭代器來(lái)完成的,因此只要你覺(jué)得合適,你可以隨時(shí)停止或繼續(xù)。

2、找出拖慢Redis的罪魁禍?zhǔn)?/strong>

  由于Redis沒(méi)有非常詳細(xì)的日志,要想知道在Redis實(shí)例內(nèi)部都做了些什么是非常困難的。幸運(yùn)的是Redis提供了一個(gè)下面這樣的命令統(tǒng)計(jì)工具:



  通過(guò)這個(gè)工具可以查看所有命令統(tǒng)計(jì)的快照,比如命令執(zhí)行了多少次,執(zhí)行命令所耗費(fèi)的毫秒數(shù)(每個(gè)命令的總時(shí)間和平均時(shí)間)

  只需要簡(jiǎn)單地執(zhí)行CONFIGRESETSTAT命令就可以重置,這樣你就可以得到一個(gè)全新的統(tǒng)計(jì)結(jié)果。

 3、將Redis-Benchmark結(jié)果作為參考,而不要一概而論

  Redis之父Salvatore就說(shuō)過(guò):“通過(guò)執(zhí)行GET/SET命令來(lái)測(cè)試Redis就像在雨天檢測(cè)法拉利的雨刷清潔鏡子的效果”。很多時(shí)候人們跑到我這里,他們想知道為什么自己的Redis-Benchmark統(tǒng)計(jì)的結(jié)果低于最優(yōu)結(jié)果。但我們必須要把各種不同的真實(shí)情況考慮進(jìn)來(lái),例如:

 ?、倏赡苁艿侥男┛蛻舳诉\(yùn)行環(huán)境的限制?

  ②是同一個(gè)版本號(hào)嗎?

 ?、蹨y(cè)試環(huán)境中的表現(xiàn)與應(yīng)用將要運(yùn)行的環(huán)境是否一致?

  Redis-Benchmark的測(cè)試結(jié)果提供了一個(gè)保證你的Redis-Server不會(huì)運(yùn)行在非正常狀態(tài)下的基準(zhǔn)點(diǎn),但是你永遠(yuǎn)不要把它作為一個(gè)真實(shí)的“壓力測(cè)試”。壓力測(cè)試需要反應(yīng)出應(yīng)用的運(yùn)行方式,并且需要一個(gè)盡可能的和生產(chǎn)相似的環(huán)境。

 4、Hashes是你的最佳選擇

  以一種優(yōu)雅的方式引入hashes吧。hashes將會(huì)帶給你一種前所未有的體驗(yàn)。之前我曾看到過(guò)許多類似于下面這樣的key結(jié)構(gòu):



  上面的例子中,foo可能是一個(gè)用戶的用戶名,其中的每一項(xiàng)都是一個(gè)單獨(dú)的key。這就增加了犯錯(cuò)的空間,和一些不必要的key。使用hash代替吧,你會(huì)驚奇地發(fā)現(xiàn)竟然只需要一個(gè)key:



  5、設(shè)置key值的存活時(shí)間

  無(wú)論什么時(shí)候,只要有可能就利用key超時(shí)的優(yōu)勢(shì)。一個(gè)很好的例子就是儲(chǔ)存一些諸如臨時(shí)認(rèn)證key之類的東西。當(dāng)你去查找一個(gè)授權(quán)key時(shí)——以O(shè)AUTH為例——通常會(huì)得到一個(gè)超時(shí)時(shí)間。這樣在設(shè)置key的時(shí)候,設(shè)成同樣的超時(shí)時(shí)間,Redis就會(huì)自動(dòng)為你清除!而不再需要使用KEYS*來(lái)遍歷所有的key了,怎么樣很方便吧?

 6、選擇合適的回收策略

  既然談到了清除key這個(gè)話題,那我們就來(lái)聊聊回收策略。當(dāng)Redis的實(shí)例空間被填滿了之后,將會(huì)嘗試回收一部分key。根據(jù)你的使用方式,我強(qiáng)烈建議使用Volatile-lru策略——前提是你對(duì)key已經(jīng)設(shè)置了超時(shí)。但如果你運(yùn)行的是一些類似于cache的東西,并且沒(méi)有對(duì)key設(shè)置超時(shí)機(jī)制,可以考慮使用allkeys-lru回收機(jī)制。我的建議是先在這里查看一下可行的方案。

 7、如果你的數(shù)據(jù)很重要,請(qǐng)使用Try/Except

  如果必須確保關(guān)鍵性的數(shù)據(jù)可以被放入到Redis的實(shí)例中,我強(qiáng)烈建議將其放入try/except塊中。幾乎所有的Redis客戶端采用的都是“發(fā)送即忘”策略,因此經(jīng)常需要考慮一個(gè)key是否真正被放到Redis數(shù)據(jù)庫(kù)中了。至于將try/expect放到Redis命令中的復(fù)雜性并不是本文要講的,你只需要知道這樣做可以確保重要的數(shù)據(jù)放到該放的地方就可以了。

 8、不要耗盡一個(gè)實(shí)例

  無(wú)論什么時(shí)候,只要有可能就分散多redis實(shí)例的工作量。從3.0.0版本開始,Redis就支持集群了。Redis集群允許你基于key范圍分離出部分包含主/從模式的key。完整的集群背后的“魔法”可以在這里找到。但如果你是在找教程,那這里是一個(gè)再適合不過(guò)的地方了。如果不能選擇集群,考慮一下命名空間吧,然后將你的key分散到多個(gè)實(shí)例之中。關(guān)于怎樣分配數(shù)據(jù),在redis.io網(wǎng)站上有這篇精彩的評(píng)論。

 9、內(nèi)核越多越好嗎?

  當(dāng)然是錯(cuò)的。Redis是一個(gè)單線程進(jìn)程,即使啟用了持久化最多也只會(huì)消耗兩個(gè)內(nèi)核。除非你計(jì)劃在一臺(tái)主機(jī)上運(yùn)行多個(gè)實(shí)例——希望只會(huì)是在開發(fā)測(cè)試的環(huán)境下!——否則的話對(duì)于一個(gè)Redis實(shí)例是不需要2個(gè)以上內(nèi)核的。

10、高可用

  到目前為止RedisSentinel已經(jīng)經(jīng)過(guò)了很全面的測(cè)試,很多用戶已經(jīng)將其應(yīng)用到了生產(chǎn)環(huán)境中(包括ObjectRocket)。如果你的應(yīng)用重度依賴于Redis,那就需要想出一個(gè)高可用方案來(lái)保證其不會(huì)掉線。當(dāng)然,如果不想自己管理這些東西,ObjectRocket提供了一個(gè)高可用平臺(tái),并提供7×24小時(shí)的技術(shù)支持,有意向的話可以考慮一下。


Redis 使用小技巧有哪些?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
祥云县| 吉木乃县| 宁陵县| 乌鲁木齐县| 冕宁县| 江源县| 昔阳县| 石城县| 肥城市| 南华县| 昌黎县| 松溪县| 嘉兴市| 吕梁市| 永泰县| 卓尼县| 四川省| 咸宁市| 文山县| 克东县| 克山县| 葫芦岛市| 定安县| 育儿| 阜城县| 含山县| 阿图什市| 许昌市| 灵宝市| 九龙县| 稻城县| 郴州市| 新蔡县| 会同县| 杨浦区| 平度市| 谷城县| 恩平市| 济宁市| 惠东县| 黎川县|