概念
概念: redis是一 款高性能的NOSQL系列的非關(guān)系型數(shù)據(jù)庫(kù)
什么是NOSQL
NOSQL(NOSQL = Not only SQL), 意即“不僅僅是SQL",是一項(xiàng)全新的數(shù)據(jù)庫(kù)理念,泛指非關(guān)系型的數(shù)據(jù)庫(kù)。
隨著互聯(lián)網(wǎng)web2. 0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)在應(yīng)付web2. 0網(wǎng)站,特別是超大規(guī)模和高并發(fā)的SNS類型的web2. 0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心,暴露了很多難以克服的問(wèn)題,而非關(guān)系型的數(shù)據(jù)庫(kù)則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展。NOSQL 數(shù)據(jù)庫(kù)的產(chǎn)生就是為了解決大規(guī)模數(shù)據(jù)集合多重?cái)?shù)據(jù)種類帶來(lái)的挑戰(zhàn),尤其是大故據(jù)應(yīng)用難題。
NOSQL 和關(guān)系型數(shù)據(jù)庫(kù)比較
優(yōu)點(diǎn):
- 成本: nosql數(shù)據(jù)庫(kù)簡(jiǎn)單易部署,基本都是開源軟件,不需要像使用oracle那樣花費(fèi)大量成本購(gòu)買使用,相比關(guān)系型數(shù)據(jù)庫(kù)價(jià)格便宜。
- 查詢速度: nosql數(shù)據(jù)庫(kù)將數(shù)據(jù)存儲(chǔ)于緩存之中,關(guān)系型數(shù)據(jù)庫(kù)將數(shù)據(jù)存儲(chǔ)在硬盤中,自然查詢速度遠(yuǎn)不及nosql數(shù)據(jù)庫(kù)。
- 存儲(chǔ)數(shù)據(jù)的格式: nosql的存儲(chǔ)格式是key,value形式,文檔形式、圖片形式等等,所以可以存儲(chǔ)基礎(chǔ)類型以及對(duì)象或者是集合等各種格式,而數(shù)據(jù)庫(kù)則只支持基礎(chǔ)類型。
- 擴(kuò)展性:關(guān)系型數(shù)據(jù)庫(kù)有類似join這樣的多表查詢機(jī)制的限制導(dǎo)致擴(kuò)展很艱難。
缺點(diǎn):
- 維護(hù)的工具和資料有限,因?yàn)閚osql是屬于新的技術(shù),不能和關(guān)系型數(shù)據(jù)庫(kù)10幾年的技術(shù)同日而語(yǔ)。
- 不提供對(duì)sql的支持,如果不支持sql這樣的工業(yè)標(biāo)準(zhǔn),將產(chǎn)生一定用戶的學(xué) 習(xí)和使用成本。
- 不提供關(guān)系型數(shù)據(jù)庫(kù)對(duì)事務(wù)的處理。
非關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)勢(shì):
- 性能NOSQL是基于鍵值對(duì)的,可以想象成表中的主鍵和值的對(duì)應(yīng)關(guān)系,而且不需要經(jīng)過(guò)SQL層的解析,所以性能非常高。
- 可擴(kuò)展性同樣也是因?yàn)榛阪I值對(duì),數(shù)據(jù)之間沒有耦合性,所以非常容易水平擴(kuò)展。
關(guān)系型數(shù)據(jù)庫(kù)的優(yōu)勢(shì) :
- 復(fù)雜查詢可以用SQL語(yǔ)句方便的在一個(gè)表以及多個(gè)表之間做非常復(fù)雜的數(shù)據(jù)查詢。
- 事務(wù)支持使得對(duì)于安全性能很高的數(shù)據(jù)訪問(wèn)要求得以實(shí)現(xiàn)。對(duì)于這兩類數(shù)據(jù)庫(kù),對(duì)方的優(yōu)勢(shì)就是自己的弱勢(shì),反之亦然。
總結(jié)
關(guān)系型數(shù)據(jù)庫(kù)與NOSQL數(shù)據(jù)庫(kù)并非對(duì)立而是互補(bǔ)的關(guān)系,即通常情況下使用關(guān)系型數(shù)據(jù)庫(kù),在適合使用NOSQL的時(shí)候使用NOSQL數(shù)據(jù)庫(kù),讓NOSQL數(shù)據(jù)庫(kù)對(duì)關(guān)系型數(shù)據(jù)庫(kù)的不足進(jìn)行彌補(bǔ)。
一般會(huì)將數(shù)據(jù)存 儲(chǔ)在關(guān)系型數(shù)據(jù)庫(kù)中,在nosql 數(shù)據(jù)庫(kù)中備份存儲(chǔ)關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)
主流的NOSQL產(chǎn)品
- 鍵值(Key-Value )存儲(chǔ)數(shù)據(jù)庫(kù)
- 相關(guān)產(chǎn)品: Tokyo Cabinet/Tyrant. Redis. Voldemort. Berkeley DB
- 典型應(yīng)用:內(nèi)容緩存,主要用于處理大量數(shù)據(jù)的高訪問(wèn)負(fù)載。
- 數(shù)據(jù)模型:一系列鍵值對(duì)
- 優(yōu)勢(shì):快速查詢
- 劣勢(shì):存儲(chǔ)的數(shù)據(jù)缺少結(jié)構(gòu)化
-
列存儲(chǔ)數(shù)據(jù)庫(kù)
- 相關(guān)產(chǎn)品: Cassandra, HBase, Riak
- 典型應(yīng)用:分布式的文件系統(tǒng)
- 數(shù)據(jù)模型:以列簇式存儲(chǔ),將同一列數(shù)據(jù)存在一起
- 優(yōu)勢(shì):查找速度快,可擴(kuò)展性強(qiáng),更容易進(jìn)行分布式擴(kuò)展
- 劣勢(shì):功能相對(duì)局限
-
文檔型數(shù)據(jù)庫(kù)
- 相關(guān)產(chǎn)品: CouchDB. MongoDB
- 典型應(yīng)用: Web應(yīng)用(與Key-Value類似,Value是結(jié)構(gòu)化的)
- 數(shù)據(jù)模型: 一系列鍵值對(duì)
- 優(yōu)勢(shì):數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格
- 劣勢(shì):查詢性能不高,而且缺乏統(tǒng)一的查詢語(yǔ)法
-
圖形(Graph)數(shù)據(jù)庫(kù)
- 相關(guān)數(shù)據(jù)庫(kù): Ne04J、InfoGrid. Infinite Graph
- 典型應(yīng)用:社交網(wǎng)絡(luò)
- 數(shù)據(jù)模型:圖結(jié)構(gòu)
- 優(yōu)勢(shì):利用圖結(jié)構(gòu)相關(guān)算法。
- 劣勢(shì):需要對(duì)整個(gè)圖做計(jì)算才能得出結(jié)果,不容易做分布式的集群方案。
什么是Redis
Redis是用C語(yǔ)言開發(fā)的一個(gè)開源的高性能鍵值對(duì)(key-value) 數(shù)據(jù)庫(kù),官方提供測(cè)試數(shù)據(jù), 50個(gè)并發(fā)執(zhí)行100000個(gè)請(qǐng)求,讀的速度是110000次/s,寫的速度是81000次/s,且Redis通過(guò)提供多種鍵值故據(jù)類型來(lái)適應(yīng)不同場(chǎng)景下的存儲(chǔ)需求,目前為止Redis支持的鍵值數(shù)據(jù)類型如下:
- 字符串類型string
- 哈希類型hash
- 列表類型list
- 集合類型set
- 有序集合類型sortedset
redis的應(yīng)用場(chǎng)景
- 緩存(數(shù)據(jù)查詢、短連接、新聞內(nèi)容、商品內(nèi)容等等)
- 聊天室的在線好友列表
- 任務(wù)隊(duì)列。(秒殺, 搶購(gòu)、12306等等)
- 應(yīng)用排行榜
- 網(wǎng)站訪問(wèn)統(tǒng)計(jì)
- 數(shù)據(jù)過(guò)期處理(可以精確到毫秒)
- 分布式集群架構(gòu)中的session分副
redis命令操作
redis數(shù)據(jù)結(jié)構(gòu):
redis存儲(chǔ)的是:key,value格式的數(shù)據(jù),其中key都是字符串,value有五種不同的數(shù)據(jù)結(jié)構(gòu)
- 字符串類型 sting
- 哈希類型 hash:map格式
- 列表結(jié)構(gòu) list:linkedlist格式,支持重復(fù)元素
- 集合類型 set:不允許重復(fù)元素
- 有序集合類型 sortedsed:不允許重復(fù)元素,且元素有序
字符串類型
- 存儲(chǔ):set key value
- 獲?。篻et key
- 刪除:del key
哈希類型 hash
存儲(chǔ):hset key field value
-
獲?。?/p>
- hget key field: 獲取指定的field對(duì)應(yīng)的值
- hgetall key :獲取所有的field和value
刪除:hdel key field
列表類型list
可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)
-
添加:
- lpush key value: 將元素加入列表左表
- rpush key value: 將元素加入列表右表
獲取
- lrange key start end: 范圍獲取
- 刪除:
- lpop key :刪除列表最左邊元素,并將元素返回
- rpop key :刪除列表最右邊元素,并將元素返回
集合類型set:
不允許重復(fù)元素
- 存儲(chǔ):sadd key value
- 獲?。簊members key :獲取set集合所有元素
- 刪除:srem key value: 刪除set集合中的某個(gè)元素
有序集合類型 sortedset
不允許重復(fù)元素,且元素有序
- 存儲(chǔ):zadd key score value
- 獲?。簔range key start end
- 刪除:zrem key value