A. 資料庫系統模式有哪三種
資料庫系統的三級模式結構是指資料庫系統是由模式、外模式和內模式三級構成的。
(1)模式 模式也稱邏輯模式或概念模式,是資料庫中全體數據的邏輯結構和特徵的描述,是所有用戶的公共數據視圖。
模式實際上是資料庫數據在邏輯級上的視圖。一個資料庫只有一個模式。定義模式時不僅要定義數據的邏輯結構,而且要定義數據之間的聯系,定義與數據有關的安全性、完整性要求。
(2)外模式 外模式也稱用戶模式,它是資料庫用戶能夠看見和使用的局部數據的邏輯結構和特徵的描述,是資料庫用戶的數據視圖,是與某一應用有關的數據的邏輯表示。 外模式通常是模式的子集。一個資料庫可以有多個外模式。應用程序都是和外模式打交道的。外模式是保證資料庫安全性的一個有力措施。每個用戶只能看見和訪問所對應的外模式中的數據,資料庫中的其餘數據對他們是不可見的。
(3)內模式 內模式也稱存儲模式,一個資料庫只有一個內模式。它是數據物理結構和存儲方式的描述,是數據在資料庫內部的表示方式。例如,記錄的存儲方式是順序結構存儲還是B樹結構存儲;索引按什麼方式組織;數據是否壓縮,是否加密;數據的存儲記錄結構有何規定等。
COPY DE
B. 常用的內存緩存資料庫redis 讀什麼
網路redis,有個例句,裡面讀:瑞迪斯
C. 資料庫的ha模式是什麼
高可用(HA)性有兩種不同的含義,在廣義環境中是指整個系統的高可用性,在狹義方面一般指主機、服務的冗餘,如主機HA、應用程序的HA等,無論那種情況,高可用性都可以包含如下一些方面:
1、 系統失敗或崩潰;
2、 應用層或者中間層錯誤;
3、網路失敗;
4、 介質失敗:指一些存放數據的媒體介質故障;
5、 人為錯誤;
6、 系統的容災備份;
7、 計劃內的維護或者重啟。
可見,高可用性不僅包含了系統本身故障、應用層的故障、網路故障、認為操作的錯誤等,還包含數據的冗餘、容災及計劃的維護時間等,也就是說一個真正的高可用環境,不僅能避免系統本身的問題,還應該能防止天災、人禍,並且有一個可靠的系統升級及計劃維護操作。
D. 數據多的時候為什麼要使用redis而不用mysql
通常來說,當數據多、並發量大的時候,架構中可以引入Redis,幫助提升架構的整體性能,減少Mysql(或其他資料庫)的壓力,但不是使用Redis,就不用MySQL。
因為Redis的性能十分優越,可以支持每秒十幾萬此的讀/寫操作,並且它還支持持久化、集群部署、分布式、主從同步等,Redis在高並發的場景下數據的安全和一致性,所以它經常用於兩個場景:
緩存
判斷數據是否適合緩存到Redis中,可以從幾個方面考慮: 會經常查詢么?命中率如何?寫操作多麼?數據大小?
我們經常採用這樣的方式將數據刷到Redis中:查詢的請求過來,現在Redis中查詢,如果查詢不到,就查詢資料庫拿到數據,再放到緩存中,這樣第二次相同的查詢請求過來,就可以直接在Redis中拿到數據;不過要注意【緩存穿透】的問題。
緩存的刷新會比較復雜,通常是修改完資料庫之後,還需要對Redis中的數據進行操作;代碼很簡單,但是需要保證這兩步為同一事務,或最終的事務一致性。
高速讀寫
常見的就是計數器,比如一篇文章的閱讀量,不可能每一次閱讀就在資料庫裡面update一次。
高並發的場景很適合使用Redis,比如雙11秒殺,庫存一共就一千件,到了秒殺的時間,通常會在極為短暫的時間內,有數萬級的請求達到伺服器,如果使用資料庫的話,很可能在這一瞬間造成資料庫的崩潰,所以通常會使用Redis(秒殺的場景會比較復雜,Redis只是其中之一,例如如果請求超過某個數量的時候,多餘的請求就會被限流)。
這種高並發的場景,是當請求達到伺服器的時候,直接在Redis上讀寫,請求不會訪問到資料庫;程序會在合適的時間,比如一千件庫存都被秒殺,再將數據批量寫到資料庫中。
所以通常來說,在必要的時候引入Redis,可以減少MySQL(或其他)資料庫的壓力,兩者不是替代的關系 。
我將持續分享Java開發、架構設計、程序員職業發展等方面的見解,希望能得到你的關注。
Redis和MySQL的應用場景是不同的。
通常來說,沒有說用Redis就不用MySQL的這種情況。
因為Redis是一種非關系型資料庫(NoSQL),而MySQL是一種關系型資料庫。
和Redis同類的資料庫還有MongoDB和Memchache(其實並沒有持久化數據)
那關系型資料庫現在常用的一般有MySQL,SQL Server,Oracle。
我們先來了解一下關系型資料庫和非關系型資料庫的區別吧。
1.存儲方式關系型資料庫是表格式的,因此存儲在表的行和列中。他們之間很容易關聯協作存儲,提取數據很方便。而Nosql資料庫則與其相反,他是大塊的組合在一起。通常存儲在數據集中,就像文檔、鍵值對或者圖結構。
2.存儲結構關系型資料庫對應的是結構化數據,數據表都預先定義了結構(列的定義),結構描述了數據的形式和內容。這一點對數據建模至關重要,雖然預定義結構帶來了可靠性和穩定性,但是修改這些數據比較困難。而Nosql資料庫基於動態結構,使用與非結構化數據。因為Nosql資料庫是動態結構,可以很容易適應數據類型和結構的變化。
3.存儲規范關系型資料庫的數據存儲為了更高的規范性,把數據分割為最小的關系表以避免重復,獲得精簡的空間利用。雖然管理起來很清晰,但是單個操作設計到多張表的時候,數據管理就顯得有點麻煩。而Nosql數據存儲在平面數據集中,數據經常可能會重復。單個資料庫很少被分隔開,而是存儲成了一個整體,這樣整塊數據更加便於讀寫
4.存儲擴展這可能是兩者之間最大的區別,關系型資料庫是縱向擴展,也就是說想要提高處理能力,要使用速度更快的計算機。因為數據存儲在關系表中,操作的性能瓶頸可能涉及到多個表,需要通過提升計算機性能來克服。雖然有很大的擴展空間,但是最終會達到縱向擴展的上限。而Nosql資料庫是橫向擴展的,它的存儲天然就是分布式的,可以通過給資源池添加更多的普通資料庫伺服器來分擔負載。
5.查詢方式關系型資料庫通過結構化查詢語言來操作資料庫(就是我們通常說的SQL)。SQL支持資料庫CURD操作的功能非常強大,是業界的標准用法。而Nosql查詢以塊為單元操作數據,使用的是非結構化查詢語言(UnQl),它是沒有標準的。關系型資料庫表中主鍵的概念對應Nosql中存儲文檔的ID。關系型資料庫使用預定義優化方式(比如索引)來加快查詢操作,而Nosql更簡單更精確的數據訪問模式。
6.事務關系型資料庫遵循ACID規則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)),而Nosql資料庫遵循BASE原則(基本可用(Basically Availble)、軟/柔性事務(Soft-state )、最終一致性(Eventual Consistency))。由於關系型資料庫的數據強一致性,所以對事務的支持很好。關系型資料庫支持對事務原子性細粒度控制,並且易於回滾事務。而Nosql資料庫是在CAP(一致性、可用性、分區容忍度)中任選兩項,因為基於節點的分布式系統中,很難全部滿足,所以對事務的支持不是很好,雖然也可以使用事務,但是並不是Nosql的閃光點。
7.性能關系型資料庫為了維護數據的一致性付出了巨大的代價,讀寫性能比較差。在面對高並發讀寫性能非常差,面對海量數據的時候效率非常低。而Nosql存儲的格式都是key-value類型的,並且存儲在內存中,非常容易存儲,而且對於數據的 一致性是 弱要求。Nosql無需sql的解析,提高了讀寫性能。
8.授權方式大多數的關系型資料庫都是付費的並且價格昂貴,成本較大(MySQL是開源的,所以應用的場景最多),而Nosql資料庫通常都是開源的。
所以,在實際的應用環境中,我們一般會使用MySQL存儲我們的業務過程中的數據,因為這些數據之間的關系比較復雜,我們常常會需要在查詢一個表的數據時候,將其他關系表的數據查詢出來,例如,查詢某個用戶的訂單,那至少是需要用戶表和訂單表的數據。
查詢某個商品的銷售數據,那可能就會需要用戶表,訂單表,訂單明細表,商品表等等。
而在這樣的使用場景中,我們使用Redis來存儲的話,也就是KeyValue形式存儲的話,其實並不能滿足我們的需要。
即使Redis的讀取效率再高,我們也沒法用。
但,對於某些沒有關聯少,且需要高頻率讀寫,我們使用Redis就能夠很好的提高整個體統的並發能力。
例如商品的庫存信息,我們雖然在MySQL中會有這樣的欄位,但是我們並不想MySQL的資料庫被高頻的讀寫,因為使用這樣會導致我的商品表或者庫存表IO非常高,從而影響整個體統的效率。
所以,對於這樣的數據,且有沒有什麼復雜邏輯關系(就只是隸屬於SKU)的數據,我們就可以放在Redis裡面,下單直接在Redis中減掉庫存,這樣,我們的訂單的並發能力就能夠提高了。
個人覺得應該站出來更正一下,相反的數據量大,更不應該用redis。
因為redis是內存型資料庫啊,是放在內存里的。
設想一下,假如你的電腦100G的資料,都用redis來存儲,那麼你需要100G以上的內存!
使用場景Redis最明顯的用例之一是將其用作緩存。只是保存熱數據,或者具有過期的cache。
例如facebook,使用Memcached來作為其會話緩存。
總之,沒有見過哪個大公司數據量大了,換掉mysql用redis的。
題主你錯了,不是用redis代替MySQL,而是引入redis來優化。
BAT里越來越多的項目組已經採用了redis+MySQL的架構來開發平台工具。
如題主所說,當數據多的時候,MySQL的查詢效率會大打折扣。我們通常默認如果查詢的欄位包含索引的話,返回是毫秒級別的。但是在實際工作中,我曾經遇到過一張包含10個欄位的表,1800萬+條數據,當某種場景下,我們不得不根據一個未加索引的欄位進行精確查詢的時候,單條sql語句的執行時長有時能夠達到2min以上,就更別提如果用like這種模糊查詢的話,其效率將會多麼低下。
我們最開始是希望能夠通過增加索引的方式解決,但是面對千萬級別的數據量,我們也不敢貿然加索引,因為一旦資料庫hang住,期間的所有資料庫寫入請求都會被放到等待隊列中,如果請求是通過http請求發過來的,很有可能導致服務發生分鍾級別的超時不響應。
經過一番調研,最終敲定的解決方案是引入redis作為緩存。redis具有運行效率高,數據查詢速度快,支持多種存儲類型以及事務等優勢,我們把經常讀取,而不經常改動的數據放入redis中,伺服器讀取這類數據的時候時候,直接與redis通信,極大的緩解了MySQL的壓力。
然而,我在上面也說了,是redis+MySQL結合的方式,而不是替代。原因就是redis雖然讀寫很快,但是不適合做數據持久層,主要原因是使用redis做數據落盤是要以效率作為代價的,即每隔制定的時間,redis就要去進行數據備份/落盤,這對於單線程的它來說,勢必會因「分心」而影響效率,結果得不償失。
樓主你好,首先糾正下,數據多並不是一定就用Redis,Redis歸屬於NoSQL資料庫中,其特點擁有高性能讀寫數據速度,主要解決業務效率瓶頸。下面就詳細說下Redis的相比MySQL優點。( 關於Redis詳細了解參見我近期文章:https://www.toutiao.com/i6543810796214813187/ )
讀寫異常快
Redis非常快,每秒可執行大約10萬次的讀寫速度。
Redis支持豐富的數據類型,有二進制字元串、列表、集合、排序集和散列等等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些數據類型來處理解決。
原子性Redis的所有操作都是原子操作,這確保如果兩個客戶端並發訪問,Redis伺服器能接收更新的值。
豐富實用工具 支持異機主從復制Redis支持主從復制的配置,它可以實現主伺服器的完全拷貝。
以上為開發者青睞Redis的主要幾個可取之處。但是,請注意實際生產環境中企業都是結合Redis和MySQL的特定進行不同應用場景的取捨。 如緩存——熱數據、計數器、消息隊列(與ActiveMQ,RocketMQ等工具類似)、位操作(大數據處理)、分布式鎖與單線程機制、最新列表(如新聞列表頁面最新的新聞列表)以及排行榜等等 可以看見Redis大顯身手的場景。可是對於嚴謹的數據准確度和復雜的關系型應用MySQL等關系型資料庫依然不可替。
web應用中一般採用MySQL+Redis的方式,web應用每次先訪問Redis,如果沒有找到數據,才去訪問MySQL。
本質區別1、mysql:數據放在磁碟 redis:數據放在內存。
首先要知道mysql存儲在磁碟里,redis存儲在內存里,redis既可以用來做持久存儲,也可以做緩存,而目前大多數公司的存儲都是mysql + redis,mysql作為主存儲,redis作為輔助存儲被用作緩存,加快訪問讀取的速度,提高性能。
使用場景區別1、mysql支持sql查詢,可以實現一些關聯的查詢以及統計;
2、redis對內存要求比較高,在有限的條件下不能把所有數據都放在redis;
3、mysql偏向於存數據,redis偏向於快速取數據,但redis查詢復雜的表關系時不如mysql,所以可以把熱門的數據放redis,mysql存基本數據。
mysql的運行機制mysql作為持久化存儲的關系型資料庫,相對薄弱的地方在於每次請求訪問資料庫時,都存在著I/O操作,如果反復頻繁的訪問資料庫。第一:會在反復鏈接資料庫上花費大量時間,從而導致運行效率過慢;第二:反復地訪問資料庫也會導致資料庫的負載過高,那麼此時緩存的概念就衍生了出來。
Redis持久化由於Redis的數據都存放在內存中,如果沒有配置持久化,redis重啟後數據就全丟失了,於是需要開啟redis的持久化功能,將數據保存到磁碟上,當redis重啟後,可以從磁碟中恢復數據。redis提供兩種方式進行持久化,一種是RDB持久化(原理是將Reids在內存中的資料庫記錄定時mp到磁碟上的RDB持久化),另外一種是AOF(append only file)持久化(原理是將Reids的操作日誌以追加的方式寫入文件)。
redis是放在內存的~!
數據量多少絕對不是選擇redis和mysql的准則,因為無論是mysql和redis都可以集群擴展,約束它們的只是硬體(即你有沒有那麼多錢搭建上千個組成的集群),我個人覺得數據讀取的快慢可能是選擇的標准之一,另外工作中往往是兩者同是使用,因為mysql存儲在硬碟,做持久化存儲,而redis存儲在內存中做緩存提升效率。
關系型資料庫是必不可少的,因為只有關系型資料庫才能提供給你各種各樣的查詢方式。如果有一系列的數據會頻繁的查詢,那麼就用redis進行非持久化的存儲,以供查詢使用,是解決並發性能問題的其中一個手段
E. 資料庫緩存機制是什麼緩存是如何作用資料庫
我們都知道MySQL的TableCache是表定義的緩存,江湖上流傳著各種對這個參數的調優方法。
tablecache的作用,就是節約讀取表結構文件的開銷。對於tablecache是否命中,其實tablecache是針對於線程的,每個線程有自己的緩存,只緩存本線程的表結構定義。不過我們發現,strace中沒有關於表結構文件的open操作(只有stat操作,定位表結構文件是否存在),也就是說tablecache不命中鬧亮罩,不一定需要讀取表結構文件。這種感覺好像是:在不命中tablecache時,命中了另外一個表結構緩存。
運維建議:
我們讀一下MySQL的文檔,關於table_open_cache的建議值公式:建議值=最大並發數*join語句涉及的表的最液鬧大個數。
通過實驗我們鍵迅容易理解:table_cache是針對於線程的,所以需要最大並發數個緩存。另外,一個語句join涉及的表,需要同時在緩存中存在。所以最小的緩存大小,等於語句join涉及的表的最大個數。將這兩個數相乘,就得到了MySQL的建議值公式。
F. redis怎麼實現資料庫的緩存
大致為兩種措施:
一、腳本同步:
1、自己寫腳本將資料庫數據寫入到redis/memcached。
2、這就涉及到實時數據變更的問題(mysql row binlog的實時分析),binlog增量訂閱Alibaba 的canal ,以及緩存層數據 丟失/失效 後的數據同步恢復問題。
二、業務層實現:
1、先讀取nosql緩存層,沒有數據再讀取mysql層,並寫入數據到nosql。
2、nosql層做好多節點分布式(一致性hash),以及節點失效後替代方案(多層hash尋找相鄰替代節點),和數據震盪恢復了。
G. 數據是如何存儲的
轉自網友文章: 大型網站資料庫優化
千萬人同時訪問的網站,一般是有很多個資料庫同時工作,說明白一點就是資料庫集群和並發控制,這樣的網站實時性也是相對的。這些網站都有一些共同的特點:數據量大,在線人數多,並發請求多,pageview高,響應速度快。總結了一下各個大網站的架構,主要提高效率及穩定性的幾個地方包括:1、程序
程序開發是一方面,系統架構設計(硬體+網路+軟體)是另一方面。軟體架構方面,做網站首先需要很多web伺服器存儲靜態資源,比如圖片、視頻、靜態頁等,千萬不要把靜態資源和應用伺服器放在一起。一個好的程序員寫出來的程序會非常簡潔、性能很好,一個初級程序員可能會犯很多低級錯誤,這也是影響網站性能的原因之一。
網站要做到效率高,不光是程序員的事情,資料庫優化、程序優化這是必須的,在性能優化上要資料庫和程序齊頭並進!緩存也是兩方面同時入手。第一,資料庫緩存和資料庫優化,這個由dba完成(而且這個有非常大的潛力可挖,只是由於我們都是程序員而忽略了他而已)。第二,程序上的優化,這個非常的有講究,比如說重要一點就是要規范SQL語句,少用in 多用or,多用preparestatement,另外避免程序冗餘如查找數據少用雙重循環等。另外選用優秀的開源框架加以支持,我個人認為中後台的支持是最最重要的,可以選取spring+ibatis。因為ibatis直接操作SQL並有緩存機制。spring的好處就不用我多說了,IOC的機制可以避免new對象,這樣也節省開銷。據我分析,絕大部分的開銷就是在NEW的時候和連接資料庫時候產生的,請盡量避免。另外可以用一些內存測試工具來做一個demo說明hibernate和ibatis誰更快!前台你想用什麼就用什麼,struts,webwork都成,如果覺得自己挺牛X可以試試用tapestry。用資料庫也未必不能解決訪問量巨大所帶來的問題,作成靜態文件硬碟的定址時間也未必少於資料庫的搜索時間,當然對資料的索引要下一翻工夫。我自己覺得門戶往往也就是當天、熱門的資料點擊率較高,將其做緩存最多也不過1~2G的數據量吧,舉個例子:◎ 拿網易新聞來說 http://news.163.com/07/0606/09/3GA0D10N00011229.html
格式化一下,方便理解:http://域名/年/月日/新聞所屬分類/新聞ID.html
可以把當天發布的、熱門的、流攬量大的作個緩寸,用hashtable(key:年-月-日-分類-ID,value:新聞對象),靜態將其放到內存(速度絕對快過硬碟定址靜態頁面)。通常是採用oracle存儲過程+2個weblogic,更新機制也幾乎一樣每簽發一條新聞,就會生成靜態頁面,然後發往前端的web伺服器,前端的web都是做負載均衡的。另外還有定時的程序,每5-15分鍾自動生成一次。在發布新聞的同時將數據緩存。當然緩存也不會越來越大,在個特定的時間段(如凌晨)剔除過期的數據。做一個大的網站遠沒有想像中那麼簡單,伺服器基本就要百十個的。這樣可以大大增加一台計算機的處理速度,如果一台機器處理不了,可以用httpserver集群來解決問題了。2、網路
中國的網路分南北電信和網通,訪問的ip就要區分南北進入不同的網路。3、集群通常會使用CDN與GSBL與DNS負載均衡技術,每個地區一組前台伺服器群,例如:網易,網路使用了DNS負載均衡技術,每個頻道一組前台伺服器,一搜使用了DNS負載技術,所有頻道共用一組前台伺服器集群。網站使用基於Linux集群的負載均衡,失敗恢復,包括應用伺服器和資料庫伺服器,基於linux-ha的服務狀態檢測及高可用化。
應用伺服器集群可以採用apache+tomcat集群和weblogic集群等;web伺服器集群可以用反向代理,也可以用NAT的方式,或者多域名解析都可以;Squid也可以,方法很多,可以根據情況選擇。4、資料庫因為是千萬人同時訪問的網站,所以一般是有很多個資料庫同時工作的,說明白一點就是資料庫集群和並發控制,數據分布到地理位置不同的數據中心,以免發生斷電事故。另外還有一點的是,那些網站的靜態化網頁並不是真的,而是通過動態網頁與靜態網頁網址交換做出現的假象,這可以用urlrewrite這樣的開源網址映射器實現。這樣的網站實時性也是相對的,因為在資料庫復制數據的時候有一個過程,一般在技術上可以用到hibernate和ecache,但是如果要使網站工作地更好,可以使用EJB和websphere,weblogic這樣大型的伺服器來支持,並且要用oracle這樣的大型資料庫。
大型門戶網站不建議使用Mysql資料庫,除非你對Mysql數據的優化非常熟悉。Mysql資料庫伺服器的master-slave模式,利用資料庫伺服器在主從伺服器間進行同步,應用只把數據寫到主伺服器,而讀數據時則根據負載選擇一台從伺服器或者主伺服器來讀取,將數據按不同策略劃分到不同的伺服器(組)上,分散資料庫壓力。
大型網站要用oracle,數據方面操作盡量多用存儲過程,絕對提升性能;同時要讓DBA對資料庫進行優化,優化後的資料庫與沒優化的有天壤之別;同時還可以擴展分布式資料庫,以後這方面的研究會越來越多; 如果我來設計一個海量資料庫,可能首先考慮的就是平行擴容性,原因很簡單,我沒有辦法預估將來的數據規模,那我也就沒有邊界可言,因此,基本上首選dbm類哈希型資料庫,甚至,對於實時性要求很高的資料庫,可能會自行設計庫。 當我們使用業務描述腳本、事務批處理機、目錄服務、底層存取來劃分一個資料庫系統之後,其實,所謂的海量數據需求,也就不是那麼難辦到了。 嗯,這樣還有一個額外的好處,就是由於平行擴容性很好,因此,前期可以以較低成本搭建一個簡單的架子,後期根據業務量逐出擴容。這對很多企業來說,就是入門門檻很低,便於操作,且商業風險也小。MySQL比起動輒幾十萬美金,搭建豪華的Oracle平台,成本低多了。