NoSQL數(shù)據(jù)庫(kù)之Redis數(shù)據(jù)庫(kù)管理
NoSQL的介紹
NoSQL(NoSQL=Not Only SQL)医男,意為反SQL運(yùn)動(dòng)疾牲,是一項(xiàng)全新的數(shù)據(jù)庫(kù)革命性運(yùn)動(dòng)变丧,它是指非關(guān)系型數(shù)據(jù)庫(kù)沙庐。隨著互聯(lián)網(wǎng)web2.0網(wǎng)站的興起,傳統(tǒng)的關(guān)系數(shù)據(jù)庫(kù)在應(yīng)付web2.0純動(dòng)態(tài)網(wǎng)站已經(jīng)顯得力不從心昌抠,特別是超大規(guī)模和高并發(fā)的ANS類(lèi)型的純動(dòng)態(tài)網(wǎng)站患朱,暴漏了很多難以克服的困難鲁僚,而非關(guān)系類(lèi)型的數(shù)據(jù)庫(kù)則由于其本身的特點(diǎn)得到了非常迅速的發(fā)展炊苫。
NoSQL是以Key-value形式存儲(chǔ),和傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)不一樣冰沙,不一定遵循傳統(tǒng)數(shù)據(jù)庫(kù)的一些基本要求侨艾,比如說(shuō)遵循SQL標(biāo)準(zhǔn),ACID屬性拓挥,表結(jié)構(gòu)等等唠梨,這類(lèi)數(shù)據(jù)庫(kù)主要有以下特點(diǎn):非關(guān)系型的、分布式侥啤、開(kāi)源的当叭、水平可擴(kuò)展的。
Mysql里的select盖灸、inser蚁鳖、,update赁炎、delete語(yǔ)句在NoSQL中不適用醉箕。
ACID屬性:事務(wù)處理。(整個(gè)的過(guò)程為事務(wù)徙垫,第一步完成第二部沒(méi)完成讥裤,就回滾初始狀態(tài))
表結(jié)構(gòu):NoSQl不需要建立表結(jié)構(gòu)
NoSQl的特點(diǎn):
- 處理超大量的數(shù)據(jù)
- 運(yùn)行在便宜的PC服務(wù)器集群上
3.擊碎了性能瓶頸
NoSQL適用的場(chǎng)景:
- 對(duì)數(shù)據(jù)庫(kù)高并發(fā)讀寫(xiě)
- 對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問(wèn)
- 對(duì)數(shù)據(jù)的高可擴(kuò)展性和高可用性
NoSQL做分布式
Redis的介紹
Redis是一個(gè)開(kāi)源的,先進(jìn)的Key-value存儲(chǔ)姻报。它通常被稱(chēng)為數(shù)據(jù)結(jié)構(gòu)服務(wù)器己英,因?yàn)殒I可以包含字符串,哈希吴旋,鏈表损肛,集合寒亥,和有序集合。
鏈表:做棧和隊(duì)列荧关,
隊(duì)列先進(jìn)先出溉奕,
棧是先進(jìn)后出,
Redis是一個(gè)Key-Value存儲(chǔ)系統(tǒng)忍啤。它支持存儲(chǔ)的value類(lèi)型很多加勤,包括string(字符串)、list(鏈表)同波、set(集合)鳄梅、zset(有序集合)。這些數(shù)據(jù)類(lèi)型都支持push/pop未檩、add/remove
及取交集和并集及更豐富的操作戴尸,redis支持各種不同方式的排序。為了保證效率冤狡,數(shù)據(jù)都是緩存在內(nèi)存中孙蒙,它也可以周期性的把更新的數(shù)據(jù)寫(xiě)入磁盤(pán)或者把修改操作寫(xiě)入追加的記錄文件。
對(duì)數(shù)組加入一個(gè)元素array_push悲雳,array_pop彈出一個(gè)元素挎峦。
提供的API語(yǔ)言:C、C++合瓢、PHP
Redis適用場(chǎng)景
目前全球最大的Redis的用戶是新浪微博坦胶,在新浪微博有200多臺(tái)物理機(jī),400多個(gè)端口正在運(yùn)行著Redis上來(lái)為微博用戶提供服務(wù)晴楔。
在新浪微博Redis的部署場(chǎng)景很多顿苇,大概分為如下兩種:
應(yīng)用程序直接訪問(wèn)Redis數(shù)據(jù)庫(kù)
應(yīng)用程序直接訪問(wèn)Redis,只有當(dāng)Redis訪問(wèn)失敗時(shí)才能訪問(wèn)Mysql
例如:把大象裝冰箱的過(guò)程:
- 打開(kāi)冰箱門(mén)
- 把大象裝進(jìn)冰箱
- 把冰箱門(mén)關(guān)上
大象很大税弃,裝進(jìn)冰箱很費(fèi)勁纪岁,怎么辦?
而Redis數(shù)據(jù)庫(kù)提供多種靈活數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)操作钙皮,為不同的大象構(gòu)建不同的冰箱蜂科。
Redis適用的場(chǎng)景:
- 取最新N個(gè)數(shù)據(jù)的操作
- 排行榜應(yīng)用,取TOP****N****操作
- 需要精確設(shè)定過(guò)期時(shí)間的應(yīng)用(key設(shè)置過(guò)期時(shí)間)
- 計(jì)數(shù)器應(yīng)用
- Uniq操作短条,獲取某段時(shí)間所有數(shù)據(jù)排重值
- 實(shí)時(shí)系統(tǒng)导匣,反垃圾系統(tǒng)
- Pub/Sub構(gòu)建實(shí)時(shí)消息系統(tǒng)(發(fā)布與訂閱)
- 構(gòu)建隊(duì)列系統(tǒng)(list構(gòu)建棧和隊(duì)列)
-
緩存
String
1.計(jì)數(shù)器應(yīng)用
List- 取最新N個(gè)數(shù)據(jù)的操作
- 消息隊(duì)列
3.刪除與過(guò)濾 - 實(shí)時(shí)分析正在發(fā)生的情況,用于數(shù)據(jù)統(tǒng)計(jì)與防止垃圾郵件(結(jié)合Set)
Set
1.Uniqe操作茸时,獲取某段時(shí)間所有數(shù)據(jù)排重值
2.實(shí)時(shí)系統(tǒng)贡定,反垃圾系統(tǒng)
3.共同好友、二度好友
4.利用唯一性可都,可以統(tǒng)計(jì)訪問(wèn)網(wǎng)站的所有獨(dú)立 IP
5.好友推薦的時(shí)候缓待,根據(jù) tag 求交集蚓耽,大于某個(gè) threshold 就可以推薦
Hashes
1.存儲(chǔ)、讀取旋炒、修改用戶屬性
Sorted Set
1.排行榜應(yīng)用步悠,取TOP N操作
2.需要精準(zhǔn)設(shè)定過(guò)期時(shí)間的應(yīng)用(時(shí)間戳作為Score)
3.帶有權(quán)重的元素,比如一個(gè)游戲的用戶得分排行榜
4.過(guò)期項(xiàng)目處理瘫镇,按照時(shí)間排序
NoSQL不存在表結(jié)構(gòu)的概念
Redis的數(shù)據(jù)類(lèi)型
string鼎兽,hash ,list铣除,set谚咬,zset
Strings類(lèi)型及操作
String是最簡(jiǎn)單的類(lèi)型,一個(gè)Key對(duì)應(yīng)一個(gè)Value尚粘,String類(lèi)型是二進(jìn)制安全的择卦。Redis的string可以包含任何數(shù)據(jù),比如jpg圖片或者序列化的對(duì)象
同一個(gè)鍵只能包含一個(gè)數(shù)據(jù)
serialize序列化函數(shù) string serialize ( mixed $value )
set
設(shè)置key對(duì)應(yīng)的值為string類(lèi)型的value
例如:我們添加一個(gè)name=lijie的鍵值對(duì)redis 127.0.0.1:6379>set name lijie
例如:我們添加一個(gè)name=lijie的鍵值對(duì)redis 127.0.0.1:6379>set name lijie
setnx
設(shè)置key對(duì)應(yīng)的值為string類(lèi)型的value郎嫁,如果key值已經(jīng)存在秉继,返回0,nx是not****exit的意思
例如:我們添加一個(gè)name=liejie_new的鍵值對(duì)
Name鍵已經(jīng)存在返回0行剂,并且不更新秕噪。
setex
設(shè)置key對(duì)應(yīng)的值為string類(lèi)型的value钳降,并指定此鍵值對(duì)應(yīng)的有效期厚宰。
例如:我們添加一個(gè)haricolor=red的鍵值對(duì),并指定有效期為10秒
setrange
設(shè)置指定key的value值的子字符串
例如:我們希望將lijie的126郵箱替換為163郵箱
從第六個(gè)字符開(kāi)始替換后面的所有字符遂填,如果要替換的字符串沒(méi)有原來(lái)的字符串長(zhǎng)铲觉,那么后面接著跟上原來(lái)的字符串(后面的字符串不會(huì)覆蓋)
mset
一次設(shè)置多個(gè)key的值,成功返回ok表示所有的值都設(shè)置吓坚,失敗返回0表示沒(méi)有任何值被設(shè)置撵幽。
msetnx
一次設(shè)置多個(gè)key的值,成功返回ok表示所有的值都被設(shè)置了礁击,失敗返回0表示沒(méi)有任何值被設(shè)置盐杂,但是不會(huì)覆蓋已經(jīng)存在的key。
只要有一個(gè)設(shè)置不成功哆窿,這都不設(shè)置
get
獲取key對(duì)應(yīng)的string值链烈,如果key不存在返回nil。
getset
設(shè)置key的值挚躯,并返回key的舊值强衡。
Getrange
獲取key的value值的子字符串
mget
一次獲取多個(gè)key的值,如果對(duì)應(yīng)key不存在則對(duì)應(yīng)返回nil码荔。
incr
對(duì)key的值做加加的操作漩勤,并返回新的值感挥。
incrby
同incr類(lèi)似,加指定值越败,key不存在時(shí)候會(huì)設(shè)置key触幼,并認(rèn)為原來(lái)的value是0.
正在加負(fù)值為減
decr
對(duì)key的值做減減的操作
decrby
同decr類(lèi)似,減指定值究飞。
傳正數(shù)是自減域蜗,負(fù)數(shù)是自增
append
給指定字符串追加value,返回新字符串值的長(zhǎng)度噪猾。
添加了一個(gè).net的字符串
strlen
取指定的key的value值的長(zhǎng)度霉祸。