摘要:上一篇文章實(shí)戰(zhàn)安裝下一篇文章實(shí)戰(zhàn)第一章初識第二節(jié)數(shù)據(jù)結(jié)構(gòu)簡介是一個遠(yuǎn)程內(nèi)存數(shù)據(jù)庫,它不僅性能強(qiáng)勁,而且還具有復(fù)制特性以及為解決問題而生的獨(dú)一無二的數(shù)據(jù)模型,是一個速度非常快的非關(guān)系數(shù)據(jù)庫。
上一篇文章:Pyhton--Redis實(shí)戰(zhàn):Mac brew安裝redis
下一篇文章:Python--Redis實(shí)戰(zhàn):第一章:初識Redis:第二節(jié):Redis數(shù)據(jù)結(jié)構(gòu)簡介
Redis是一個遠(yuǎn)程內(nèi)存數(shù)據(jù)庫,它不僅性能強(qiáng)勁,而且還具有復(fù)制特性以及為解決問題而生的獨(dú)一無二的數(shù)據(jù)模型,是一個速度非常快的非關(guān)系數(shù)據(jù)庫(no-relational database)。
Redis提供了5種不同類型的數(shù)據(jù)結(jié)構(gòu),它可以存儲鍵(key)與5種不同類型的值(value)之間的映射(mapping),各式各樣的問題都可以很自然地映射到這些數(shù)據(jù)結(jié)構(gòu)上:Redis的數(shù)據(jù)結(jié)構(gòu)致力于幫助用戶解決問題,而不會像其他數(shù)據(jù)庫那樣,要求用戶扭曲問題來適應(yīng)數(shù)據(jù)庫。除此之外,通過復(fù)制、持久化(persistence)和客戶端分片(client-side sharding)等特性,用戶可以很方便地將Redis擴(kuò)展成一個能夠包含數(shù)百GB數(shù)據(jù)、每秒處理上百萬此請求的系統(tǒng)。
持久化:將存儲在內(nèi)存的鍵值對數(shù)據(jù)持久化帶硬盤。Redis與其它數(shù)據(jù)庫和軟件的對比
如果你熟悉關(guān)系數(shù)據(jù)庫,那么你肯定寫過用來關(guān)聯(lián)兩個表的數(shù)據(jù)的SQL查詢。而Redis則屬于人民常說的NoSQL數(shù)據(jù)庫或者非關(guān)系數(shù)據(jù)庫:Redis不使用表,它的數(shù)據(jù)庫也不會預(yù)定義或者強(qiáng)制要求用戶對Redis存儲的不同數(shù)據(jù)進(jìn)行關(guān)聯(lián)。
高性能鍵值對緩存服務(wù)器memcached也經(jīng)常被拿來于Redis進(jìn)行比較:這兩者都可以用于存儲鍵值映射,彼此的性能也相差無幾,但是Redis能夠自動以兩種不同的方式將數(shù)據(jù)寫入硬盤,并且Redis除了能存儲普通的字符串鍵之外,還可以存儲其它4種數(shù)據(jù)結(jié)構(gòu),而memcached只能存儲普通的字符串。這些不同之處使得Redis可以用于解決更為廣泛的問題,并且即可以用于主數(shù)據(jù)庫(primary database)使用,又可以作為其他存儲系統(tǒng)的輔助數(shù)據(jù)庫(auxiliar database)來使用。
一般來說,用戶只會在Redis的性能或者功能是必要的情況下,才會將數(shù)據(jù)存儲到Redis中。如果程序?qū)π阅芤蟛桓撸只蛘咭驗(yàn)橘M(fèi)用原因而沒有辦法將大量數(shù)據(jù)庫存儲到內(nèi)存中,那么用戶可以選擇使用關(guān)系數(shù)據(jù)庫,或者其他非關(guān)系數(shù)據(jù)庫。
下表展示了一部分功能上與Redis有重疊的數(shù)據(jù)庫服務(wù)器和緩存服務(wù)器。從這個表可以看出Redis與這些數(shù)據(jù)庫及軟件之間的區(qū)別。
名稱 | 類型 | 數(shù)據(jù)存儲選項(xiàng) | 查詢類型 | 附加功能 |
---|---|---|---|---|
Redis | 使用內(nèi)存存儲(in-memory)的非關(guān)系數(shù)據(jù)庫 | 字符串、列表、集合、散列表、有序集合 | 每種數(shù)據(jù)類型都有自己的專屬命令,另外還有批量操作(bulk operation)和不完全(partial)的事務(wù)支持。 | 發(fā)布與訂閱,主從復(fù)制(master/slave replication),持久化,腳本(存儲過程,stored procedure) |
memcached | 使用內(nèi)存存儲的鍵值緩存 | 鍵值之間的映射 | 創(chuàng)建命令、讀取命令、更新命令、刪除命令以及其他幾個命令。 | 為提升性能而設(shè)的多線程服務(wù)器。 |
MySQL | 關(guān)系數(shù)據(jù)庫 | 每個數(shù)據(jù)庫可以包含多個表,每個表包含多個行,可以處理多個表的視圖(view)、支持空間(spatial)和第三方擴(kuò)展 | SELECT、INSERT、UPDATE、DELETE、函數(shù)、存儲過程。 | 支持ACID性質(zhì)(需要使用InnoDB)。主從復(fù)制和主主復(fù)制(master/master replication) |
PostgreSQL | 關(guān)系數(shù)據(jù)庫 | 每個數(shù)據(jù)庫可以包含多個表,每個表可以包含多個行;可以處理多個表的視圖;支持空間和第三方擴(kuò)展;支持可定制類型。 | SELECT、INSERT、UPDATE、DELETE、內(nèi)置函數(shù)、自定義的存儲過程。 | 支持ACID性質(zhì)。主從復(fù)制,由第三方支持的多主復(fù)制(multi-master replication) |
MongoDB | 使用硬盤存儲(on-disk)的非關(guān)系文檔存儲 | 每個數(shù)據(jù)庫可以包含多個表,每個表可以包含多個無schema(schema-less)的BSON文檔 | 創(chuàng)建命令、讀取命令、更新命令、刪除命令、條件查詢命令等。 | 支持map-reduce操作,主從復(fù)制。分片。控件索引(spatial index) |
在使用類似Redis這樣的內(nèi)存數(shù)據(jù)庫時,一個首先要考慮的問題就是【當(dāng)服務(wù)器關(guān)閉時,服務(wù)器存儲的數(shù)據(jù)將何去何從呢?】
Redis擁有兩種不同形式的持久化方法,他們都可以用小而緊湊的格式將存儲在內(nèi)存中的數(shù)據(jù)寫入硬盤:
第一種持久化方法為:時間點(diǎn)轉(zhuǎn)儲(point-in-time dump)。轉(zhuǎn)儲操作既可以在【指定時間段內(nèi)有指定數(shù)量的寫操作執(zhí)行】這一條件被滿足時執(zhí)行,又可以通過調(diào)用兩條轉(zhuǎn)儲的硬盤(dump-to-disk)命令中的任何一條來執(zhí)行。
第二種持久化方法為:將所有修改了數(shù)據(jù)庫的命令都寫入一個只追加(append-only)文件里面,用戶可以根據(jù)數(shù)據(jù)的重要程度,將只追加寫入設(shè)置為:從不同步、每秒同步一次、寫入一個命令就同步一次。
盡管Redis的性能很好,但受限于Redis的內(nèi)存存儲設(shè)計,有時候只使用一臺Redis服務(wù)器可能沒有辦法處理所有請求,因此,為了擴(kuò)展Redis的讀性能,并為Redis提供故障轉(zhuǎn)移(failover)支持,Redis實(shí)現(xiàn)了主從復(fù)制特性:
執(zhí)行復(fù)制的從服務(wù)器會連接上主服務(wù)器,接受主服務(wù)器發(fā)送的整個數(shù)據(jù)庫的初始副本(copy);
之后主服務(wù)器執(zhí)行的寫命令,都會被發(fā)送給所有連接著的【從服務(wù)器】去執(zhí)行,從而實(shí)時的更新從服務(wù)器的數(shù)據(jù)集。
因?yàn)椤緩姆?wù)器】包含的數(shù)據(jù)會不斷的更新,所以客戶端可以向任意一個從服務(wù)器發(fā)送【讀請求】,以此來避免對主服務(wù)器進(jìn)行集中式訪問。
使用Redis的理由有memcached使用經(jīng)驗(yàn)的讀者可能知道,用戶只能用APPEND命令將數(shù)據(jù)添加到已有字符串的末尾。memcached的文檔中聲明,可以用APPEND命令來管理元素列表。這很好,用戶可以將元素追加到一個字符串的末尾,并將那個字符串當(dāng)做列表來使用。但隨后如何刪除這些元素呢?memcached采用的方法是通過黑名單(blacklist)來隱藏列表里面的元素,從而避免對元素執(zhí)行讀寫、更新、寫入(包括在一次數(shù)據(jù)庫查詢之后執(zhí)行的memcached寫入)等操作。相反的,Redis的LIST和SET允許用戶添加或則刪除元素。
使用Redis而不是 memcached來解決問題,不僅可以讓代碼變得更簡短、更易懂、更易維護(hù),而且還可以使代碼的允許速度更快(因?yàn)橛脩舨恍枰ㄟ^讀取數(shù)據(jù)庫來更新數(shù)據(jù))。除此之外,在其他很多情況下,Redis的效率和易用性也比關(guān)系數(shù)據(jù)庫要好的多。
數(shù)據(jù)庫的一個常見用法是存儲長期的報告數(shù)據(jù),并將這些報告數(shù)據(jù)用作固定時間范圍內(nèi)的聚合數(shù)據(jù)(aggregates)。收集聚合數(shù)據(jù)的常見做法是:
先將各個行插入一個報告表里面
之后再通過掃描這些行來收集聚合數(shù)據(jù)
再根據(jù)收集到的聚合數(shù)據(jù)來更新聚合表中已有的那些行。
之所以使用插入行的方式來存儲,是因?yàn)閷τ诖蟛糠謹(jǐn)?shù)據(jù)庫來說,出入行操作的執(zhí)行速度非常快(插入行只會在硬盤文件末尾進(jìn)行寫入)。不過,對表里面的行進(jìn)行更新卻是一個非常慢的操作,因?yàn)檫@種更新除了會引起一次隨機(jī)讀(random read)之外,還可能會引起一次隨機(jī)寫(random write)。而Redis里面,用戶可以直接使用原子的(atomic)INCR命令及其變種來計算聚合數(shù)據(jù),并且因?yàn)镽edis將數(shù)據(jù)存儲在內(nèi)存里面,而且發(fā)送給Redis的命令請求并不需要經(jīng)過典型的查詢分析器(parser)或者查詢優(yōu)化器(optimizer)進(jìn)行處理,所有對Redis存儲的數(shù)據(jù)執(zhí)行隨機(jī)寫的速度總是非常迅速的。
使用Redis而不是關(guān)系數(shù)據(jù)庫或則其他硬盤存儲數(shù)據(jù)庫,可以避免寫入不必要的臨時數(shù)據(jù),也免去了對臨時數(shù)據(jù)進(jìn)行掃描或則刪除的麻煩,并最終改善程序的性能。
【工具會極大地改變?nèi)藗兘鉀Q問題的方式】
上一篇文章:Pyhton--Redis實(shí)戰(zhàn):Mac brew安裝redis
下一篇文章:Python--Redis實(shí)戰(zhàn):第一章:初識Redis:第二節(jié):Redis數(shù)據(jù)結(jié)構(gòu)簡介
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/42518.html
摘要:上一篇文章實(shí)戰(zhàn)第一章初識第一節(jié)簡介下一篇文章實(shí)戰(zhàn)第一章初識第三節(jié)你好文章投票試煉可以存儲鍵與種不同的數(shù)據(jù)結(jié)構(gòu)類型之間的映射,這中數(shù)據(jù)結(jié)構(gòu)類別分別是字符串列表集合散列和有序集合。 上一篇文章:Python--Redis實(shí)戰(zhàn):第一章:初識Redis:第一節(jié):Redis簡介下一篇文章:Python--Redis實(shí)戰(zhàn):第一章:初識Redis:第三節(jié):你好Redis-文章投票試煉 Redis可...
摘要:為了防止用戶對同一篇文章進(jìn)行多次投票,網(wǎng)站需要為每一篇文章記錄一個已投票用戶名單。上一篇文章實(shí)戰(zhàn)第一章初識第二節(jié)數(shù)據(jù)結(jié)構(gòu)簡介下一篇文章實(shí)戰(zhàn)第二章使用構(gòu)建應(yīng)用第一節(jié)登錄和緩存 上一篇文章: Python--Redis實(shí)戰(zhàn):第一章:初識Redis:第二節(jié):Redis數(shù)據(jù)結(jié)構(gòu)簡介下一篇文章:Python--Redis實(shí)戰(zhàn):第二章:使用Redis構(gòu)建Web應(yīng)用:第一節(jié):登錄和cookie緩存 ...
閱讀 1439·2019-08-29 17:14
閱讀 1646·2019-08-29 12:12
閱讀 727·2019-08-29 11:33
閱讀 3261·2019-08-28 18:27
閱讀 1442·2019-08-26 10:19
閱讀 904·2019-08-23 18:18
閱讀 3525·2019-08-23 16:15
閱讀 2539·2019-08-23 14:14