日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 物聯(lián)網(wǎng) > 《物聯(lián)網(wǎng)技術(shù)》雜志
[導(dǎo)讀]摘 要:Redis是一款開源的、網(wǎng)絡(luò)化的、基于內(nèi)存的、可進(jìn)行數(shù)據(jù)持久化的Key-Value存儲(chǔ)系統(tǒng)。詳細(xì)介紹了redis數(shù)據(jù)庫底層數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)庫的持久化方式、數(shù)據(jù)庫事務(wù)特性以及隱藏在設(shè)計(jì)之中的一些考量。闡明了Redis高效性的原因在于其精簡高效的底層數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)以及對(duì)具有高消耗的功能進(jìn)行分散處理。

引 言

隨著互聯(lián)網(wǎng)的發(fā)展以及Web 2.0 的興起,超大規(guī)模以及高并發(fā)的純動(dòng)態(tài)型網(wǎng)站日漸成為主流,由于SNS 類網(wǎng)站在數(shù)據(jù)存取過程中有著實(shí)時(shí)性等剛性需求的原因,致使關(guān)系型數(shù)據(jù)庫越來越不足以勝任,這使得目前 NoSQL 數(shù)據(jù)庫慢慢成了人們所關(guān)注的焦點(diǎn),并大有成為取代關(guān)系型數(shù)據(jù)庫而成為未來主流數(shù)據(jù)存儲(chǔ)模式的趨勢。當(dāng)前 NoSQL 數(shù)據(jù)庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet、Flare、MongoDB、CouchDB、Cassandra、Voldemort 等。本文主要介紹 Redis,這是一款足以滿足海量讀寫需求基于Key-Value 數(shù)據(jù)存儲(chǔ)方式的高性能 NoSQL 數(shù)據(jù)庫。

1 Redis簡介

Redis 是一款開源的、網(wǎng)絡(luò)化的、基于內(nèi)存的、可進(jìn)行數(shù)據(jù)持久化的Key-Value 存儲(chǔ)系統(tǒng)。它的數(shù)據(jù)模型建立在外層,類似于其它結(jié)構(gòu)化存儲(chǔ)系統(tǒng),是通過Key 映射Value 的方式來建立字典以保存數(shù)據(jù),有別于其它結(jié)構(gòu)化存儲(chǔ)系統(tǒng)的是,它支持多類型存儲(chǔ),包括 String、List、Set、Sort set 和 Hash 等,你可以在這些數(shù)據(jù)類型上做很多原子性操作。

在操作方面,Redis 基于TCP 協(xié)議的特性使得它可以通過管道的方式進(jìn)行數(shù)據(jù)操作,Redis 本身提供了一個(gè)可連接Server 的客戶端,通過客戶端,可方便地進(jìn)行數(shù)據(jù)存取操作。

2 Redis底層數(shù)據(jù)結(jié)構(gòu)中的兩種 :字符串和字典

在Redis 的內(nèi)部,數(shù)據(jù)結(jié)構(gòu)類型值由高效的數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行支持,并且在 Redis 自身的構(gòu)建當(dāng)中,也大量用到了這些數(shù)據(jù)結(jié)構(gòu)。

2.1 字符串

SDS(Simple Dynamic String, 簡單動(dòng)態(tài)字符串) 是Redis 底層所使用的字符串表示,幾乎所有的Redis 模塊中都用了SDS。用SDS 取代C 默認(rèn)的char* 類型。

因?yàn)閏har* 類型的功能單一,抽象層次低,并且不能高效地支持一些Redis 常用的操作,所以在Redis 程序內(nèi)部,絕大部分情況下都會(huì)使用SDS 而不是 char* 來表示字符串。

在C 語言中,字符串可以用一個(gè) \0 結(jié)尾的char 數(shù)組來表示。但是,它并不能高效地支持長度計(jì)算和追加這兩種操作:

(1) 計(jì)算字符串長度的復(fù)雜度為 θ(N)。

(2) 對(duì)字符串進(jìn)行 N次追加,必定需要對(duì)字符串進(jìn)行 N次內(nèi)存重分配。

在Redis 內(nèi)部,字符串的追加和長度計(jì)算很常見,這兩個(gè)簡單的操作不應(yīng)該成為性能的瓶頸。

另外,Redis 除了處理 C 字符串之外,還需要處理單純的字節(jié)數(shù)組,以及服務(wù)器協(xié)議等內(nèi)容,所以為了方便起見, Redis 的字符串表示還應(yīng)該是二進(jìn)制安全的 :程序不應(yīng)對(duì)字符串里面保存的數(shù)據(jù)做任何假設(shè),數(shù)據(jù)可以是以\0 結(jié)尾的C 字符串,也可以是單純的字節(jié)數(shù)組,或者其他格式的數(shù)據(jù)。

考慮到這兩個(gè)原因,Redis 使用SDS 類型替換了C 語言的默認(rèn)字符串表示 :SDS 既可高效地實(shí)現(xiàn)追加和長度計(jì)算, 同時(shí)是二進(jìn)制安全的。

值得一提的是,在 Redis 最初的設(shè)計(jì)中就加入了統(tǒng)計(jì)信息: 

在設(shè)計(jì) SDS 的時(shí)候,在內(nèi)部使用了zmalloc 與zfree 來動(dòng)態(tài)使用內(nèi)存,并記錄占有內(nèi)存大小,方便計(jì)算 Redis 的性能。

2.2 字典

實(shí)現(xiàn)字典的方法有很多種 :為了兼顧高效和簡單性, Redis 使用了哈希表。在實(shí)現(xiàn)哈希表時(shí),有一個(gè)問題就是采用何種策略來解決碰撞問題。對(duì)于使用鏈地址法來解決碰撞問題的哈希表來說,哈希表的性能取決于哈希表大小與保存節(jié)點(diǎn)數(shù)量之間的比率:

(1) 哈希表的大小與節(jié)點(diǎn)數(shù)量,比率在 1 :1 時(shí),哈希表的性能最好;

(2) 如果節(jié)點(diǎn)數(shù)量比哈希表的大小要大很多的話,那么哈希表就會(huì)退化成多個(gè)鏈表,哈希表本身的性能優(yōu)勢便不復(fù)存在;

Redis 保證當(dāng)上述比率達(dá)到一定值時(shí),會(huì)執(zhí)行 rehash 操作,即對(duì)哈希表進(jìn)行擴(kuò)容或縮減。當(dāng)擴(kuò)容時(shí),是以空間換取時(shí)間,當(dāng)縮減時(shí)是以時(shí)間換空間。由此可以看出Redis 對(duì)時(shí)間和空間的高效利用率。當(dāng)然,rehash 操作一般是漸進(jìn)方式執(zhí)行的。因?yàn)槠渲猩婕暗綄?duì)整個(gè)哈希表的遷移,如果數(shù)據(jù)量很大, 那么勢必會(huì)影響系統(tǒng)的性能。

Redis 使用了兩種漸進(jìn)式的rehash 方式:

(1) 每次執(zhí)行一次添加、查找、刪除操作,rehash都會(huì)被執(zhí)行一次;

(2) 當(dāng)Redis的服務(wù)器常規(guī)任務(wù)執(zhí)行時(shí),rehash會(huì)被執(zhí)行。在規(guī)定的時(shí)間內(nèi),盡可能地對(duì)數(shù)據(jù)庫字典中那些需要rehash 的字典進(jìn)行 rehash,從而加速數(shù)據(jù)庫字典的rehash 進(jìn)程。

3 Redis的持久化方式 :RDB與AOF

在運(yùn)行情況下,Redis 以數(shù)據(jù)結(jié)構(gòu)的形式將數(shù)據(jù)維持在內(nèi)存中,為了讓這些數(shù)據(jù)在Redis 重啟之后仍然可用,Redis 分別提供了RDB 和AOF 兩種持久化模式。

RDB 將數(shù)據(jù)庫的快照以二進(jìn)制的方式保存到磁盤中。在Redis 運(yùn)行時(shí),RDB 程序?qū)?dāng)前內(nèi)存中的數(shù)據(jù)庫快照保存到磁盤文件中, 在 Redis 重啟動(dòng)時(shí),RDB 程序可以通過載入RDB 文件來還原數(shù)據(jù)庫的狀態(tài)。

AOF 則以協(xié)議文本的方式,將所有對(duì)數(shù)據(jù)庫進(jìn)行過寫入的命令(及其參數(shù))記錄到 AOF 文件,以此達(dá)到記錄數(shù)據(jù)庫狀態(tài)的目的。AOF 更像是歷史記錄,記錄所有運(yùn)行過的命令。但是AOF 文件就會(huì)隨著時(shí)間持續(xù)增長,進(jìn)而占據(jù)整個(gè)磁盤。為此,Redis 設(shè)計(jì)了AOF 重寫機(jī)制,通過開啟新線程,掃描數(shù)據(jù)庫數(shù)據(jù),將其轉(zhuǎn)化為Redis 命令,存入臨時(shí)的AOF 文件。當(dāng)掃描完后,用臨時(shí)文件代替AOF 文件。這樣一來,AOF 文件中記錄的命令就是最簡潔的,因而不會(huì)占據(jù)很多空間。

4 Redis事務(wù)

4.1 一致性

Redis 的一致性問題可以分為兩部分來討論 :入隊(duì)錯(cuò)誤、執(zhí)行錯(cuò)誤。

在命令入隊(duì)的過程中,如果客戶端向服務(wù)器發(fā)送了錯(cuò)誤的命令,Redis 會(huì)拒絕執(zhí)行事務(wù),并返回失敗信息。如果命令在事務(wù)執(zhí)行的過程中發(fā)生錯(cuò)誤,那么Redis 只會(huì)將錯(cuò)誤包含在事務(wù)的結(jié)果中,這不會(huì)引起事務(wù)中斷或整個(gè)失敗,不會(huì)影響已執(zhí)行事務(wù)命令的結(jié)果,也不會(huì)影響后面要執(zhí)行的事務(wù)命令, 所以它對(duì)事務(wù)的一致性也沒有影響。

4.2 隔離性

Redis 是單進(jìn)程程序,并且它保證在執(zhí)行事務(wù)時(shí),不會(huì)對(duì)事務(wù)進(jìn)行中斷,事務(wù)可以運(yùn)行直到執(zhí)行完所有事務(wù)隊(duì)列中的命令為止。因此,Redis 的事務(wù)是總是帶有隔離性的。

4.3 原子性

在上述一致性的介紹中,可以看出在事務(wù)隊(duì)列中,即使有命令執(zhí)行錯(cuò)誤,該事務(wù)也會(huì)執(zhí)行完,符合原子性的要求。

4.4 持久性

因?yàn)槭聞?wù)不過是用隊(duì)列包裹起了一組 Redis 命令,并沒有提供任何額外的持久性功能,所以事務(wù)的持久性由Redis 所使用的持久化模式?jīng)Q定:

在單純的內(nèi)存模式下,事務(wù)肯定是不持久的 ;

在RDB 模式下,服務(wù)器可能在事務(wù)執(zhí)行之后、RDB 文件更新之前的這段時(shí)間失敗,所以 RDB 模式下的Redis 事務(wù)也是不持久的;

在AOF 的“總是 SYNC”模式下,事務(wù)的每條命令在執(zhí)行成功之后,都會(huì)立即調(diào)用 fsync 或 fdatasync 將事務(wù)數(shù)據(jù)寫入到AOF 文件。但是,這種保存是由后臺(tái)線程進(jìn)行的,主線程不會(huì)阻塞直到保存成功,所以從命令執(zhí)行成功到數(shù)據(jù)保存到硬盤之間,還是有一段非常小的間隔,所以這種模式下的事務(wù)也是不持久的;

其他 AOF 模式也和“總是 SYNC”模式類似,所以它們都是不持久的;

綜上所述,Redis 事務(wù)滿足原子性、一致性、隔離性,不滿足持久性。

結(jié) 語

本文詳細(xì)介紹了 Redis 數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)、事務(wù)、持久化等特性,為讀者深入理解 Redis 提供了幫助。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉