Redis(一) - 簡介

Redis

一、 前言

主要是工做中用到redis,有的時候會由於某些點去重複的查詢,索性對redis進行一次梳理,大體會從如下幾方面去梳理:redis的簡介;redis分佈式鎖;緩存穿透、緩存雪崩、緩存擊穿下的解決措施……

二、 簡介

Redis是遠程內存數據庫、非關係型數據庫(non-relational database),能夠存儲鍵(key)與5種不一樣類 型的值(value)之間的映射(mapping),能夠將存儲在內存的鍵值對數據持久化到硬盤,可使用複製特性來擴展讀性能,還可使用客戶端分片來擴展寫性能。html

關鍵點:非關係型數據庫、五種不一樣類型的值、持久化到硬盤的方式、複製特性(主從複製)、客戶端分片mysql

三、 關係型數據庫和非關係型數據庫

關係型數據庫

  • 定義:redis

    • 採用關係模型來組織數據的數據庫
    • 簡單的說,關係模型指的是二維表格模型,而一個關係型數據庫就是由二維表及其之間的聯繫所組成的一個數據組織
  • 優勢sql

    • 複雜查詢:SQL
    • 事務支持

非關係型數據庫

  • 定義:數據庫

    • 指代那些非關係型的,分佈式的,且通常不保證遵循ACID原則的數據存儲系統。非關係型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合
  • 分類:緩存

    • 面向高性能併發讀寫的key-value數據庫服務器

      • 特色:具備極高的併發讀寫性能
      • 表明:Redis、Tokyo Cabinet、Flare
    • 面向海量數據訪問的文檔數據庫數據結構

      • 特色:在海量數據中快速查詢數據
      • 表明:MongoDB、CouchDB
    • 面向可擴展性的分佈式數據庫多線程

      • 特色:適應數據量的增長以及數據結構的變化
  • 優勢併發

    • 性能:基於鍵值對且不須要通過SQL層解析
    • 可擴展性:基礎鍵值對,數據之間沒有耦合性

四、 五種基本類型

數據類型 值類型 備註
String 字符串、整數或者浮點數 /
List 列表 1. 能夠儲存多個相同的字符串<br/>2. 有序
Set 無序集合 1. 經過使用散列表來保證本身存儲的每一個字符串都是各不相同的<br/>2. 無序
hash 散列 /
zset 有序集合 /

Redis命令參考:詳細連接

五、 持久化

持久化的兩種方式

RDB持久化

  • 原理:RDB持久化是指在指定的時間間隔內將內存中的數據集快照寫入磁盤,實際操做過程是fork一個子進程,先將數據集寫入臨時文件,寫入成功後,再替換以前的文件,用二進制壓縮存儲
    圖片描述

AOF持久化

  • 原理:將Reids的操做日誌以追加的方式寫入文件

    圖片描述

  • 同步選項
選項 同步頻率 備註
always 每一個寫命令都同步 會影響服務器性能
everysec 每秒同步一次 比較好,能夠保證系統奔潰時只會丟失一秒左右的數據
no 讓操做系統來決定什麼時候同步 意義不大,會增長系統崩潰時的數據量

兩種方式的選擇

  • AOF:犧牲一些性能,換取更高的緩存一致性
  • RDB:寫操做頻繁的時候,不啓用備份來換取更高的性能,待手動運行save的時候,再作備份

六、 主從複製

緣由

單個Redis服務器會發生單點故障,而且一臺服務器須要處理全部的請求負載,壓力較大

實現機理

當啓動一個Slave進程後,它會向Master發送一個SYNC Command,請求同步鏈接。不管是第一次鏈接仍是從新鏈接,Master都會啓動一個後臺進程,將數據快照保存到數據文件中,同時Master會記錄全部修改數據的命令並緩存在數據文件中。後臺進程完成緩存操做後,Master就發送數據文件給Slave,Slave端將數據文件保存到硬盤上,而後將其在加載到內存中,接着Master就會全部修改數據的操做,將其發送給Slave端。若Slave出現故障致使宕機,恢復正常後會自動從新鏈接,Master收到Slave的鏈接後,將其完整的數據文件發送給Slave,若是Mater同時收到多個Slave發來的同步請求,Master只會在後臺啓動一個進程保存數據文件,而後將其發送給全部的Slave,確保Slave正常

七、爲何選用redis?

與其它數據庫和軟件的對比

名稱 類型 數據庫存儲選項 查詢類型 附加功能
Redis 使用內存存儲(in-memory)的非關係數據庫 字符串、列表、集合、散列表、有序集合 每種數據類型都有本身的專屬命令,另外還有批量操做(bulk operation)和不徹底(partial)的事務支持 發佈與訂閱,主從複製(master/slave replication),持久化,腳本(存儲過程,stored procedure)
memcached 使用內存存儲的鍵值緩存 鍵值之間的映射 建立命令、讀取命令、更新命令、刪除命令以及其餘幾個命令 爲提高性能而設的多線程服務器
MySQL 關係數據庫 每一個數據庫能夠包含多個表,每一個表能夠包含多個行;能夠處理多個表的視圖(view);支持空間(spatial)和第三方擴展 SELECT、 INSERT、 UPDATE、 DELETE、函數、存儲過程 支持ACID性質(須要使用InnoDB),主從複製和主主複製 (master/master replication)
PostgreSQL 關係數據庫 每一個數據庫能夠包含多個表,每一個表能夠包含多個行;能夠處理多個表的視圖;支持空間和第三方擴展;支持可定製類型 SELECT、 INSERT、 UPDATE、 DELETE、內置函數、自定義的存儲過程 支持ACID性質,主從複製,由第三方支持的多主複製(multi-master replication)
MongoDB 使用硬盤存儲(on-disk)的非關係文檔存儲 每一個數據庫能夠包含多個表,每一個表能夠包含多個無schema(schema-less)的BSON文檔 建立命令、讀取命令、更新命令、刪除命令、條件查詢命令等 支持map-reduce操做,主從複製,分片,空間索引(spatial index)

優勢

  • 讀寫性能優異

    • 由於數據存在內存中,相似於HashMap,HashMap的優點就是查找和操做的時間複雜度都是O(1)
    • Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 支持豐富數據類型

    • string(字符串),list(列表),set(集合),zset(有序集合),hash(散列)
  • 支持事務

    • 操做都是原子性,所謂的原子性就是對數據的更改要麼所有執行,要麼所有不執行
  • 豐富的特性

    • 可用於緩存,消息,按key設置過時時間,過時後將會自動刪除

缺點

  • 本質上Redis是一個基於內存的cache,在數據落地、持久化方面不如mysql,若是redis達到了最大的內存限制後,會致使全部的寫命令失敗
相關文章
相關標籤/搜索