非關係型資料庫-NoSQL(Redis)
文章目錄
一、什麼是 NoSQL?
NoSQL(NoSQL = Not Only SQL ),意為不僅僅是SQL
,是一項全新的資料庫革命性運動,2000 年 前就有人提出,發展至 2009 年趨勢越發高漲。它是指運用非關係型的資料儲存,相對於鋪天蓋地的關係型資料庫運用,這一概念無疑是一種全新的思維的注入。
隨著網際網路 web2.0 網站的興起,傳統的關係資料庫在應付 web2.0 網站,特別是超大規模和高併發的 SNS 型別的 web2.0 純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的資料庫則由於其本身的特點得到了非常迅速的發展。NoSQL 資料庫的產生就是為了解決大規模資料集合多重資料種類帶來的挑戰,尤其是大資料應用難題。
分類 | 舉例 | 典型應用場景 | 資料模型 | 優點 |
---|---|---|---|---|
鍵值(key-value) | Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB | 內容快取,主要用於處理大量資料的高訪問負載,也用於一些日誌系統等等。 | Key 指 向 Value 的鍵值對,通常用hash table 來實現 | 查詢速度快 |
列儲存資料庫 | Cassandra, HBase, Riak | 分散式的檔案系統 | 以列簇式儲存,將同一列資料存在一起 | 查詢速度快,可擴充套件性強,更容易進行分散式擴充套件 |
文件型資料庫 | CouchDB, MongoDb | Web 應 用 ( 與Key-Value 類似,Value 是結構化的,不同的是資料庫能夠了解 Value 的內容) | Key-Value 對應的鍵值對,Value 為結構化資料 | 資料結構要求不嚴格,表結構可變,不需要像關係型資料庫一樣需要預先定義表結構 |
圖形(Graph)資料庫 | Neo4J, InfoGrid, Infinite Graph | 社交網路,推薦系統等。專注於構建關係圖譜 | 圖結構 | 利用圖結構相關演算法。比如最短路徑定址,N 度關係查詢等 |
二、NoSQL 的特性?
NoSQL 是 key-value 形式儲存,和傳統的關係型資料庫不一樣,不一定遵循傳統資料庫的一些基本要求,比如說遵循 SQL 標準、ACID 屬性、表結構等等。
這類資料庫主要有以下特點:
- 非關係型的、分散式、開源的、水平可擴充套件的
- 處理超大量資料
- 擊碎了效能瓶頸
- 對資料高併發讀寫
- 對海量資料的高效率儲存和訪問
- 對資料的高擴充套件性和高可用性
三、什麼是 Redis?
Redis 是一個開源的,先進的 key-value 儲存。
它通常被稱為資料結構伺服器,因為鍵可以包含 string(字串)、hash(雜湊)、list(連結串列)、set(集合)和 zset(sorted-set–有序集合)。這些資料型別都支援 push/pop、add/remove 及取交集並集和差集及更豐富的操作。
Redis 和 Memcached 類似,它支援儲存的 value 型別相對更多,與 memcached 一樣,為了保證效率,資料都是快取在記憶體中,區別是 Redis 會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了 master-slave(主從)同步
四、Redis 安裝部署
Redis 的官方網站是:
4.1 下載安裝包
[root@localhost ~]$ wget http://download.redis.io/releases/redis-2.8.6.tar.gz
4.2 編譯安裝
[root@localhost ~]$ yum -y install gcc* make
[root@localhost ~]$ tar –zxvf redis-2.8.6.tar.gz
[root@localhost ~]$ cd redis-2.8.6
[root@localhost ~]$ make
[root@localhost ~]$ make PREFIX=/usr/local/redis install
#指定安裝位置,如果沒有指定安裝位置PREFIX=/usr/local/redis
#則 make install 會把 redis 安裝到/usr/local/bin/目錄下
[root@localhost ~]$ mkdir /usr/local/redis/etc
[root@localhost ~]$ cp ./redis.conf /usr/local/redis/etc/
#複製 Redis 的配置檔案到/usr/local/redis/etc/下,便於管理。
4.3 修改配置檔案
[root@localhost ~]$ vim /usr/local/redis/etc/redis.conf
daemonize no #修改為 yes #後臺啟動
4.4 啟動服務
/usr/local/redis/bin/redis-server 配置檔案
#必須制定配置檔案位置,否則會提示警告
[root@localhost ~]$
4.5 客戶端連線
/usr/local/redis/bin/redis-cli
-h IP: 連線指定的 redis 伺服器
-p 6379: 指定 redis 伺服器的埠
-a 密碼: 使用密碼登入
-n 資料庫號: 指定連線哪個資料庫
--raw: redis 支援儲存中文
[root@localhost ~]$
4.6 停止 Redis
[root@localhost ~]$ /usr/local/redis/bin/redis-cli shutdown
#或
[root@localhost ~]$ pkill -9 redis
五、Redis 常用命令
5.1 string 型別及操作
string 是最簡單的型別,一個 key 對應一個 value
,string 型別是二進位制安全的。redis 的 string 可以包含任何資料。
5.1.1 set
設定 key 對應的值為 string 型別
例如:我們新增一個 name=atguigu 的鍵值對應
[root@localhost ~]$ redis127.0.0.1:6379>set name atguigu
5.1.2 setnx
設定 key 對應的值為 string 型別如果 key 已經存在,返回 0,nx 是 not exist 的意思
[root@localhost ~]$
5.1.3 get
獲取 key 對應的 string 值,如果 key 不存在返回 nil
[root@localhost ~]$
5.1.4 mset & mget
同時設定和獲取多個鍵值對
[root@localhost ~]$
5.1.5 incrby
對 key 的值做加加(指定值)操作,並返回新的值
[root@localhost ~]$
5.1.6 del
刪除一個已建立的 key
[root@localhost ~]$
5.2 hash 型別及操作
Redis hash 是一個 string 型別的 field(欄位)和 value 的對映表
,它的新增、刪除操作都是 0(1)平均;hash 特別適合用於儲存物件,相較於將物件的每個欄位存成單個 string 型別,將一個物件儲存在 hash 型別中會佔用更少的記憶體,並且可以更方便的存取整個物件。
5.2.1 hset
設定 hash field 為指定值,如果 key 不存在,則先建立。
例如:為 num1 表建立一個叫 name 欄位(key),鍵值是 liuchuan
[root@localhost ~]$ redis127.0.0.1:6379>hset num1 name liuchuan
5.2.1 hget、hmset、hmget
意義同上近似,用於返回雜湊表中指定欄位的值
[root@localhost ~]$
5.2.1 hdel
刪除制定表中的某一個鍵值對
5.2.1 hgetall
列出表中的所有鍵值對
5.3 list 型別及操作
list 是一個連結串列結構
,主要功能是 push、pop
、獲取一個範圍內的所有值等等,操作中 key 理解為連結串列的名字。Redis 的 list 型別其實就是一個每個子元素都是 string 型別的雙向連結串列。我們可以通過push、pop 操作從連結串列的頭部或尾部新增刪除元素。
5.3.1 lpush
在 key 對應 list 的頭部新增字串元素。
[root@localhost ~]$ redis127.0.0.1:6379>lpush zhangsan zhangsan
[root@localhost ~]$ redis127.0.0.1:6379>lpush zhangsan 18
5.3.2 lrange
從指定連結串列中獲取指定範圍的元素
redis127.0.0.1:6379>lrange zhangsan 0 -1
0 -1:此範圍代表全部元素,意為從頭到尾
5.3.3 lpush、rpush、lpop、rpop、lrange
詳見圖示
5.4 Set 型別及操作
set 是集合,他是 string 型別的無序集合
。Set 是通過 hash table 實現的,對集 、交集、差集。通過這些操作我們可以實現社交網站中的好友推薦和 blog 的 tag 功能。集合不允許有重複值。
5.4.1 sadd
新增一個或多個元素到集合中
[root@localhost ~]$ redis127.0.0.1:6379>sadd mset 1 2 3 4
5.4.2 smembers
獲取集合裡面所有的元素
redis127.0.0.1:6379> smembers mset
5.4.3 srem
從集合中刪除指定的一個或多個元素
5.4.4 spop
隨機從集合中刪除一個元素,並返回
5.4.5 scard
獲取集合裡面的元素個數
5.4.6 sdiff
返回集合 1 與集合 2 的差集。以集合 1 為主
redis127.0.0.1:6379>sdiff mset1 mset2
5.4.7 sinter
獲得兩個集合的交集
5.4.8 sunion
獲得指定集合的並集
5.5 zset 型別及操作
zset 是 set 的一個升級版本,它在 set 的基礎上增加了一個順序屬性
,這一屬性在新增修改元素的時候可以指定,每次指定後,zset 會自動重新按新的值調整順序。可以理解為有兩列的 mysql 表,一列存的 value,一列存的順序。操作中 key 理解為 zset 的名字。
5.5.1 zadd
向一個指定的有序集合中新增元素,每一個元素會對應的有一個分數
。你可以指定多個分數/成員組合。如果一個指定的成員已經在對應的有序集合中了,那麼其分數就會被更新成最新的,並且該成員會重新調整到正確的位置,以確保集合有序。分數的值必須是一個表示數字的字串。
[root@localhost ~]$ redis127.0.0.1:6379>zadd zset 2 zhangsan 1 lisi 1 wangwu
5.5.2 zrange
返回有序集合中,指定區間內的成員
。其中成員按照 score(分數)值從小到大排序。具有相同 score 值的成員按照字典順序來排列。
redis127.0.0.1:6379>zrange zset 0 -1 withscores
注: withscores 返回集合中元素的同時,返回其分數(score)
5.5.3 zrem
刪除有序集合中指定的值
redis127.0.0.1:6379>zrem zset zhangsan
5.5.4 zcard
返回有序集合元素的個數
5.6 其他相關命令
命令 | 含義 |
---|---|
keys * | 按照鍵名查詢指定的鍵。支援萬用字元(* ?等)redis127.0.0.1:6379>keys h*llo |
exists key | 確認一個鍵是否存在(1 表示存在) |
del key | 刪除一個鍵(通用) |
expire key | 設定一個鍵(已存在)的過期時間,如果鍵已經過期,將會被自動刪除 |
ttl key | 以秒為單位,返回指定鍵的剩餘有效時間當 key 不存在時,返回 -2 。 當 key 存在但沒有設定剩餘生存時間時,返回 -1 。否則,以秒為單位,返回 key 的剩餘生存時間。 |
select | 選擇一個數據庫,預設連線的資料庫是 0,可以支援共 16 個數據庫。在配置檔案中,通過databases 16 關鍵字定義。 |
move | 將當前資料庫的鍵移動到指定的資料庫中 |
type | 返回鍵的型別 |
dbsize | 返回當前庫中鍵的數量(所有型別) |
save | 儲存所有的資料。很少在生產環境直接使用 SAVE 命令,因為它會阻塞所有的客戶端的請求,可以使用 BGSAVE 命令代替. 如果在 BGSAVE 命令的儲存資料的子程序發生錯誤的時,用 SAVE命令儲存最新的資料是最後的手段。 |
info | 獲取伺服器的詳細資訊 |
config get | 獲取 redis 伺服器配置檔案中的引數。支援萬用字元 |
flushdb | 刪除當前資料庫中所有的資料 |
flushall | 刪除所有資料庫中的所有資料 |
六、Redis 高階應用
6.1 密碼防護
給 redis 伺服器設定密碼
6.1.1 修改配置檔案
[root@localhost ~]$ vim /usr/local/redis/etc/redis.conf
requirepass 123456
6.1.2 重啟 redis
[root@localhost ~]$ pkill redis
[root@localhost ~]$ …/bin/redis-server …/etc/redis.conf
6.1.3 客戶端登入
[root@localhost ~]$ …/bin/redis-cli -a 123456
或
互動模式下使用【auth 密碼】命令
6.2 主從同步
Redis 主從複製過程:
- 與 master 建立連線,傳送 sync 同步命令
- Master 會啟動一個後臺程序,將資料庫快照儲存到檔案中,同時 master 主程序會開始收集新的寫命令並快取。
- 後臺完成儲存後,就將此檔案傳送給 slave
- Slave 將此檔案儲存到硬碟上
6.2.1 主伺服器設定密碼
主伺服器給自己設定好密碼即可(iptables&SELinux 關閉)
[root@localhost ~]$
6.2.2 從伺服器修改配置檔案,用來連線主伺服器
[root@localhost ~]$
6.2.3 重啟從伺服器,然後測試
可通過 info 命令獲取當前伺服器身份型別
[root@localhost ~]$
6.3 資料持久化
Redis 是一個支援持久化的記憶體資料庫,也就是說需要經常將記憶體中的資料同步到硬碟來保證持久化。
6.3.1 snapshotting(快照)–預設方式RDB
Redis會單獨建立(fork)一個子程序來進行持久化,會先將資料寫入到一個臨時檔案中,待持久化過程都結束了,再用這個臨時檔案替換上次持久化好的檔案。整個過程中,主程序是不進行任何IO操作的,這就確保了極高的效能如果需要進行大規模資料的恢復,且對於資料恢復的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺點是最後一次持久化後的資料可能丟失。
RDB 持久化方式能夠在指定的時間間隔能對你的資料進行快照儲存。是預設的持久化方式。這種方式是將記憶體中資料以快照的方式寫入到二進位制檔案中,預設的檔名為 dump.rdb。這種持久化方式被稱為快照 snapshotting(快照)。
- 過了 900 秒並且有 1 個 key 發生了改變 就會觸發 save 動作
- 過了 300 秒並且有 10 個 key 發生了改變 就會觸發 save 動作
- 過了 60 秒並且至少有 10000 個 key 發生了改變 也會觸發 save 動作
結論:在 redis.conf 檔案中 dir ./定義了資料庫檔案的存放位置,預設是當前目錄。所以每次重啟 redis服務所在的位置不同,將會生成新的 dump.rdb 檔案;建議伺服器搭建完成時先修改快照檔案儲存位置。
6.3.2 append-only file(縮寫 aof)
使用 AOF 會讓你的 Redis 更加耐久: 你可以使用不同的持久化策略:每次寫的時候備份、每秒備份、無備份。使用預設的每秒備份策略,Redis 的效能依然很好(備份是由後臺執行緒進行處理的,主執行緒會盡力處理客戶端請求),一旦出現故障,你最多丟失 1 秒的資料。
以日誌的形式來記錄每個寫操作,將Redis執行過的所有寫指令記錄下來(讀操作不記錄)
,只許追加檔案但不可以改寫檔案,redis啟動之初會讀取該檔案重新構建資料,換言之,redis重啟的話就根據日誌檔案的內容將寫指令從前到後執行一次以完成資料的恢復工作、Aof儲存的是appendonly.aof
檔案
開啟 redis.conf 配置檔案開啟 AOF 持久化
appendonly no
預設不使用 AOF 持久化(450 行)將 no 改成 yes。
# appendfsync always
有寫操作,就馬上寫入磁碟。效率最慢,但是最安全
appendfsync everysec
預設,每秒鐘寫入磁碟一次。
# appendfsync no
不進行 AOF 備份,將資料交給作業系統處理。最快,最不安全
測試
重啟 redis 服務,登入 client 新增一個鍵值,退出然後 ls 命令檢視下是否生成 appendonly.aof。
可以用 cat 檢視。