NoSQL之Redis數據庫基本知識

目錄

 

NoSQL的簡單介紹

NoSQL 和SQL數據的比較:

1.Redis概念

2.Redis優勢

3.Redis 適用場景

4.Redis存儲的數據結構詳解

     String--字符串

     List--列表

     Set--集合

     ZSet--有序集合

              Hash--哈希表

5.Redis事務

6.Redis高可用

        Redis持久化

            RDB方式

             AOF方式

           Redis主從複製

           Redis哨兵

           Redis分佈式集羣

附錄Redis.conf配置文件參數說明


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配置文件參數說明

 

                            

                       

                       

                        

                        

                        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章