NoSQL,泛指非關係型數據庫。不是NO-SQL,而是NOT-ONLY-SQL,不要把NoSQL數據庫和關係型數據庫對立起來,兩者有不一樣的應用場景,目前來看NoSQL想徹底取代關係型數據庫不太可能。打算討論三種NoSQL數據庫。javascript
Redis做爲NoSQL數據庫的第一篇吧。Redis是基於內存的,訪問速度快,常被用作緩存層,減輕數據庫的訪問壓力。在內存不可變的狀況下,利用LRU算法和鍵過時的機制提升緩存的命中率。java
官方網站是第一輩子產力。Redis通常雙數版本爲穩定版。目前最新版本爲3.2.8。node
redis.iogit
安裝編譯工具github
yum -y install gcc automake autoconf libtool make複製代碼
下載,解壓,編譯redis
$ wget http://download.redis.io/releases/redis-3.2.8.tar.gz
$ tar xzf redis-3.2.8.tar.gz
$ cd redis-3.2.8
$ make複製代碼
先啓動Redis服務算法
$ src/redis-server複製代碼
再啓動Redis shell客戶端shell
$ src/redis-cli複製代碼
這樣已經能夠在客戶端中操做Redis了。Redis客戶的提示功能真的挺好用,固然若是僅僅是學習Redis的操做命令,可使用在線的交互工具,點開即用。數據庫
Redis支持複雜的數據結構。
將官網的樣例都敲一次,對數據的操做基本就瞭解了。經常使用操做很少,一個多小時就能夠完成。
Redis支持多種語言客戶端
Java類型客戶端地址
Redis提供了2種持久化的方案RDB和AOF。二者簡單的區別來說就是,RDB存的是數據的,載體是一個緊湊的文件。而AOF存的是 Redis的操做命令。
RDB經過快照,能夠完美備份數據。經過備份和轉移數據庫文件,能夠輕鬆實現容災和版本恢復。可是RDB生成快照有必定的時間間隔,當異常發生的時候,可能丟失一部分未備份的數據,這對數據的完整性要求很高的任務不太適用。並且讀寫數據庫要作大量的IO操做,這會必定程度的影響服務器的性能。
AOF的同步Redis命令有三種策略:不一樣步,每秒同步,每次鍵入命令後當即同步。並且當AOF文件過大的時候,AOF文件會觸發重寫的操做,他會優化命令從而減少文件的體積。並且在不當心刪除了整個庫,並且RDB了同步了該操做的時候,能夠利用AOF作數據的恢復。可是存儲一樣的數據時AOF文件一般會比RDB文件更大。
你能夠同時使用2中持久化的策略,也能夠只使用其中的一種策略。當使用RDB時,用戶能夠主動使用SAVE和BGSAVE命令來發起存儲,SAVE是同步的,而BGSAVE是異步的。固然也能夠經過修改配置文件來設置RDB的存儲策略
save 60 1000複製代碼
60秒檢測一次,若是進行了1000以上的變動,則執行存儲。你能夠同時配置多條存儲策略
save 60 1000
save 80 100
save 1000 5複製代碼
當其中一條條件生效,便可觸發存儲的操做。經過下面配置,啓動AOF
appendonly yes複製代碼
Redis也使用Master/Slave模型,這裏的主從更可能是基於讀寫分離,通常Master服務器只是進行寫操做,而Slave服務器則是默認設置成只讀。只須要在配置中添加
slaveof 192.168.1.1 6379複製代碼
地址爲Master節點的IP。固然,也能夠直接經過SLAVEOF命令進行操做。
哨兵是保證Redis高可用的一種機制。在Redis集羣的Master節點發生故障致使集羣不可用時,需求人工介入,從原來的Slave節點中挑選一個做爲新的Master節點,並將以前的Slave節點指向新的Master節點。顯然這種人工干預的過程不能及時的作故障的恢復,並且操做過程比較繁瑣。哨兵機制正是爲了解決這個問題的。
Sentinal具有分佈式的特色,通常每一個節點啓動一個哨兵,並且哨兵之間也相互通訊。運行Sentinel的方式
redis-sentinel /path/to/sentinel.conf複製代碼
或者在啓動服務的時候就啓動
redis-server /path/to/sentinel.conf --sentinel複製代碼
sentinel.conf的最小配置
port 5000
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel parallel-syncs mymaster 1複製代碼
配置含義
Redis集羣解決了單個節點存儲性能瓶頸,使得多個Redis節點之間能夠完成數據的共享。同時,在單個數據節點不可用的時候,能夠由其餘的節點繼續提供服務。Redis集羣不存在中心節點,節點之間互聯構成集羣,可是這種結構也致使節點的網絡IO消耗。Redis集羣中互聯的是Master節點,每一個Master節點能夠有本身的一到多個Slave節點完成主從結構。集羣不須要單獨設置sentinel實例,集羣中的節點能夠充當哨兵的角色。
最小配置
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes複製代碼
其中port是要修改的,其餘值能夠不變。Redis集羣構建至少須要三個Master節點,再來三個Slave節點。構建一個新的目錄,並建立六個以端口號爲名字的子目錄, 稍後咱們在將每一個目錄中運行一個 Redis 實例:
mkdir cluster-test
cd cluster-test
mkdir 7000 7001 7002 7003 7004 7005複製代碼
在文件夾 7000 至 7005 中, 各建立一個 redis.conf 文件, 文件的內容可使用上面的示例配置文件, 但記得將配置中的端口號從 7000 改成與文件夾名字相同的號碼。分別用上面的6個配置,啓動6個Redis的服務
cd 7000
../redis-server ./redis.conf複製代碼
用src下的集羣命令行工具 redis-trib構建集羣,這是一個Ruby程序
./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005複製代碼
啓動完成後能夠用客戶端工具鏈接上集羣試試
$ redis-cli -c -p 7000複製代碼
只梳理了的知識點的主線,其餘細節能夠遇到補全。有用就點喜歡或打賞吧,也能夠關注個人公衆號,後續持續更新"最簡大數據"系列。