NoSQL
摘自百度百科
NoSQL,泛指非關系型的數據庫。隨着互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫的產生就是為了解決大規模數據集合多重數據種類帶來的挑戰,尤其是大數據應用難題。
NoSQL數據庫的四大分類
1. 鍵值(Key-Value)存儲數據庫
這一類數據庫主要會使用到一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。Key/value模型對於IT系統來說的優勢在於簡單、易部署。但是如果DBA只對部分值進行查詢或更新的時候,Key/value就顯得效率低下了。舉例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
2. 列存儲數據庫。
這部分數據庫通常是用來應對分布式存儲的海量數據。鍵仍然存在,但是它們的特點是指向了多個列。這些列是由列家族來安排的。如:Cassandra, HBase, Riak.
3. 文檔型數據庫
文檔型數據庫的靈感是來自於Lotus Notes辦公軟件的,而且它同第一種鍵值存儲相類似。該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數據庫可 以看作是鍵值數據庫的升級版,允許之間嵌套鍵值。而且文檔型數據庫比鍵值數據庫的查詢效率更高。如:CouchDB, MongoDb. 國內也有文檔型數據庫SequoiaDB,已經開源。
4. 圖形(Graph)數據庫
圖形結構的數據庫同其他行列以及剛性結構的SQL數據庫不同,它是使用靈活的圖形模型,並且能夠擴展到多個服務器上。NoSQL數據庫沒有標准的查詢語言(SQL),因此進行數據庫查詢需要制定數據模型。許多NoSQL數據庫都有REST式的數據接口或者查詢API。如:Neo4J, InfoGrid, Infinite Graph.
因此,我們總結NoSQL數據庫在以下的這幾種情況下比較適用: 1、數據模型比較簡單; 2、需要靈活性更強的IT系統; 3、對數據庫性能要求較高; 4、不需要高度的數據一致性; 5、對於給定key,比較容易映射復雜值的環境。
Redis 簡介
Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫,也是NoSQL數據庫。
Redis 與其他 key - value 緩存產品有以下三個特點:
Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份。
Redis 優勢
1. 性能極高 – 官方對redis進行測試,50個並發執行100000個請求,Redis讀的速度是110000次/s,寫的速度是81000次/s 。
2. 豐富的數據類型 redis是基於key/value形式進行存儲 redis可以存儲五種數據類型(注意:redis中的key/value均區分大小寫)
* String 字符串
* Hash 哈希類型 類似Java中的HashMap類型
* List 鏈表
* Set 集合
* Sorted Set 有序集合 (也稱zset)
3. 原子 – Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
4. 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis與其他key-value存儲有什么不同?
1. Redis有着更為復雜的數據結構並且提供對他們的原子性操作,這是一個不同於其他數據庫的進化路徑。Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。
2. Redis運行在內存中但是可以持久化到磁盤,所以在對不同數據集進行高速讀寫時需要權衡內存,因為數據量不能大於硬件內存。在內存數據庫方面的另一個優點是,相比在磁盤上相同的復雜的數據結構,在內存中操作起來非常簡單,這樣Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,因為他們並不需要進行隨機訪問。
redis 使用
redis的windows客戶端端使用
Redis命令十分豐富,包括的命令組有Cluster、Connection、Geo、Hashes、HyperLogLog、Keys、Lists、Pub/Sub、Scripting、Server、Sets、Sorted Sets、Strings、Transactions一共14個redis命令組兩百多個redis命令,如果您有興趣請上redis官網查看全部的redis命令,在這里我們只針對redis的常用命令以及五種數據類型相關的命令進行操作
1.啟動redis-server.exe 服務器端
2.打開redis-cli.exe 客戶端
redis的常用命令(redis中的key和value都區分大小寫)
String類型的指令
1. 存儲: set key value
127.0.0.1:6379> set username laowang
OK
2. 獲取: get key
127.0.0.1:6379> get username
"laowang"
3. 刪除: del key
127.0.0.1:6379> del username
(integer) 1
Hash類型的指令
1. 存儲: hset key field value
127.0.0.1:6379> hset myhash address beijing
(integer) 1
127.0.0.1:6379> hset myhash level one
(integer) 1
2. 獲取:
* hget key field: 獲取指定的field對應的值
127.0.0.1:6379> hget myhash level
"one"
* hgetall key:獲取所有的field和value
127.0.0.1:6379> hgetall myhash
1) "address"
2) "beijing"
3) "level"
4) "one"
3. 刪除: hdel key field
127.0.0.1:6379> hdel myhash level
(integer) 1
List類型的指令
1. 添加:
1. lpush key value: 將元素加入列表左側
2. rpush key value:將元素加入列表右側
127.0.0.1:6379> lpush myList 1
(integer) 1
127.0.0.1:6379> lpush myList 2
(integer) 2
127.0.0.1:6379> rpush myList 2
(integer) 3
127.0.0.1:6379> rpush myList 3
(integer) 4
2. 獲取:lrange key start end :范圍獲取 (0 -1 指獲取所有)
127.0.0.1:6379> lrange myList 0 -1
1) "2"
2) "1"
3) "2"
4) "3"
3. 刪除:
1. lpop key: 刪除列表最左邊的元素,並將元素返回
2. rpop key: 刪除列表最右邊的元素,並將元素返回
127.0.0.1:6379> lpop myList
"2"
127.0.0.1:6379> rpop myList
"3"
Set類型的指令 set類型的value是唯一的
1. 存儲:sadd key value
127.0.0.1:6379> sadd myset one
(integer) 1
127.0.0.1:6379> sadd myset one
(integer) 0
127.0.0.1:6379> sadd myset ONE
(integer) 1
2. 獲取:smembers key:獲取set集合中所有元素
127.0.0.1:6379> smembers myset
1) "one"
2) "ONE"
3. 刪除:srem key value:刪除set集合中的某個元素
127.0.0.1:6379> srem myset ONE
(integer) 1
Sorted Set類型的指令
1. 存儲:zadd key score value
127.0.0.1:6379> zadd mysort 666 laotie
(integer) 1
127.0.0.1:6379> zadd mysort 66 meimaobing
(integer) 1
127.0.0.1:6379> zadd mysort 6 chenduxiu
(integer) 1
2. 獲取:zrange key start end [withscores]
127.0.0.1:6379> zrange mysort 0 -1
1) "chenduxiu"
2) "meimaobing"
3) "laotie"
127.0.0.1:6379> zrange mysort 0 -1 withscores
1) "chenduxiu"
2) "6"
3) "meimaobing"
4) "66"
5) "laotie"
6) "666"
3. 刪除:zrem key value
127.0.0.1:6379> zrem mysort laotie
(integer) 1
其他常用的指令 :
1. dbsize :返回當前數據庫的 key 的數量。
127.0.0.1:6379> dbsize
(integer) 2
2. Keys pattern:查找所有符合給定模式 pattern 的 key 。
在redis中存值
127.0.0.1:6379> set One1 redis
OK
127.0.0.1:6379> set One2 mysql
OK
127.0.0.1:6379> set One3 oracle
OK
127.0.0.1:6379> set One4 mongodb
OK
127.0.0.1:6379> keys One*
1) "One3"
2) "One4"
3) "One1"
4) "One2"
127.0.0.1:6379> keys * (該指令不建議使用)
1) "myhash"
2) "One3"
3) "One4"
4) "One1"
5) "One2"
6) "mysort"
3. del key [key …] :刪除給定的一個或多個key,以及對應的value,不存在的 key 會被忽略,該指令可以將任意數據類型刪除
127.0.0.1:6379> del One1 One2
(integer) 2
4. type key :返回 key 所儲存的值的類型。
127.0.0.1:6379> type mysort
zset
127.0.0.1:6379> type myhash
hash
127.0.0.1:6379> type One3
string
5. exists key :檢查指定key是否存在
127.0.0.1:6379> exists hehe
(integer) 0
127.0.0.1:6379> exists myhash
(integer) 1
6. expire key seconds:為給定 key 設置生存時間,當 key 過期時(生存時間為 0 ),它會被自動刪除。seconds的單位為秒。
127.0.0.1:6379> expire One3 20
(integer) 1
127.0.0.1:6379> get One3
"oracle"
127.0.0.1:6379> get One3
"oracle"
127.0.0.1:6379> get One3
"oracle"
127.0.0.1:6379> get One3
(nil)
7. ttl key 以秒為單位,返回給定 key 的剩余生存時間(TTL, time to live)。
當 key 不存在時,返回 -2 。
當 key 存在但沒有設置剩余生存時間時,返回 -1 。
否則,以秒為單位,返回 key 的剩余生存時間。
127.0.0.1:6379> set myTtl myRedis
OK
127.0.0.1:6379> set myTtl2 myRedis2
OK
127.0.0.1:6379> expire myTtl 30
(integer) 1
127.0.0.1:6379> ttl myTtl
(integer) 20
127.0.0.1:6379> ttl myRedis
(integer) -2
127.0.0.1:6379> ttl myTtl2
(integer) -1
8. flushall:清空整個 Redis 服務器的數據(刪除所有數據庫的所有 key ),此命令從不失敗。
flushdb :清空當前數據庫中的所有 key,此命令從不失敗。
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty list or set)
歡迎各路大神批評指正