Like Share Discussion Bookmark Smile

J.J. Huang   2019-04-06   Redis   瀏覽次數:

Redis - 第一章 | 簡介

因為已經開始介紹到Spring Boot Redis的集成和使用,所以這邊要開始好好介紹一下Redis,讓自己有個較完整的認識,而不是單純的去做使用而已。

隨著網際網路的發展,我們把一台一台伺服器變成多台伺服器。當開始建立資料備份時,需要加一個緩衝層來調整所有的查詢,投入更多硬體。最後,需要將資料切分多個集群上,並重構大量的應用邏輯以適應這種切分。不久之後,你就會發現被自己數月前的設計資料結構限制住了。

隨著web2.0的興起,關聯式資料庫本身無法克服的缺陷越來越明顯,主要表現為如下幾點:
1.對資料高併發讀寫的需求
2.對海量資料的高效率存儲和訪問的需求。
3.對資料庫的高可擴展性和高可用性的需求。
4.資料庫事務一致性需求。
5.資料庫寫實性和讀寫時性需求。
6.對複雜SQL的查詢,特別是對關聯查詢的需求。

NoSQL 是 Notonly SQL 的縮寫,NoSQL 不使用SQL作為查詢語言。其資料存儲可以不需要固定的表格模式,也經常避免使用SQL的join操作,一般有水準可擴展性的特徵。

NoSQL又分成四大類:
1.Key-Value,如Redis。
2.Document-Oriented,如MongoDB。
3.Wide Column Store,如Cassandra。
4.Graph-Oriented,如Neo4J。
而本篇要介紹的主角則是Key-Value的Redis。


Redis介紹

Redis(Remote Dictionary Server)是一款open source,基於BSD(Berkeley Software Distribution)許可的,高級鍵值(key-value)緩存(cache)和存儲(store) 系統。由於 Redis的鍵包括字串(string)、雜湊(hash)、清單(list)、集合(set)、有序集合(sorted set)、點陣圖(bitmap)和超重對數(hyperloglog),所以常常被稱為資料結構伺服器。你可以在這些類型上面運行原子(atomic)操作,例如,追加字串,增加雜湊中的值,加入一個元素到清單,計算集合的交集、並集和差集,或者是從有序集合中獲取最高排名的元素。

為了滿足高性能,Redis採用記憶體 (in-memory) 資料集 (dataset)。根據你的使用場景,可以通過每隔一段時間轉儲資料集到磁片,或者追加每條命令到日誌來持久化(persistence)。如果只是需要一個功能豐富,網路化的記憶體緩存,持久化也可以被禁用。

Redis還支援主從(master-slave)非同步複製,非常快的非阻塞初次同步、網路斷開時自動重連局部重同步。 其他特性包括:
事務

  • 訂閱/發佈(publish/subscribe)
  • Lua script
  • 帶TTL的鍵
  • LRU回收鍵
  • 自動容錯移轉 (failover)

Redis優點

  • 性能極高,能支持超過 100K+ 每秒的讀寫頻率。
  • 豐富的資料類型,Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料類型操作。
  • 豐富的特性,Redis支持 publish/subscribe, 通知, key 過期等等特性。

Redis與其他key-value存儲有什麼不同?

  • Redis有著更為複雜的資料結構並且提供對他們的原子性操作,這是一個不同於其他資料庫的進化路徑。 Redis的資料類型都是基於基本資料結構的同時對程式透明,無需進行額外的抽象。
  • Redis運行在記憶體中但是可以持久化到磁片,所以在對不同資料集進行高速讀寫時需要權衡記憶體,應為資料量不能大於硬體記憶體。在記憶體中資料庫方面的另一個優點是, 相比在磁片上相同的複雜的資料結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情。同時,在磁片格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。

Redis運行環境

  • Redis是由 ANSI C語言編寫的,在無需額外依賴下,運行於大多數 POSIX系統,如 Linux、*BSD、OS X。 Redis是在Linux和OS X兩款作業系統下開發和充分測試的,因此推薦 Linux 為部署環境。
  • Redis也可以運行在Solaris派生系統上,如SmartOS,但是支援有待加強。
  • 官方沒有支援的Windows構建版本,但是微軟開發和維護了一個64位Windows的版本。或是可使用Microsoft Azure建立一個Redis伺服器。

什麼是 BSD 協議?
BSD開源協議是一個給於使用者很大自由的協議。可以自由的使用,修改源代碼,也可以將修改後的代碼作為開源或者專有軟件再發布。當你發布使用了BSD協議的代碼,或者以BSD協議代碼為基礎做二次開發自己的產品時,需要滿足三個條件:
如果再發布的產品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD協議。
如果再發布的只是二進制類庫/軟件,則需要在類庫/軟件的文件和版權聲明中包含原來代碼中的BSD協議。
不可以用開源代碼的作者/機構名字和原來產品的名字做市場推廣。
BSD代碼鼓勵代碼共享,但需要尊重代碼作者的著作權。 BSD由於允許使用者修改和重新發布代碼,也允許使用或在BSD代碼上開發商業軟件發布和銷 售,因此是對商業集成很友好的協議。
很多的公司企業在選用開源產品的時候都首選BSD協議,因為可以完全控制這些第三方的代碼,在必要的時候可以修改或者 二次開發。


什麼是原子性,什麼是原子性操作?
舉個例子:
A想要從自己的帳戶中轉1000塊錢到B的​​帳戶裡。那個從A開始轉帳,到轉帳結束的這一個過程,稱之為一個事務。在這個事務裡,要做如下操作:

  1. 從A的帳戶中減去1000塊錢。如果A的帳戶原來有3000塊錢,現在就變成2000塊錢了。
  2. 在B的帳戶裡加1000塊錢。如果B的帳戶如果原來有2000塊錢,現在則變成3000塊錢了。
    如果在A的帳戶已經減去了1000塊錢的時候,忽然發生了意外,比如停電什麼的,導致轉帳事務意外終止了,而此時B的帳戶裡還沒有增加1000塊錢。那麼,我們稱這個操作失敗了,要進行回滾。回滾就是回到事務開始之前的狀態,也就是回到A的帳戶還沒減1000塊的狀態,B的帳戶的原來的狀態。此時A的帳戶仍然有3000塊,B的帳戶仍然有2000塊。
    我們把這種要就一起成功(A帳戶成功減少1000,同時B帳戶成功增加1000),要就一起失敗(A帳戶回到原來狀態,B帳戶也回到原來狀態)的操作叫原子性操作。
    如果把一個事務可看作是一個程序,它要就完整的被執行,要就完全不執行。這種特性就叫原子性。

什麼是 key value 存儲?
JAVA 中的 map 就是 key=>value 存儲的。
鍵 => 值(key=>value)對,鍵唯一,對應一個值,值的形式多樣。


Redis 指令

Redis 命令用於在 redis 服務上執行操作。
要在 redis 服務上執行命令需要一個 redis 客戶端。 Redis 客戶端在我們之前下載的的 redis 的安裝包中。

語法

Redis 客戶端的基本語法為:

1
$ redis-cli

範例

範例中我們連接到本地的 redis 服務並執行 PING 命令,該命令用於檢測 redis 服務是否啟動。
有時候會有中文亂碼的問題,在 redis-cli 後面加上 –raw 即可。

1
redis-cli --raw

註:以上參考了
Redis 简介
Redis 3.0 中文版
淺談NoSQL資料庫-Redis
第1章 初识Redis