NoSQL:NoSQL = Not Only SQL 非關係型數據庫
NoSQL,泛指非關係型的數據庫。隨着網際網路web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,
特別是超大規模和高併發的SNS型別的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,
而非關係型的數據庫則由於其本身的特點得到了非常迅速的發展。
NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。
(1)優點:
高可延伸性、分佈式計算、低成本、架構的靈活性、半結構化數據、沒有複雜的關係
(2)缺點:
沒有標準化、有限的查詢功能
型別 | 代表 | 特點 |
---|---|---|
列儲存 | Hbase、Cassandra、Hypertable | 顧名思義,是按列儲存數據的。最大的特點是方便儲存結構化和半結構化數據,方便做數據壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。 |
文件儲存 | MongoDB、CouchDB | 文件儲存一般用類似json的格式儲存,儲存的內容是文件型的。這樣也就有有機會對某些欄位建立索引,實現關係數據庫的某些功能。 |
key-value儲存 | Berkeley DB、MemcacheDB、Redis | 可以通過key快速查詢到其value。一般來說,value可以是任何格式。 |
圖儲存 | Neo4J、FlockDB | 圖形關係的最佳儲存。使用傳統關係數據庫來解決的話效能低下,而且設計使用不方便。 |
物件儲存 | db4o、Versant | 通過類似物件導向語言的語法操作數據庫,通過物件的方式存取數據。 |
xml數據庫 | Berkeley DB XML、BaseX | 高效的儲存XML數據,並支援XML的內部查詢語法,比如XQuery,Xpath。 |
Redis 是完全開源免費的,遵守BSD協定,是一個高效能的key-value數據庫。
Redis 與其他 key - value 快取產品有以下三個特點:
(1) Redis支援數據的持久化,可以將記憶體中的數據儲存在磁碟中,重新啓動的時候可以再次載入進行使用。
(2)Redis不僅僅支援簡單的key-value string型別的數據,同時還提供list,set,zset,hash等數據結構的儲存。
(3)Redis支援數據的備份,即master-slave模式的數據備份。
(1) 效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
(2)豐富的數據型別 – Redis支援二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據型別操作。
(3)原子 – Redis的所有操作都是原子性的,同時Redis還支援對幾個操作全並後的原子性執行。
(4)豐富的特性 – Redis還支援通知, key過期等等特性。
(1)Redis有着更爲複雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他數據庫的進化路徑。Redis的數據型別都是基於基本數據結構的同時對程式設計師透明,無需進行額外的抽象。
(2)Redis執行在記憶體中但是可以持久化到磁碟,所以在對不同數據集進行高速讀寫時需要權衡記憶體,因爲數據量不能大於硬體記憶體。在記憶體數據庫方面的另一個優點是,相比在磁碟上相同的複雜的數據結構,在記憶體中操作起來非常簡單,這樣Redis可以做很多內部複雜性很強的事情。同時,在磁碟格式方面他們是緊湊的以追加的方式產生的,因爲他們並不需要進行隨機存取。
因爲Redis 分別提供了 RDB 和 AOF 兩種持久化模式:
(1)RDB [RDB 將數據庫的快照(snapshot)以二進制的方式儲存到磁碟中。]
在執行情況下, Redis 以數據結構的形式將數據維持在記憶體中, 爲了讓這些數據在 Redis 重新啓動之後仍然可用,
Redis 分別提供了 RDB 和 AOF 兩種持久化模式。
在 Redis 執行時, RDB 程式將當前記憶體中的數據庫快照儲存到磁碟檔案中,在 Redis 重新啓動動時, RDB 程式可以通過載入 RDB 檔案來還原數據庫的狀態。
RDB 功能最核心的是 rdbSave 和 rdbLoad 兩個函數,前者用於生成 RDB 檔案到磁碟, 而後者則用於將 RDB 檔案中的數據重新載入到記憶體中。
RDB 本質上是個檔案,每隔一段時間,在redis組態檔中進行設定,將記憶體中的數據存入檔案中,如果數據過大,也容易造成數據丟失。
(2)AOF [ 則以協定文字的方式,將所有對數據庫進行過寫入的命令(及其參數)記錄到 AOF 檔案,以此達到記錄數據庫狀態的目的。]
AOF 將命令追加到檔案中,將原有的內容替換掉,記錄到 AOF 檔案,以此達到記錄數據庫狀態的目的,爲了方便起見,我們稱呼這種記錄過程爲同步。
本次以安裝redis的5.0.8版本爲例,並且是在雲伺服器中進行安裝。若下載6.0版本以上沒安裝成功,可能需要注意gcc等版本相容問題
(1)在官網下載穩定版本
redis的官網下載:https://redis.io/download
(2)先建立一個redis目錄,將redis-5.0.8.tar.gz拖到finalshell中
當然,還有一個簡單的下載方式,直接輸入:wget http://download.redis.io/releases/redis-5.0.8.tar.gz
(3)執行解壓:tar zvxf redis-5.0.8.tar.gz
(4)進入解壓後的檔案目錄中,執行make進行編譯:
(5)make完畢之後,make install進行編譯安裝:
(6)進到src目錄下,執行redis-server:
看到上面的圖形,就說明已經啓動了redis。
(1)新建 mkdir /etc/redis:
(2)將組態檔複製到/etc/redis:cp redis.conf /etc/redis/redis.conf
(3)通過vim編輯器進行編輯並儲存: vim /etc/redis/redis.conf
將daemonsize的no 改爲 yes、註釋bind 127.0.0.1
(4)使用組態檔啓動:redis-server /etc/redis/redis.conf
(5)關閉redis進程:
首先使用ps -aux | grep redis檢視redis進程,再使用kill殺死進程(-9:強制性):
(6)設定系統命名啓動:
找到utils資料夾中install_server.sh檔案:
進入utils資料夾,執行:./install_server.sh,然後一直回車就好
就會產生:/etc/init.d/redis_6379檔案,這是啓動指令碼檔案,先切換到/etc/init.d目錄下,然後我們可以將其重新命名: mv redis_6379 redisd
設定開機啓動: chkconfig --add redisd
重新載入新的指令碼再啓動:
重新載入:systemctl daemon-reload
啓動:systemctl start redisd
關閉redis:systemctl stop redisd
進入redis:redis-cli
Redis支援五種數據型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。
Redis常用命令請參考:http://redis.cn/commands.html
是最簡單的型別,你可以理解爲一個key 對應一個value。string 型別是二進制安全的。意思是redis 的string 可以包含任何數據,比如jpg 圖片或者序列化的物件。string型別是Redis最基本的數據型別,一個鍵最大能儲存512MB。
(1)設定鍵
設定單鍵值對:set key value
設定多個鍵值對:mset key value [key value …]
設定鍵值及過期時間(秒單位):setex key seconds value
(2)獲取鍵
獲取單個鍵:get key
獲取多個鍵:mget key1 key2 key3
(3)檢視過期時間
檢視過期時間:ttl key
(4)運算
原來的值必須是數值字串
incr key:將對應的key值加1
decr key:將對應的key值減1
incrby key num:將對應的key的值加上指定值
decrby key num:將對應的key的值減去指定值
(5)其它操作
追加值:append key value
redis中值都是字串,追加就是字元拼接
獲取值得長度:strlen key
Redis hash 是一個鍵值(key=>value)對集合。Redis hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。每個 hash 可以儲存 2的32次方 -1 鍵值對(40多億)。
儲存形式:key = {name:‘zs’,age: 18}
(1)設定值
設定key所指物件的指定屬性的值:hset key field value
設定key所指物件的多個屬性值:hmset key field value [field vaue]
當field欄位不存在時,設定key所指物件的field屬性值:hsetnx key field value
(2)獲取值
獲取key指定的物件的屬性值:hget key field
獲取key指定物件的多個屬性值: hmget key field [field]
獲取key所指物件的所有屬性的名稱和值: hgetall key
獲取key所指物件的所有屬性名:hkeys key
獲取key所指物件是的所有屬性值:hvals key
獲取key所指物件的屬性個數:hlen key
(3)其它操作
爲key所指物件的指定欄位的整數值加上increment:hincrby key field increment
爲key所指物件的指定欄位的實數值加上increment:hincrbyfloat key field increment
判斷當前的欄位是否存在在(在返回1 否則返回0):hexists key field
刪除欄位和值:hdel key field [field]
redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)。列表最多可儲存 2的32次方 - 1 元素 (4294967295, 每個列表可儲存40多億)。
常應用於:1、對數據量大的集合數據刪減 2、任務佇列
(1)新增數據
頭部插入數據:lpush key value [value]
如果列表存在則在列表頭部插入數據:lpushx key value
在列表尾部新增數據:rpush key value [value]
如果列表存在,則在尾部新增數據:rpushx key value
在指定值前或後插入數據:linsert key before|after value value
設定指定索引元素的值:lset key index value
注意:索引的值從左邊開始,向右增加,左邊第一個是0,從右邊向左索引編號爲:-1 -2…
(2)獲取數據
左側出隊並返回出隊元素:
右側出隊並返回出隊元素:
返回指定索引的值:
返回儲存列表中的指定範圍的元素:[start,end]
從列表裏移除前 count 次出現的值爲 value 的元素:
count > 0: 從頭往尾移除值爲 value 的元素。
count < 0: 從尾往頭移除值爲 value 的元素。
count = 0: 移除所有值爲 value 的元素。
(3)其它操作
獲取列表長度:llen key
裁剪列表:ltrim key start stop
保留start到stop之間的元素,其它都刪除
Redis的Set是string型別的無序集合,元素具有唯一性 不重複。集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是O(1)。
常應用於:對兩個集合間的數據進行交集、並集、差集運算
(1)新增元素
新增多個元素:sadd key member [member]
(2)獲取元素
獲取集閤中所有的元素:smembers key
返回集合元素的個數:scard key
返回集閤中隨機元素的值,可以返回count個:srandmember key [count]
(3)其它操作
移除集閤中隨機的count個元素,並返回:spop key [count]
移除集閤中一個或者多個成員:srem key member1 [member2]
判斷元素是否在集閤中,存在返回1,不在返回0:sismember key member
(4)集合操作
多個集合的交集:sinter key [key…]
多個集合的差集 (注意比較順序):sdiff key [key…]
多個集合的並集:sunion key [key…]
Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來爲集閤中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重複。
常應用於:排行榜
(1)新增元素
新增多個元素:zadd key score member [score member]
其中該key中的元素都是通過score排序的
對指定的成員增加權重increment:zincrby key increment member
(2)獲取元素
返回指定範圍的元素:zrange key start end
返回元素的個數:zcard key
返回有序集閤中權重在min和max之間的元素的個數:zcount key min max
返回有序集閤中 member(元素)的權重(score):zscore key member
返回當前key中所有的權重(score)和元素(member):zrange key start end withscores
redis預設帶有16個數據庫,編號從0-15。進入redis後預設數據庫是0,可以使用select num進行切換。
檢視所有的key:keys *
查以a開始的key:keys a*
查詢以a爲開頭長度爲3個的key:keys a??
判斷鍵是否存在:exists key
檢視key對應的value的型別:type key
刪除指定key:del key
設定過期時間,秒:expire key 10
移除key的過期時間:persist key
清空當前庫所有key:flushdb
清空所有庫裡的key:flushall
退出redis用戶端:exit
檢視伺服器資訊:info
當前庫中有多少key:dbsize