目錄
NoSQL的簡單介紹
NoSQL:一類新出現的的數據庫,它的特點:
1.不支持SQL語法;
2.存儲結構與傳統關係型數據庫中的那種關係表完全不同,NoSQL中的存儲的數據都是KV形式;
3.NoSQL的世界中沒有一種通用的語言,每個NoSQL數據庫都有自己的API和語法,擅長的業務場景;
4.NoSQL中的產品種類:
(1)MongoDB,文檔型NoSQL數據庫,擅長CMS系統(內容管理系統)
(2)Redis,內存數據庫,數據結構服務器,號稱瑞士軍刀(精巧),功能強大,輕量級
(3)HBase,hadoop生態系統中原生的一種NoSQL數據庫,重量級的分佈式NoSQL數據庫,用於存儲海量數據
(4)Cassandra,hadoop生態系統中原生的一種分佈式NoSQL數據庫,後起之秀
NoSQL 和SQL數據的比較:
1.適用的場景不同,SQL數據庫適用於關係特別複雜的數據查詢場景,NoSQL反之
2.“事務”特性的支持:SQL對事務的支持非常完善,而NoSQL基本不支持事務(Redis部分支持事務)
3.兩者在不斷的取長補短,呈現融合趨勢
1.Redis概念
REmote Dlctionary Server(Redis)是一個由 Salvatore Sanfilippo寫的開源的、高性能的、使用ANSI C語言編寫,遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型,key-value存儲系統,並提供多種語言的API。
Redis常被稱作是一款key-value內存存儲系統或者內存數據庫,同時支持豐富的數據結構,又被稱作爲一種數據結構服務器,因爲其值可以是字符串(String),哈希(Map),列表(list),集合(sets),有序集合(sorted sets)等類型。
Redis與其他key_value緩存產品的3個特點:
1.Redis支持數據的持久化,可以將內存中的數據存儲到磁盤,下次啓動後再加載到內存中
2.Redis支持不僅是簡單的key_value類型的數據,value的值還可以是list,set,hash,zset等其他複雜數據結構
3.Redis支持數據的備份,即master-slave模式的數據備份。
2.Redis優勢
1.性能極高:Redis能讀的速度是110000次/s,寫的速度是81000次/s;
2.豐富的數據類型:Redis支持二進制案例的String,List,Hash,Set及Sorted Set數據類型操作;
3.原子操作:Redis的所有操作都是原子性的,同時Redis還支持幾個操作合併後的原子性執行;(是否完全支持事務待定)
4.豐富的特性:Redis還支持Publish/Subscribe,通知key過期,支持高可用集羣等特性;
5.數據持久化機制:
持久化機制有兩種:
1.RDB方式:定期將內存數據dump到磁盤
2.AOF(append only file)持久化機制:用記日誌的方式記錄每一條數據更新操作,一旦出現災難事件,可以通過日誌重放來恢復整個數據庫
3.Redis 適用場景
1.TopN需求:取最新的n個數據,如讀取作家博客最新的50篇文章,通過List實現按時間排序的數據的高效獲取
2.排行榜應用:以特定條件爲排序標準,將其設成sorted set的score,進而實現高效獲取
3.需要精準設定過期時間的應用:把sorted set 的 sorted 值設置成過期時間的時間戳,那麼就可以簡單地通過過期時間排序,定時清除過期數據
4.計數器應用:Redis的命令都是原子性的,可以輕鬆地利用INCR,DECR命令來構建計數器系統
5.去除大量數據中的重複數據:將數據放入set中,就能實現對重複數據的排除
6.構建隊列系統:使用list 可以構建隊列系統,使用sorted set 甚至 可以構建有優先級的隊列系統
7.實時系統,反垃圾系統:通過上面說到的 set 功能,你可以知道一個終端用戶是否進行了某個操作,可以找到其操作的集合並進行分析統計對比等
8.Publish/SubScribe構建實時消息系統
9.緩存(會話,商品列表,評論列表,經常查詢的數據等)
4.Redis存儲的數據結構詳解
String--字符串
String是Redis最基本的類型,一個key對應一個value,String類型是二進制安全的,可以包含任何數據比如JPG圖片或者序列化對象, 一個鍵最大能存儲512M
操作命令
List--列表
Redis列表是簡單的字符串列表,按照插入順序排序。可以添加一個元素到列表的頭部或者尾部
操作命令
典型需求:
任務調度系統:
生產者不斷產生任務,放入task-queue排隊, 消費者不斷拿出來任務來處理,同時放入一個temp-queue暫存,如果任務處理成功,則清除temp-queue,否則,將任務彈回task-queue。
Set--集合
Redis的Set是string類型的無序集合
集合是通過哈希表實現的,所以添加,刪除,查找的複雜度都是O(1)
ZSet--有序集合
ZSet 和 Set 一樣也是String 類型元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個double類型的分數。Redis 正是通過分數來爲集合中成員進行從小到大的排序。
ZSet的成員是唯一的,但分數(score)卻可以重複。
Hash--哈希表
Redis Hash 是一個鍵值對集合
Redis Hash類型可以看成具有 String Key 和 String Value 的 map 容器
Redis Hash是一個 String 類型的field 和value 的映射表,Hash 特別適合用存儲對象。
鍵值相關命令
服務器相關命令
5.Redis事務
可以一次執行多個命令,本質是一組命令的集合。一個事務中的所有命令都會序列化,按順序地串行化執行而不會被其他命令插入,不需加塞(隔離性)
命令:
discard:取消事務放棄執行事務塊內的所有命令
exec:執行事務塊內的命令
multi:標記一個事務塊開始
unwatch:取消watch 對所有key的監視
watch:監視一個或多個key,如果在事務執行之前被其他命令所改動,那麼事務將被打斷
Redis事務執行過程中不保證原子性:Redis 同一個事務中如果一條命令執行失敗,其後命令仍然會被執行,沒有回滾。
運行前監測中,事務中間一條命令語法寫錯了,則全部撤銷
運行時報出異常,只撤銷異常的語句
6.Redis高可用
在Redis中,實現高可用的技術主要包括持久化、複製、哨兵、集羣
持久化
將數據保存在硬盤中,保證數據不會因進程退出而丟失。
主從複製
複製是高可用Redis的基礎,哨兵和集羣都是在複製基礎上實現的高可用,複製主要實現了數據的多機備份,以及對於讀操作的負載均衡和簡單的故障恢復。缺陷:故障恢復無法自動化;寫操作無法負載均衡,存儲能力受到單機的限制。
哨兵
哨兵在複製的基礎上,哨兵實現了自動化的故障恢復。缺陷:寫操作無法負載均衡,存儲能力受到單機的限制。
集羣
通過集羣,Redis解決了寫操作無法負載均衡,以及存儲能力受到單機限制的問題,實現了較爲完善的高可用方案。
Redis持久化
Redis持久化分爲RDB持久化和AOF持久化:
RDB:將Redis在內存中的數據庫記錄定時dump到磁盤上;
AOF:將Redis的操作日誌依次以追加的方式寫入到磁盤文件中;
RDB方式
有2個觸發條件:
1.手動方式
2.自動觸發
AOF方式
AOF 比快照方式有更好的持久化性,是由於在使用 AOF 持久化方式時,Redis 會將每一個收
到的寫命令都通過 write 函數追加到文件中(默認是 appendonly.aof)。當 Redis 重啓時會通過
重新執行文件中保存的寫命令來在內存中重建整個數據庫的內容。
當然由於 os 會在內核中緩存 write 做的修改,所以可能不是立即寫到磁盤上。這樣 AOF 方
式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴 redis 我們想要
通過 fsync 函數強制 os 寫入到磁盤的時機。有三種方式如下(默認是:每秒 fsync 一次):
兩種持久化方式的總結:
相同數據集的數據 AOF文件要遠大於 rdb 文件,恢復速度慢於 rdb
AOF 運行效率要慢於 rdb,每秒同步策略效率較好,不同步效率和 rdb 相同
Redis 還能對 AOF 文件進行後臺重寫,使得 AOF 文件的體積不至於過大
Redis主從複製
特點:
過程:
配置slave服務器只需要在配置文件中加入如下配置:
slaveof hadoop02 6379 #指定 master 的 ip 和端口
Redis哨兵
一種高可用的redis部署方案。在集羣中的redis-master服務掛掉時,無需人爲干預,即可通過哨兵集羣的自我調 整,實現redis服務的持續可用。
哨兵的作用:
1、監控redis進行狀態,包括master和slave
2、當master down機,能自動將slave切換成master
一般情況下哨兵和主從複製一起使用,保證Redis的高可用
Redis分佈式集羣
架構細節:
1、所有的 redis 節點彼此互聯(ping-pong 機制),內部使用二進制協議優化傳輸速度和帶寬。
2、節點的 fail 是通過集羣中超過半數的節點檢測失效時才生效。
3、客戶端與 redis 節點直連,不需要中間 proxy 層。客戶端不需要連接集羣所有節點,連接集
羣中任何一個可用節點即可。
4、redis-cluster 把所有的物理節點映射到[0-16383]slot 上,cluster 負責維護 node <-> slot <->
value
Redis 集羣中內置了 16384 個哈希槽,當需要在 Redis 集羣中放置一個 key-value 時,redis 先
對 key 使用 CRC16 算法算出一個結果,然後把結果對 16384 求餘數,這樣每個 key 都會對應
一個編號在 0-16383 之間的哈希槽,redis 會根據節點數量大致均等的將哈希槽映射到不同的
節點
Redis 容錯:
1、 投票過程是集羣中所有 master 參與,如果半數以上 master 節點與 master 節點通信超時
(cluster-node-timeout),認爲當前 master 節點掛掉.
2、 什麼時候整個集羣不可用(cluster_state:fail)?如果集羣任意 master 掛掉,且當前 master
沒有 slave.集羣進入 fail 狀態,也可以理解成集羣的 slot 映射[0-16383]不完整時進入 fail
狀態。redis-3.0.0.rc1 加入 cluster-require-full-coverage 參數,默認關閉,打開集羣兼容部
分失敗。如果集羣超過半數以上 master 掛掉,無論是否有 slave,集羣進入 fail 狀態。
附錄Redis.conf配置文件參數說明