NoSQL概述 什麼是NoSQL NoSQL不僅僅是SQL,它是Not Only SQL 的縮寫,也是眾多非關係型資料庫的統稱NoSQL和關係型資料庫一樣,也是用來存儲數據的倉庫。 為什麼需要NoSQL? 隨著互聯網的高速發展,數據量、訪問量呈爆髮式式增長。比如12306中國鐵路票務系統。 一年售出 ...
NoSQL概述
什麼是NoSQL
NoSQL不僅僅是SQL,它是Not Only SQL 的縮寫,也是眾多非關係型資料庫的統稱NoSQL和關係型資料庫一樣,也是用來存儲數據的倉庫。
為什麼需要NoSQL?
隨著互聯網的高速發展,數據量、訪問量呈爆髮式式增長。比如12306中國鐵路票務系統。
一年售出車票有30多億張;
網上售票比例超過了80%;
互聯網高峰日售出車票達到了1282多萬張;
高峰時每秒售票超出1000張;
網站高峰日訪問量超過了1600億次……
12306售票系統
已成為全球最大的票務交易系統
中國人民徹夜排隊買票已成為歷史
這麼多的數據都是需要存儲的,然而傳統的關係型資料庫面對這些海量數據的存儲,以及實現高訪問量、高併發讀/寫,就會顯的力不從心,尤其是當面對超大規模、高併發、高吞吐量的大型動態網站的時候,就會暴露出很多難以剋服的問題,影響用戶體驗。為了滿足對海量數據的高速存儲需求,實現高併發、高吞吐量,NoSQL應運而生。NoSQL的出現可以解決傳統關係型資料庫所不能解決的問題。
NoSQL特點
- 容易擴展,方便使用,數據之間沒有關係。
- 數據模型非常靈活,無需提前為要存儲的數據建立欄位類型,隨時可以存儲自定義的數據格式。
- 適合大數據量、高性能的存儲。
- 具有高併發讀/寫、高可用性。
Redis概述
Redis由來
2008年,義大利的一家創業公司Merzia推出了一款基於MySQL的網站實時統計系統LLOOGG,沒多久該公司的創始人Sanfilippo對MySQL的性能感到失望,於是他決定親自為LLOOGG量身定做一個資料庫,並於2009年開發完成,這個資料庫就是Redis。
什麼是Redis
Redis(全稱:Remote Dictionary Server 遠程字典服務)是一個開源的、使用C語言編寫、支持網路、可基於記憶體亦可持久化的Key-Value資料庫,並提供多種語言的API。
Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
Redis為什麼快
- 完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。
- 數據結構簡單,對數據操作也簡單,Redis中的數據結構是專門進行設計的;
- 採用單線程,避免了不必要的上下文切換和競爭條件,也不存在多進程或者多線程導致的切換而消耗 CPU,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的性能消耗;
- 使用多路I/O復用模型,非阻塞IO;
Redis的安裝和使用
Windows下安裝
下載地址:https://github.com/MSOpenTech/redis/releases。
Redis 支持 32 位和 64 位。這個需要根據你系統平臺的實際情況選擇,這裡我們下載 Redis-x64-xxx.zip解壓後,將文件夾重新命名為 redis。
打開文件夾,內容如下:
雙擊redis-server.exe,啟動服務端,輸入之後,會顯示如下界面:
這時候啟動一個 cmd 視窗,原來的不要關閉,不然就無法訪問服務端了。
切換到 redis 目錄下運行:
redis-cli.exe -h 127.0.0.1 -p 6379
Linux 下安裝
下載地址:http://redis.io/download,下載最新穩定版本。
本教程使用的最新文檔版本為 2.8.17,下載並安裝:
$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz
$ tar xzf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make
make完後 redis-2.8.17目錄下會出現編譯後的redis服務程式redis-server,還有用於測試的客戶端程式redis-cli,兩個程式位於安裝目錄 src 目錄下:
下麵啟動redis服務.
$ cd src
$ ./redis-server
註意這種方式啟動redis 使用的是預設配置。也可以通過啟動參數告訴redis使用指定配置文件使用下麵命令啟動。
$ cd src
$ ./redis-server ../redis.conf
redis.conf 是一個預設的配置文件。我們可以根據需要使用自己的配置文件。
啟動redis服務進程後,就可以使用測試客戶端程式redis-cli和redis服務交互了。 比如:
$ cd src
$ ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
Ubuntu 下安裝
在 Ubuntu 系統安裝 Redis 可以使用以下命令:
$sudo apt-get update
$sudo apt-get install redis-server
啟動 Redis
$ redis-server
查看 redis 是否啟動?
$ redis-cli
以上命令將打開以下終端:
redis 127.0.0.1:6379>
127.0.0.1 是本機 IP ,6379 是 redis 服務埠。現在我們輸入 PING 命令。
redis 127.0.0.1:6379> ping
PONG
以上說明我們已經成功安裝了redis。
Redis的數據結構
Redis 字元串(String)
概述
字元串類型是Redis中最為基礎的數據存儲類型。在Redis中字元串類型的Value最多可以容納的數據長度是512M。
常用命令
- 賦值
- 取值
- 刪除
del key:刪除指定的key
- 數值增減
Redis 哈希(Hash)
概述
Hash類型可以看出具有String key 和String value 的map容器。所以該類型非常適合於存儲值為對象的信息。如username、password和age等。每一個hash可以存儲4294967295個鍵值對
常用命令
- 賦值
- 取值
- 刪除
其他
Redis 列表(List)
概述
List類型是按照插入順序排序的雙向鏈表。從元素插入和刪除的效率視角來看,如果我們在鏈表的兩頭插入或刪除元素,這將會是非常高效的操作,即使鏈表中已經存儲了大量的數據,該操作也可以在常量時間內完成。
常用命令
- 兩端添加
- 查看列表
- 兩端彈出
- 獲取列表中元素的個數
Redis 集合(Set)
概述
Set類型為沒有排序的字元集合。Set集合中不允許出現重覆的元素。Set類型在功能上還存在一個非常重要的特性,即集合的聚合操作效率極高。
常用命令
- 添加/刪除元素
- 獲得集合中的元素
- 集合的差集運算 A-B
- 集合的交集運算 A∩B
- 集合中的並集運算 A∪B
Redis 有序集合(sorted set)
概述
有序集合和Set類型即為相似,都不允許重覆的成員出現在一個Set中。它們之間的主要差別是有序集合中的每一個成員都會有一個score與之關聯,通過score來為集合中的成員進行從小到大的排序。
常用命令
- 添加元素
- 獲得元素
- 刪除元素
- 範圍查詢
Redis特性
多資料庫
一個Redis實例最多可提供16個資料庫,下標從0到15,客戶端預設連接第0號。
消息訂閱與發佈
- subscribe channel:訂閱頻道。例如subscribe mychat,訂閱mychat這個頻道
- psubscribe channel:批量訂閱頻道。例如psubscribe s,訂閱以s開頭的頻道。
- publish channel content:在指定的頻道中發佈消息,如punlish mychat ‘today is a newday’
Redis事務
Redis作為NoSQL資料庫也提供了事務機制。
特點:
- 在事務中的所有命令都將會被串列化的順序執行,事務執行期間,Redis不會再為其他客戶端請求提供任何服務,從而保證了事務中的所有命令被原子的執行。
- 和關係型資料庫中的事務相比,在Redis事務中如果有某一條命令執行失敗,其後的命令仍然被繼續執行。
Redis持久化
Redis的高性能是由於其將所有的數據都存儲在了記憶體中,為了使Redis在重啟之後仍能保證不丟失,需要將數據從記憶體中同步到硬碟中,這一過程就是持久化。
Redis支持兩種方式的持久化,一種是RDB方式,一種是AOF方式。可以單獨使用,也可以結合使用。
- RDB持久化(預設)
在指定的時間間隔內將記憶體中的數據集快照寫入磁碟。 - AOF持久化
以日誌的形式記錄伺服器所處理的每一個寫操作,在Redis伺服器啟動之初會讀取該文件來重新構建資料庫,以保證啟動後資料庫中的數據是完整的。
Key值過期
Redis的應用場景
- 緩存(最多使用)
- 聊天室的線上好友列表 發佈/訂閱
- 任務隊列(秒殺、搶購) 消息隊列、(先進先出、後進先出) (List)
- 應用排行榜(有序集合)
- 網站訪問統計(Set)
- 數據過期處理(可以精確到毫秒)
- 分散式集群框架中的session分離。