關(guān)系型數(shù)據(jù)庫(SQL):Mysql,oracle
特點(diǎn):數(shù)據(jù)和數(shù)據(jù)之間、表和字段之間,表和表之間是存在關(guān)系的。
優(yōu)點(diǎn):數(shù)據(jù)之間有關(guān)系、進(jìn)行數(shù)據(jù)的增刪改查時非常方便、關(guān)系型數(shù)據(jù)庫有事務(wù)操作,保證數(shù)據(jù)的完整性。
缺點(diǎn):因?yàn)閿?shù)據(jù)和數(shù)據(jù)之間是有關(guān)系的,關(guān)系是由底層大量算法保證,會拉低系統(tǒng)運(yùn)行速度,消耗系統(tǒng)資源;海量數(shù)據(jù)時增刪改查很可能宕機(jī),維護(hù)/擴(kuò)展也會不好。
適合處理一般量級數(shù)據(jù),安全。
非關(guān)系型數(shù)據(jù)庫(NOSQL):Redis##
非關(guān)系數(shù)據(jù)庫設(shè)計(jì)之初是為了替代關(guān)系型數(shù)據(jù)庫的。
優(yōu)點(diǎn):海量數(shù)據(jù)的增刪改查和維護(hù)非常輕松。
缺點(diǎn):數(shù)據(jù)和數(shù)據(jù)之間沒有關(guān)系,不能一目了然;沒有事務(wù)保證數(shù)據(jù)的完整和安全。
適合處理海量數(shù)據(jù),效率。不一定安全。
主流NOSQL數(shù)據(jù)庫

NoSQL數(shù)據(jù)庫的四大分類如下:
1鍵值(Key-Value)存儲數(shù)據(jù)庫
相關(guān)產(chǎn)品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型應(yīng)用:內(nèi)容緩存,主要用于處理大量數(shù)據(jù)的高訪問負(fù)載。
數(shù)據(jù)模型:一系列鍵值對
優(yōu)勢:優(yōu)秀的快速查詢,穩(wěn)定性強(qiáng)。
劣勢:存儲的數(shù)據(jù)缺少結(jié)構(gòu)化
2列存儲數(shù)據(jù)庫
相關(guān)產(chǎn)品:Cassandra、HBase,Riak
典型應(yīng)用:分布式的文件系統(tǒng)
數(shù)據(jù)模型:以列簇式存儲,將同一列數(shù)據(jù)存在一起
優(yōu)勢:查找速度快,可擴(kuò)展性強(qiáng),更容易進(jìn)行分布式擴(kuò)展
劣勢:功能相對局限,使用極大的內(nèi)存才可調(diào)配,且系統(tǒng)處理算法時將有數(shù)秒甚至更長時間的不可用,導(dǎo)致大量處理超時
3文檔型數(shù)據(jù)庫(淘汰)**
相關(guān)產(chǎn)品:CouchDB、MongoDb
典型應(yīng)用:Web應(yīng)用(與Key-Value類似,Value是結(jié)構(gòu)化的)
數(shù)據(jù)模型:一系列鍵值對
優(yōu)勢:數(shù)據(jù)結(jié)構(gòu)要求不嚴(yán)格
劣勢:查詢性能不高,而且缺乏統(tǒng)一的查詢語法
4圖形(Graph)數(shù)據(jù)庫**
相關(guān)數(shù)據(jù)庫:Neo4J、infoGrid、infinite、Graph
典型應(yīng)用:社交網(wǎng)絡(luò)【關(guān)系網(wǎng)】
數(shù)據(jù)模型:圖結(jié)構(gòu)
優(yōu)勢:利用圖結(jié)構(gòu)相關(guān)算法
劣勢:需要對整個圖做計(jì)算才能得出結(jié)果,不容易做分布式的集群方案。局限性過強(qiáng)
Redis概述
Redis由來
2008年,意大利的一家創(chuàng)業(yè)公司Merzia推出了一款基于MySQL的網(wǎng)站實(shí)時統(tǒng)計(jì)系統(tǒng) LLOOGG,然而沒過多久該公司的創(chuàng)始人 Salvatore Sanfilippo 便對MySQL 的性能感到失望,于是他決定親自為 LLOOGG 量身定做一個 數(shù)據(jù)庫,并并于 2009 年開發(fā)完成,這個數(shù)據(jù)庫就是Redis。不過Salvatore Sanfilippo并不滿足只將 Redis 用于LLOOGG這一款產(chǎn)品,而是希望更多的人使用它,于是在同一年 Salvatore Sanfilippo 將 Redis 開源發(fā)布,并開始和 Redis 的另一名主要的代碼貢獻(xiàn)者 Pieter Noordhuis 一起繼續(xù)著 Redis 的開發(fā),直到今天。
Salvatore Sanfilippo 自己也沒有想到,短短的幾年時間,Redis就擁有了龐大的用戶群體。Hacker News 在 2012 年發(fā)布了一份數(shù)據(jù)庫的使用情況調(diào)查,結(jié)果顯示有近 12% 的公司在使用 Redis。國內(nèi)如 新浪微博、街旁網(wǎng)、知乎網(wǎng),國外如GitHub、Stack Overflow、Flickr等都是Redis的用戶。
VMware 公司從2010年開始贊助 Redis 的開發(fā),Salvatore Sanfilippo和 Pieter Noordhuis 也分別在3月和5月加入VMware,全職開發(fā)Redis。
什么是 Redis
Redis 是用 C 語言開發(fā)的一個開源的高性能鍵值對(key-value)數(shù)據(jù)庫。它通過提供多種鍵值數(shù)據(jù)類型來適應(yīng)不同場景下的存儲需求,目前為止 Redis 支持的鍵值數(shù)據(jù)類型如下:
字符串類型
散列類型
列表類型
集合類型
有序集合類型。
官方提供測試數(shù)據(jù):50 個并發(fā)執(zhí)行 100000 個請求,讀的速度是 110000 次/s,寫的速度是 81000 次/s。數(shù)據(jù)僅供參考,根據(jù)服務(wù)器配置會有不同結(jié)果。
Redis 的應(yīng)用場景
緩存(數(shù)據(jù)查詢、短連接、新聞內(nèi)容、商品內(nèi)容等等)。(最多使用)
聊天室的在線好友列表。
任務(wù)隊(duì)列。(秒殺、搶購、12306等等)
應(yīng)用排行榜。
網(wǎng)站訪問統(tǒng)計(jì)。
數(shù)據(jù)過期處理(可以精確到毫秒)
分布式集群架構(gòu)中的session分離。
Redis安裝和啟動
redis數(shù)據(jù)類型
redis使用的是鍵值對 保存數(shù)據(jù)(map)
key:全部都是字符串
value:有五種類型

Key名稱:自定義,理論上不要過長否則影響使用效率(長度從小到大查詢)。也不要太短,要有意義的。
Redis命令-String命令
概述:字符串類型是Redis中最為基礎(chǔ)的數(shù)據(jù)存儲類型,它在Redis中是二進(jìn)制安全的,這便意味著該類型存入和獲取的數(shù)據(jù)將相同。在Redis中字符串類型的Value最多可以容納的數(shù)據(jù)長度是512M。
二進(jìn)制安全和數(shù)據(jù)安全是沒有關(guān)系的。

MySQL-關(guān)系型數(shù)據(jù)庫,二進(jìn)制不安全。【亂碼、丟失數(shù)據(jù)】

賦值(相當(dāng)于map.put)
set key value:設(shè)定key持有指定的字符串value,如果該key存在則進(jìn)行覆蓋操作,總是返回“OK”。

取值(相當(dāng)于map.get)
get key:獲取key的value。如果與該key關(guān)聯(lián)的value是不string類型的,Redis將返回錯誤信息,因?yàn)間et命令只能用于獲取String value;如果該key不存在,返回(nil)。


get key value:先獲取該key的值,然后在設(shè)置該key的值,新的value會覆蓋老的value。
刪除(相當(dāng)于map.remove)
del key:刪除指定key,返回受影響行數(shù)。
其他:
獲取并修改值
getset key value:先獲取該key的值,然后在設(shè)置該key的值。
遞增
incr key:將指定的key的value原子性的遞增1,如果該key不存在,其初始值為0,在incr之后其值為1.如果value的值不能轉(zhuǎn)成整形,如hello,該操作將執(zhí)行失敗并返回相應(yīng)的錯誤信息。相當(dāng)于i++
遞減
decr key:將指定的key的value原子性的遞減1,如果該key不存在,其初始值為0,在decr之后其值為-1,如果value的值不能轉(zhuǎn)成整形,如hello,該操作失敗并返回相應(yīng)錯誤。相當(dāng)于i—
拼接字符串
append key value:拼接字符串。如果該key存在,則在原有的value后追加該值,如果不存在,則重新創(chuàng)建一個key/value
將數(shù)值自增任意值
incrby key increment:將指定的key的value原子性增加increment,如果該key不存在,其初始值為0,在incrby后,該值為increment。如果該值不能轉(zhuǎn)成整形,則失敗并報(bào)錯。
將數(shù)值遞減任意值
decrby key decrement:將指定的key的value原子性增加decrement,如果該key不存在,其初始值為0,在incrby后,該值為-decrement。如果該值不能轉(zhuǎn)成整形,則失敗并報(bào)錯。
String使用環(huán)境:主要用于保存******json******格式的字符串
Redis命令-hash命令
概述:Redis中的Hash類型可以看成具有String Key和String Value的map容器。所以該類型非常適合用于存儲值對象的信息。如Username、Password等。如果Hash中包含很少的字段,那么該類型的數(shù)據(jù)也將僅占用很少的磁盤空間。每一個Hash可以存儲4294967295個鍵值對。
賦值
hset key field value:為指定的key設(shè)定field/value對(鍵值對)。
hmset key field value field2 value2 …:設(shè)置key中的多個filed/value
取值
hget key field:返回指定的key中的field的值。
hmget key filed1 filed2 …:獲取key中的多個filed的值
hgetall key:獲取key中的所有filed-value
刪除
hdel key field field..:可刪除一個或者多個字段,返回值是被刪除的字段個數(shù)。
del key:刪除整個
增加數(shù)字
hincrby key field increment:設(shè)置key中filed的值增加increment
其他命令
hexists key field:判斷指定的key中的filed是否存在
hlen key:獲取key所包含的filed的數(shù)量
hkeys kye:獲取所有的字段
hvals key:獲取所有的value
keys * ****查詢所有的key
Redis命令-list命令
概述:dis中,List類型是按照插入順序排序的字符串鏈表。和數(shù)據(jù)結(jié)構(gòu)中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。在插入時,如果該鍵并不存在,Redis將為該鍵創(chuàng)建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那么該鍵也將會被從數(shù)據(jù)庫中刪除。List中可以包含的最大元素?cái)?shù)量是4294967295。
從元素插入和刪除的效率視角來看,如果我們是在鏈表的兩頭插入或刪除元素,這將會是非常高效的操作,即使鏈表中已經(jīng)存儲了百萬條記錄,該操作也可以在常量時間內(nèi)完成。然而需要說明的是,如果元素插入或刪除操作是作用于鏈表中間,那將會是非常低效的。相信對于有良好數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)的開發(fā)者而言,這一點(diǎn)并不難理解。
賦值(兩端添加)
lpush key values1 values2 …:在指定的key所關(guān)聯(lián)的list頭部插入所有的values。如果該key不存在,該命令在插入的之前創(chuàng)建一個與該key關(guān)聯(lián)的空鏈表,之后再向該鏈表的頭部插入數(shù)據(jù)。插入成功,返回元素的個數(shù)。
rpush key values1 values2…:在該list的尾部添加元素。
取值(查看列表)
lrange key start end:獲取鏈表中從start到end的元素的值,start、end從0開始計(jì)數(shù),也可以為負(fù)數(shù),若為-1則標(biāo)識鏈表尾部的元素。-2則表示倒數(shù)第二個,以此類推..
刪除(兩端彈出)
lpop key:返回并彈出指定的key關(guān)聯(lián)的鏈表中的第一個元素,即頭部元素。如果該key不存在,返回nil;若存在則返回鏈表中的頭部元素
rpop key:從尾部單出元素。
獲取列表中的元素個數(shù)
llen key:返回指定的key關(guān)聯(lián)的鏈表中的元素的數(shù)量。
刪除某種元素(效率低)
lrem key count value:刪除count個值為value的元素,如果count大于0,從頭向尾遍歷并刪除count個值為value的元素,如果count小于0,則從尾向頭遍歷并刪除。如果count等于0,則刪除鏈表中所有等于value的元素。
通過索引替換元素(效率低)
lset key index value:設(shè)置鏈表中的index的腳標(biāo)的元素值,0代表鏈表的頭元素,-1代表鏈表的尾元素。操作鏈表的腳標(biāo)不存在則拋異常。
在索引前/****后插入元素(效率低)
linsert key before|after pivot value:在pivot元素前后插入value這個元素。
擴(kuò)展命令
rpoplpush resource destination:將resource鏈表中的尾部元素彈出并添加到destination頭部。
rpoplpush resource resource:將resource鏈表中的尾部元素彈出并添加到resource頭部。(循環(huán)操作)
Redis命令-set命令
概述:Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。集合中最大的成員數(shù)為232 - 1 (4294967295, 每個集合可存儲40多億個成員)。
添加/****刪除元素
sadd key value value1…:向set中添加數(shù)據(jù),如果該key的值已有則不會重復(fù)添加。
srem key members members1..:刪除set中指定的成員。
取值
smembers key:獲取set中所有元素
sismember key member:判斷參數(shù)中指定的元素是否存在,1表示存在,0表示不存在或者該key本身就不存在。(無論集合中有多少元素都可以極速的返回結(jié)果).
集合運(yùn)算
sdiff key1 key2 …:差集運(yùn)算,返回kye1與key2中相差的成員,而且與key的順序有關(guān)。即返回差集。

sinter key1 key2 …:返回交集

sunion key1 key2 ..:返回并集。

擴(kuò)展命令
scard key:獲取set中元素?cái)?shù)量
srandmember key:隨機(jī)返回一個元素
sdiffstore destination key1 key2..:將key1、key2相差的成員存儲在destination上
sinterstore destination key1 key2..:將返回的交際存儲在destination上
sunionstore destination key1 key2..:將返回的并集存儲在destination上
Redis命令-有序set命令(zset)
概述:Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員。不同的是每個元素都會關(guān)聯(lián)一個double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。
有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。
有序set集合: 有序,不重復(fù)。專門用來做排行榜
添加元素
zadd key score member score2 member2 …:將所有成員以及該成員的分?jǐn)?shù)放到sorted-set中。如果該元素已經(jīng)存在則會用新的分?jǐn)?shù)替換原有的分?jǐn)?shù)。返回值是新加入到集合中的元素個數(shù),不包含之前已經(jīng)存在的元素。
獲取元素
zscore key member:返回指定成員的分?jǐn)?shù)。
刪除元素
zrem key member member…****:移除集合中指定成員,可以指定多個。
范圍查詢(****順序查看)
zrange key start end [withscores] : 獲取集合中腳標(biāo)為start-end的成員,withscores參數(shù)表明返回的成員包含其分?jǐn)?shù)。(分?jǐn)?shù)有小到大排列)
zrevrange key start end [withscores] : 獲取集合中腳標(biāo)為start-end的成員,withscores參數(shù)表明返回的成員包含其分?jǐn)?shù)。(分?jǐn)?shù)大到小排列)
zremrangebyrank key start stop****:按照排名范圍刪除元素
zremrangebyscore key min max : 按照分?jǐn)?shù)范圍刪除元素
擴(kuò)展命令
zrangebyscore key min max [withscores] [limit offset count]: 返回分?jǐn)?shù)在[min,max]的成員并按照分?jǐn)?shù)從低到高排序。[withscores]:顯示分?jǐn)?shù);[limit offset count]:offset,表明腳標(biāo)為offset的元素開始并返回count個成員。
zincrby key increment member:設(shè)置指定成員的增加的分?jǐn)?shù)。返回值時更改后的分?jǐn)?shù)。
zcount key min max:獲取分?jǐn)?shù)在[min,max]之間的成員。
zrank key member:返回成員在集合中的排名。索引(從小到大)。
zrevrank key member:返回成員在集合中的排名。索引(從大到?。?。
Redis命令-通用命令
keys pattern:獲取所有與pattern匹配的key,返回所有與該key匹配的keys。*表示任意一個或多個字符,?表示任意一個字符。
del key1 key2 ..:刪除指定的key。
exists key:判斷該key是否存在,1代表存在,0代表不存在。
rename key newkey:為當(dāng)前的key重命名
expire key time:設(shè)置過期時間,單位:秒。過期即刪除。
ttl key:獲取該key所剩的超時時間,如果沒有設(shè)置超時,返回-1.如果返回-2表示超時不存在。
type key:獲取指定key的類型。該命令將以字符串的格式返回。返回的字符串為string、list、set、Hash、zset。如果key不存在返回none。
redis服務(wù)器命令
ping:測試連接是否存活。ping成功返回PONG;
echo:在命令行打印一些東西。echo “HELLO WORLD!”;
select:選擇數(shù)據(jù)庫。redis數(shù)據(jù)庫編號【0-15】,選擇16是報(bào)錯;
quit:退出連接;
dbsize:返回當(dāng)前數(shù)據(jù)庫中key的數(shù)目;
info:獲取服務(wù)器的信息和統(tǒng)計(jì);