目錄
NOSQL概述
- NoSQL(NoSQL = Not Only SQL),意即“不僅僅是SQL”,是一項全新的數據庫理念,泛指非關係型的數據庫。
- 隨着互聯網web2.0網站(動態網站)的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關係型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是爲了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。
NOSQL和關係型數據庫比較
NOSQL的優缺點
-
優點:
- 成本:nosql數據庫簡單易部署,基本都是開源軟件,不需要像使用oracle那樣花費大量成本購買使用,相比關係型數據庫價格便宜。
- 查詢速度:nosql數據庫將數據存儲於緩存之中,關係型數據庫將數據存儲在硬盤中,自然查詢速度遠不及nosql數據庫。
- 存儲數據的格式:nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,所以可以存儲基礎類型以及對象或者是集合等各種格式,而數據庫則只支持基礎類型。
- 擴展性:關係型數據庫有類似join這樣的多表查詢機制的限制導致擴展很艱難。
-
缺點:
- 維護的工具和資料有限,因爲nosql是屬於新的技術,不能和關係型數據庫10幾年的技術同日而語。
- 不提供對sql的支持,如果不支持sql這樣的工業標準,將產生一定用戶的學習和使用成本。
- 不提供關係型數據庫對事務的處理。
非關係型數據庫的優勢
- 性能NOSQL是基於鍵值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以性能非常高。
- 可擴展性同樣也是因爲基於鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。
關係型數據庫的優勢
- 複雜查詢可以用SQL語句方便的在一個表以及多個表之間做非常複雜的數據查詢。
- 事務支持使得對於安全性能很高的數據訪問要求得以實現。對於這兩類數據庫,對方的優勢就是自己的弱勢,反之亦然。
總結
- 關係型數據庫與NoSQL數據庫並非對立而是互補的關係,即通常情況下使用關係型數據庫,在適合使用NoSQL的時候使用NoSQL數據庫,讓NoSQL數據庫對關係型數據庫的不足進行彌補。
- 一般會將數據存儲在關係型數據庫中,在nosql數據庫中備份存儲關係型數據庫的數據
主流的NOSQL產品
- 鍵值(Key-Value)存儲數據庫
- 相關產品: Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
- 典型應用: 內容緩存,主要用於處理大量數據的高訪問負載。
- 數據模型: 一系列鍵值對
- 優勢: 快速查詢
- 劣勢: 存儲的數據缺少結構化
- 列存儲數據庫
- 相關產品:Cassandra, HBase, Riak
- 典型應用:分佈式的文件系統
- 數據模型:以列簇式存儲,將同一列數據存在一起
- 優勢:查找速度快,可擴展性強,更容易進行分佈式擴展
- 劣勢:功能相對侷限
- 文檔型數據庫
- 相關產品:CouchDB、MongoDB
- 典型應用:Web應用(與Key-Value類似,Value是結構化的)
- 數據模型: 一系列鍵值對
- 優勢:數據結構要求不嚴格
- 劣勢: 查詢性能不高,而且缺乏統一的查詢語法
- 圖形(Graph)數據庫
- 相關數據庫:Neo4J、InfoGrid、Infinite Graph
- 典型應用:社交網絡
- 數據模型:圖結構
- 優勢:利用圖結構相關算法。
- 劣勢:需要對整個圖做計算才能得出結果,不容易做分佈式的集羣方案。
Reids概述
跳轉到目錄
Redis是用C語言開發的一個開源的高性能鍵值對(key-value)數據庫,redis就是在內存中的一個大的Map集合,官方提供測試數據,50個併發執行100000個請求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過提供多種鍵值數據類型來適應不同場景下的存儲需求,目前爲止Redis主要支持的鍵值數據類型如下:key爲字符串類型, value爲任意類型;
- 字符串類型 string
Map<String, String> - 散列類型 hash
Map<String, map<String, String>> - 列表類型 list
Map<String, list<String>> - 集合類型 set
Map<String, set<String>> - 有序集合類型 sortedset
Map<String, sortedset<String>>
應用場景:
- 緩存(數據查詢、短連接、新聞內容、商品內容等等)
- 聊天室的在線好友列表
- 任務隊列。(秒殺、搶購、12306等等)
- 應用排行榜
- 網站訪問統計
- 數據過期處理(可以精確到毫秒
- 分佈式集羣架構中的session分離
Redis的下載和安裝
- 官網下載: http://redis.io/download
- github下載: https://github.com/microsoftarchive/redis
window版Redis的目錄結構
目錄或文件 | 作用 |
---|---|
redis-benchmark | 性能測試工具 |
redis-check-aof | AOF文件修復工具 |
redis-check-dump | RDB文件檢查工具(快照持久化文件) |
redis-cli | 命令行客戶端 |
redis-server redis | 服務器啓動命令 |
redis.windows.conf redis | 核心配置文件 |
Windows服務
- 安裝windows服務: redis-server.exe --service-install redis.windows.conf --loglevel verbose
- 卸載windows服務: redis-server --service-uninstall
Redis的五種數據類型
字符串類型String
跳轉到目錄
字符串類型是Redis中最爲基礎的數據存儲類型,它在Redis中是二進制安全的,這便意味着該類型存入和獲取的數據相同。在Redis中字符串類型的Value最多可以容納的數據長度是512M。
常用命令
-
set key value
設定key持有指定的字符串value,如果該key存在則進行覆蓋操作。總是返回”OK”127.0.0.1:6379> set company “sunny”
OK
127.0.0.1:6379> -
get key
獲取key的value。如果與該key關聯的value不是String類型,redis將返回錯誤信息,因爲get命令只能用於獲取String value;如果該key不存在,返回(nil)。127.0.0.1:6379> set name “sunny”
OK
127.0.0.1:6379> get name
“sunny” -
del key
刪除指定key127.0.0.1:6379> del name (integer)
1
127.0.0.1:6379> get name
(nil)incr命令 自增 decr命令 自減 incrby key step 自增步數 decrby key step 自減步數
哈希類型hash
跳轉到目錄
Redis中的Hash類型可以看成具有String Key和String Value的map容器。所以該類型非常適合於存儲值對象的信息。如Username、Password和Age等。如果Hash中包含很少的字段,那麼該類型的數據也將僅佔用很少的磁盤空間。每一個Hash可以存儲4294967295個鍵值對。
常用命令
-
hset key field value
爲指定的key設定field/value對(鍵值對)。
注意:給同一個field設置值,後者會覆蓋前面的 -
hmset key1 field/value key2 field/value
同時給多個key設定field/value -
hget key field
返回指定的key中的field的值 -
hmget key field1 field2 field3
返回指定key的多個field的值 -
hdel key field [field … ]
可以刪除一個或多個字段,返回值是被刪除的字段個數 -
hgetall key
可以獲取該鍵的所有數據
127.0.0.1:6379> hset user1 username xiaoming
(integer) 1
127.0.0.1:6379> hset user1 password 123
(integer) 1
127.0.0.1:6379> hset user1 email [email protected]
(integer) 1
127.0.0.1:6379> hmset user1 address beijing telephone 13422221123
OK
127.0.0.1:6379> hget user1 username
"xiaoming"
127.0.0.1:6379> hmget user1 username password address
1) "xiaoming"
2) "123"
3) "beijing"
127.0.0.1:6379> hgetall user1
1) "username"
2) "xiaoming"
3) "password"
4) "123"
5) "email"
6) "[email protected]"
7) "address"
8) "beijing"
9) "telephone"
10) "13422221123"
127.0.0.1:6379> hset user1 password 456
(integer) 0
127.0.0.1:6379> hgetall user1
1) "username"
2) "xiaoming"
3) "password"
4) "456"
5) "email"
6) "[email protected]"
7) "address"
8) "beijing"
9) "telephone"
10) "13422221123"
列表類型list
跳轉到目錄
在Redis中,List類型是按照插入順序排序的字符串鏈表。和數據結構中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。在插入時,如果該鍵並不存在,Redis將爲該鍵創建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那麼該鍵也將會被從數據庫中刪除。List中可以包含的最大元素數量是4294967295
常用命令
-
lpush key values[value1 value2…]
在指定的key所關聯的list的頭部插入所有的values,如果該key不存在,該命令在插入的之前創建一個與該key
關聯的空鏈表,之後再向該鏈表的頭部插入數據。插入成功,返回元素的個數。 -
lpop key
返回並彈出指定的key關聯的鏈表中的第一個元素,即頭部元素。如果該key不存在,返回nil;若key存在,則返回鏈表的頭部元素。 -
rpop key
從尾部彈出元素 -
lrange key start end :範圍獲取
遍歷該鍵的所有數據
127.0.0.1:6379> lpush mylist1 a b c d e
(integer) 5
127.0.0.1:6379> rpush mylist1 x y z 1 2 3
(integer) 11
127.0.0.1:6379> lrange mylist1 0 10
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
6) "x"
7) "y"
8) "z"
9) "1"
10) "2"
11) "3"
127.0.0.1:6379> rpop mylist1 3
(error) ERR wrong number of arguments for 'rpop' command
127.0.0.1:6379> rpop mylist1
"3"
127.0.0.1:6379> lrange mylist1 0 10
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
6) "x"
7) "y"
8) "z"
9) "1"
10) "2"
列表類型set
跳轉到目錄
在Redis中,我們可以將Set類型看作爲沒有排序的字符集合,和List類型一樣,我們也可以在該類型的數據值上執行添加、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時間複雜度爲O(1),即常量時間內完成次操作。Set可包含的最大元素數量是4294967295,和List類型不同的是,Set集合中不允許出現重複的元素。
常用命令
- sadd key values[value1、value2…]
向set中添加數據,如果該key的值已有則不會重複添加 - smembers key
獲取set中所有的成員 - srem key members[member1、member2…]
刪除set中指定的成員
127.0.0.1:6379> sadd myset1 a b c c
(integer) 3
127.0.0.1:6379> smembers myset1
1) "a"
2) "c"
3) "b"
127.0.0.1:6379> srem myset1 b
(integer) 1
127.0.0.1:6379> smembers myset1
1) "a"
2) "c"
有序結合類型sortset
跳轉到目錄
在redis中,可以保證不重複的元素,仍然可以進行排序。
每個元素都會關聯一個double類型的分數。redis正是通過分數來爲集合中的成員進行從小到大的排序。
常用命令
- zadd key values[value1、value2…]
向set中添加成員 - zrange key start end [withscores]
通過索引區間返回有序集合成指定區間內的成員 - zrem key value
移除set中的成員
127.0.0.1:6379> zadd mysort 60 zhangsan 20 lisi 55 wangwu
(integer) 3
127.0.0.1:6379> zrange mysort 0 -1
1) "lisi"
2) "wangwu"
3) "zhangsan"
127.0.0.1:6379> zrevrange mysort 0 -1
1) "zhangsan"
2) "wangwu"
3) "lisi"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "lisi"
2) "20"
3) "wangwu"
4) "55"
5) "zhangsan"
6) "60"
Redis的通用命令
-
keys pattern(格式)
獲取所有與pattern匹配的key,返回所有與該key匹配的keys。*表示任意一個或多個字符,?表示任意一個字符 -
exists key
判斷該key是否存在,1代表存在,0代表不存在 -
type key
獲取指定key的類型。該命令將以字符串的格式返回。 返回的字符串爲string、list、set、hash,如果key不存在返回none -
expire key time(時間)
設置key的存活時間
127.0.0.1:6379> keys *
1) "categoryList"
2) "user1"
3) "mylist1"
4) "mysort"
5) "list_325"
6) "myset1"
7) "num"
8) "category_325"
9) "test"
127.0.0.1:6379> exists num
(integer) 1
127.0.0.1:6379> exists num1
(integer) 0
127.0.0.1:6379> set code 543211
OK
127.0.0.1:6379> expire code 3
(integer) 1
127.0.0.1:6379> get code
"543211"
127.0.0.1:6379> get code
(nil)
127.0.0.1:6379> type num
string
127.0.0.1:6379> type mysort
zset
127.0.0.1:6379> keys my????
1) "mysort"
2) "myset1"
127.0.0.1:6379>