亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Redis數(shù)據(jù)庫特性分析

        2015-03-31 15:11:11馬豫星
        物聯(lián)網(wǎng)技術(shù) 2015年3期
        關(guān)鍵詞:數(shù)據(jù)庫

        馬豫星

        摘 要:Redis是一款開源的、網(wǎng)絡(luò)化的、基于內(nèi)存的、可進(jìn)行數(shù)據(jù)持久化的Key-Value存儲系統(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ì)以及對具有高消耗的功能進(jìn)行分散處理。

        關(guān)鍵詞:數(shù)據(jù)庫;Redis;NoSQL;分散處理

        中圖分類號:TP316 文獻(xiàn)標(biāo)識碼:A 文章編號:2095-1302(2015)03-00-02

        0 引 言

        隨著互聯(lián)網(wǎng)的發(fā)展以及Web 2.0的興起,超大規(guī)模以及高并發(fā)的純動態(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ù)存儲模式的趨勢。當(dāng)前NoSQL數(shù)據(jù)庫很多,大部分都是開源的,其中比較知名的有:MemcacheDB、Redis、Tokyo Cabinet、Flare、MongoDB、CouchDB、Cassandra、Voldemort等。本文主要介紹Redis,這是一款足以滿足海量讀寫需求基于Key-Value數(shù)據(jù)存儲方式的高性能NoSQL數(shù)據(jù)庫。

        1 Redis簡介

        Redis是一款開源的、網(wǎng)絡(luò)化的、基于內(nèi)存的、可進(jìn)行數(shù)據(jù)持久化的Key-Value存儲系統(tǒng)。它的數(shù)據(jù)模型建立在外層,類似于其它結(jié)構(gòu)化存儲系統(tǒng),是通過Key映射Value的方式來建立字典以保存數(shù)據(jù),有別于其它結(jié)構(gòu)化存儲系統(tǒng)的是,它支持多類型存儲,包括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,簡單動態(tài)字符串)是Redis底層所使用的字符串表示,幾乎所有的Redis模塊中都用了SDS。用SDS取代C默認(rèn)的char*類型。

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

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

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

        (2)對字符串進(jìn)行N次追加,必定需要對字符串進(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)對字符串里面保存的數(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來動態(tài)使用內(nèi)存,并記錄占有內(nèi)存大小,方便計(jì)算Redis的性能。

        2.2 字典

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

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

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

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

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

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

        (2)當(dāng)Redis的服務(wù)器常規(guī)任務(wù)執(zhí)行時(shí),rehash會被執(zhí)行。在規(guī)定的時(shí)間內(nèi),盡可能地對數(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重啟動時(shí),RDB程序可以通過載入RDB文件來還原數(shù)據(jù)庫的狀態(tài)。

        AOF則以協(xié)議文本的方式,將所有對數(shù)據(jù)庫進(jìn)行過寫入的命令(及其參數(shù))記錄到AOF文件,以此達(dá)到記錄數(shù)據(jù)庫狀態(tài)的目的。AOF更像是歷史記錄,記錄所有運(yùn)行過的命令。但是AOF文件就會隨著時(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文件中記錄的命令就是最簡潔的,因而不會占據(jù)很多空間。

        4 Redis事務(wù)

        4.1 一致性

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

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

        4.2 隔離性

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

        4.3 原子性

        在上述一致性的介紹中,可以看出在事務(wù)隊(duì)列中,即使有命令執(zhí)行錯(cuò)誤,該事務(wù)也會執(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í)行成功之后,都會立即調(diào)用 fsync 或 fdatasync 將事務(wù)數(shù)據(jù)寫入到AOF文件。但是,這種保存是由后臺線程進(jìn)行的,主線程不會阻塞直到保存成功,所以從命令執(zhí)行成功到數(shù)據(jù)保存到硬盤之間,還是有一段非常小的間隔,所以這種模式下的事務(wù)也是不持久的;

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

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

        5 結(jié) 語

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

        參考文獻(xiàn)

        [1] 李子驊.Redis入門指南[M].北京:人民郵電出版社,2013.

        [2] 黃健宏.Redis設(shè)計(jì)與實(shí)現(xiàn)[M].北京:機(jī)械工業(yè)出版社,2014.

        [3] 皮雄軍.NoSQL數(shù)據(jù)庫技術(shù)實(shí)戰(zhàn)[M].北京:清華大學(xué)出版社,2015.

        [4] Shashank Tiwari.深入NoSQL[M].北京:人民郵電出版社, 2012.

        [5] 徐小威.非關(guān)系型數(shù)據(jù)庫數(shù)據(jù)恢復(fù)技術(shù)研究[D].杭州,杭州電子科技大學(xué),2014.

        猜你喜歡
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        兩種新的非確定數(shù)據(jù)庫上的Top-K查詢
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        數(shù)據(jù)庫
        日本午夜a级理论片在线播放| 一区二区三区国产| 97成人碰碰久久人人超级碰oo| 国产亚洲精品美女久久久| 天天摸夜夜摸夜夜狠狠摸| 国产伦理一区二区| 久久人妻内射无码一区三区| 国产va免费精品高清在线 | 荡女精品导航| 无遮挡很爽视频在线观看| 日韩字幕无线乱码免费| 亚洲美女自拍偷拍视频| 国产精品女同一区二区免费站| 久久人妻无码一区二区| 国产亚洲2021成人乱码| 人妻被黑人粗大的猛烈进出| 噜噜噜色97| 凹凸世界视频a一二三| 久久久精品久久久久久96| 777精品出轨人妻国产| 成人毛片无码一区二区三区| 天堂sv在线最新版在线| 亚洲h电影| 一本之道加勒比在线观看| 日本免费一区二区三区影院| 久久婷婷五月综合色奶水99啪| 日韩欧美亚洲综合久久影院ds| 伊人网综合| 久久久久久久久久91精品日韩午夜福利| 日本一区人妻蜜桃臀中文字幕| 大桥未久av一区二区三区| 欧美成人看片一区二区三区尤物| 丰满人妻被黑人中出849| 国产成人亚洲精品2020| 国产黑色丝袜在线观看网站91| 亚洲桃色蜜桃av影院| 激情综合婷婷色五月蜜桃| 国产精品久线在线观看| 一群黑人大战亚裔女在线播放| 亚洲精品久久久中文字| a黄片在线视频免费播放|