在Memcached的高速緩存,MySQL的主從複製,讀寫分離的基礎之上,這時MySQL主庫的寫壓力開始出現瓶頸,而數據量的持續猛增,因爲MyISAM使用表鎖,在高併發下會出現嚴重的鎖問題,大量的高併發MySQL應用開始使用InnoDB引擎代替MyISAMjava
同時,開始流行使用分表分庫來緩解寫壓力和數據增加的擴展問題。這個時候,分表分庫成了一個熱門技術,是面試的熱門問題也是業界討論的熱門技術問題。也就在這個時候,MySQL推出了還不太穩定的表分區,這也給技術實力通常的公司帶來了但願。雖然MySQL推出了MySQL Cluster集羣,但性能也不能很好知足互聯網的要求,只是在高可靠性上提供了很是大的保證node
NoSQL(NoSQL = Not Only SQL ),意即「不只僅是SQL」mysql
泛指非關係型的數據庫。隨着互聯網web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤爲是大數據應用難題,包括超大規模數據的存儲git
(例如谷歌或Facebook天天爲他們的用戶收集萬億比特的數據)。這些類型的數據存儲不須要固定的模式,無需多餘操做就能夠橫向擴展程序員
RDBMS vs NoSQLgithub
RDBMS | NoSQL |
---|---|
高度組織化結構化數據 | 表明着不只僅是SQL |
結構化查詢語言(SQL) | 沒有聲明性查詢語言 |
數據和關係都存儲在單獨的表中 | 沒有預約義的模式 |
數據操縱語言,數據定義語言 | 鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫 |
嚴格的一致性 | 最終一致性,而非ACID屬性 |
基礎事務 | 非結構化和不可預知的數據 |
CAP定理 | |
高性能,高可用性和可伸縮性 |
什麼是BSON:BSON()是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON,它和JSON同樣,支持內嵌的文檔對象和數組對象web
BSON數據模型面試
{ "customer":{ "id":1136, "name":"Z3", "billingAddress":[{"city":"beijing"}], "orders":[ { "id":17, "customerId":1136, "orderItems":[{"productId":27,"price":77.5,"productName":"thinking in java"}], "shippingAddress":[{"city":"beijing"}] "orderPayment":[{"ccinfo":"111-222-333","txnid":"asdfadcd334","billingAddress":{"city":"beijing"}}], } ] } }
CAP理論就是說在分佈式存儲系統中,最多隻能實現上面的兩點。而因爲當前的網絡硬件確定會出現延遲丟包等問題,因此分區容忍性是咱們必須須要實現的。因此咱們只能在一致性和可用性之間進行權衡,沒有NoSQL系統能同時保證這三點redis
C:強一致性 、A:高可用性 、P:分佈式容忍性算法
CA 傳統Oracle數據庫
AP 大多數網站架構的選擇
CP Redis、Mongodb
注意:分佈式架構的時候必須作出取捨。一致性和可用性之間取一個平衡。多餘大多數web應用,其實並不須要強一致性。所以犧牲C換取P,這是目前分佈式數據庫產品的方向
BASE就是爲了解決關係數據庫強一致性引發的問題而引發的可用性下降而提出的解決方案。
BASE實際上是下面三個術語的縮寫:
它的思想是經過讓系統放鬆對某一時刻數據一致性的要求來換取系統總體伸縮性和性能上改觀。爲何這麼說呢,原因就在於大型系統每每因爲地域分佈和極高性能的要求,不可能採用分佈式事務來完成這些指標,要想得到這些指標,咱們必須採用另一種方式來完成,這裏BASE就是解決這個問題的辦法
分佈式系統(distributed system
簡單來說:
分佈式:不一樣的多臺服務器上面部署不一樣的服務模塊(工程),他們之間經過Rpc/Rmi之間通訊和調用,對外提供服務和組內協做
集羣:不一樣的多臺服務器上面部署相同的服務模塊,經過分佈式調度軟件進行統一的調度,對外提供服務和訪問
Redis:REmote DIctionary Server(遠程字典服務器)
是徹底開源免費的,用C語言編寫的,遵照BSD協議,是一個高性能的(key/value)分佈式內存數據庫,基於內存運行,並支持持久化的NoSQL數據庫,是當前最熱門的NoSql數據庫之一,也被人們稱爲數據結構服務器
Redis 與其餘 key - value 緩存產品(memcache)有如下三個特色
注意gcc版本
詳細操做參考:升級gcc
select 0
它是一個字符串鏈表,left、right均可以插入添加;若是鍵不存在,建立新的鏈表;若是鍵已存在,新增內容;若是值全移除,對應的鍵也就消失了。
鏈表的操做不管是頭和尾效率都極高,但假如是對中間元素進行操做,效率就很慘淡了。
在set基礎上,加一個score值,以前set是k1 v1 v2 v3,如今zset是k1 score1 v1 score2 v2
格式: save 秒鐘 寫操做的次數
RDB是整個內存的壓縮過的Snapshot,RDB的數據結構,能夠配置複合的快照觸發條件,
默認是1分鐘內改了1萬次,或5分鐘內改了10次,或15分鐘內改了1次
save 900 1
save 300 5
save 60 10000
禁用
若是保存出錯 中止寫操做的意思
若是配置成no,表示你不在意數據不一致或者有其餘的手段發現和控制
三種策略
看法析配置文件---APPEND ONLY MODE追加
啓動:設置Yes,修改默認的appendonly no,改成yes
備份被寫壞的AOF文件
修復:Redis-check-aof --fix aof文件 進行修復
恢復:重啓redis而後從新加載
AOF採用文件追加方式,文件會愈來愈大爲避免出現此種狀況,新增了重寫機制,當AOF文件的大小超過所設定的閾值時,Redis就會啓動AOF文件的內容壓縮,只保留能夠恢復數據的最小指令集.可使用命令bgrewriteaof
RDB持久化方式可以在指定的時間間隔能對你的數據進行快照存儲
AOF持久化方式記錄每次對服務器寫的操做,當服務器重啓的時候會從新執行這些命令來恢復原始的數據,AOF命令以redis協議追加保存每次寫的操做到文件末尾,Redis還能對AOF文件進行後臺重寫,使得AOF文件的體積不至於過大
只作緩存:若是你只但願你的數據在服務器運行的時候存在,你也能夠不使用任何持久化方式.
一個隊列中,一次性、順序性、排他性的執行一系列命令
即便錯了,可是加入進隊列了queued ,而不是像case3在運行時直接報錯並無加入隊列
取消監控
Watch指令,相似樂觀鎖,事務提交時,若是Key的值已被別的客戶端改變,好比某個list已被別的客戶端push/pop過了,整個事務隊列都不會被執行
經過WATCH命令在事務執行以前監控了多個Keys,假若在WATCH以後有任何Key的值發生了變化,EXEC命令執行的事務都將被放棄,同時返回Nullmulti-bulk應答以通知調用者事務執行失敗
單獨的隔離操做:事務中的全部命令都會序列化、按順序地執行。事務在執行的過程當中,不會被其餘客戶端發送來的命令請求所打斷
沒有隔離級別的概念:隊列中的命令沒有提交以前都不會實際的被執行,由於事務提交前任何指令都不會被實際執行,也就不存在」事務內的查詢要看到事務裏的更新,在事務外查詢不能看到」這個讓人萬分頭痛的問題
不保證原子性:redis同一個事務中若是有一條命令執行失敗,其後的命令仍然會被執行,沒有回滾---部分支持事務
Init
info replication 查看信息
一個Master兩個Slave
日誌查看
主從問題演示
1.切入點問題?slave一、slave2是從頭開始複製仍是從切入點開始複製?好比從k4進來,那以前的123是否也能夠複製
答:切入點複製,不須要從頭複製
2.從機是否能夠寫?set能否?
答:從機只讀,不可set
3.主機shutdown後狀況如何?從機是上位仍是原地待命
答:原地待命,不上位
4.主機又回來了後,主機新增記錄,從機還可否順利複製
答:能夠順利複製
5.其中一臺從機down後狀況如何?依照原有它能跟上大部隊嗎?
答:恢復後,會取消以前的主從設置,變爲master。 從新slaveof便可
上一個Slave能夠是下一個slave的Master,Slave一樣能夠接收其餘slaves的鏈接和同步請求,那麼該slave做爲了鏈條中下一個的master,能夠有效減輕master的寫壓力(去中心化)
中途變動轉向:會清除以前的數據,從新創建拷貝最新的
Slaveof 新主庫IP 新主庫端口
反客爲主的自動版,可以後臺監控主機是否故障,若是故障了根據投票數自動將從庫轉換爲主庫
Redis-sentinel /opt/redis-6.0.6/sentinel.conf
通俗點講,watch命令就是標記一個鍵,若是標記了一個鍵, 在提交事務前若是該鍵被別人修改過,那事務就會失敗,這種狀況一般能夠在程序中從新再嘗試一次
6379,6380啓動,先各自先獨立
主寫
從讀
maxActive:控制一個pool可分配多少個jedis實例,經過pool.getResource()來獲取;若是賦值爲-1,則表示不限制;若是pool已經分配了maxActive個jedis實例,則此時pool的狀態爲exhausted
maxIdle:控制一個pool最多有多少個狀態爲idle(空閒)的jedis實例
whenExhaustedAction:表示當pool中的jedis實例都被allocated完時,pool要採起的操做;
默認有三種:
maxWait:表示當borrow一個jedis實例時,最大的等待時間,若是超過等待時間,則直接拋JedisConnectionException;
testOnBorrow:得到一個jedis實例的時候是否檢查鏈接可用性(ping());若是爲true,則獲得的jedis實例均是可用的;
testOnReturn:return 一個jedis實例給pool時,是否檢查鏈接可用性(ping())
testWhileIdle:若是爲true,表示有一個idle object evitor線程對idle object進行掃描,若是validate失敗,此object會被從pool中drop掉;這一項只有在timeBetweenEvictionRunsMillis大於0時纔有意義;
timeBetweenEvictionRunsMillis:表示idle object evitor兩次掃描之間要sleep的毫秒數;
numTestsPerEvictionRun:表示idle object evitor每次掃描的最多的對象數;
minEvictableIdleTimeMillis:表示一個對象至少停留在idle狀態的最短期,而後才能被idle object evitor掃描並驅逐;這一項只有在timeBetweenEvictionRunsMillis大於0時纔有意義;
softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基礎上,加入了至少minIdle個對象已經在pool裏面了。若是爲-1,evicted不會根據idle time驅逐任何對象。若是minEvictableIdleTimeMillis>0,則此項設置無心義,且只有在timeBetweenEvictionRunsMillis大於0時纔有意義;
lifo:borrowObject返回對象時,是採用DEFAULT_LIFO(last in first out,即相似cache的最頻繁使用隊列),若是爲False,則表示FIFO隊列;
其中JedisPoolConfig對一些參數的默認設置以下:
testWhileIdle=true
minEvictableIdleTimeMills=60000
timeBetweenEvictionRunsMillis=30000
numTestsPerEvictionRun=-1
一個Redis集羣包含16384個插槽(hash slot),數據庫中每一個鍵都屬於這16384個插槽的其中一個,集羣使用公式CRC16(key) % 16384 來計算鍵key屬於哪一個槽,其中CRC16(key)用於計算鍵key的CRC16校驗和
集羣中的每一個節點負責處理一部分插槽,舉個例子,若是一個集羣能夠有主節點,其中: