Redis 内存数据库
為什么需要學(xué)習(xí)NOSQL (三高)
隨著互聯(lián)網(wǎng)的高速崛起,網(wǎng)站的用戶群的增加,訪問(wèn)量的上升,傳統(tǒng)(關(guān)系型)數(shù)據(jù)庫(kù)上都開(kāi)始出現(xiàn)了性能瓶頸,web程序不再僅僅專注在功能上,同時(shí)也在追求性能。所以NOSQL數(shù)據(jù)庫(kù)應(yīng)運(yùn)而上,具體表現(xiàn)為對(duì)如下三高問(wèn)題的解決:
-
High performance - 對(duì)數(shù)據(jù)庫(kù)高并發(fā)讀寫的需求
web2.0網(wǎng)站要根據(jù)用戶個(gè)性化信息來(lái)實(shí)時(shí)生成動(dòng)態(tài)頁(yè)面和提供動(dòng)態(tài)信息,所以基本上無(wú)法使用動(dòng)態(tài)頁(yè)面靜態(tài)化技術(shù),因此數(shù)據(jù)庫(kù)并發(fā)負(fù)載非常高,往往要達(dá)到每秒上萬(wàn)次讀寫請(qǐng)求。關(guān)系數(shù)據(jù)庫(kù)應(yīng)付上萬(wàn)次SQL查詢還勉強(qiáng)頂?shù)米?#xff0c;但是應(yīng)付上萬(wàn)次SQL寫數(shù)據(jù)請(qǐng)求,硬盤IO就已經(jīng)無(wú)法承受了。其實(shí)對(duì)于普通的BBS網(wǎng)站,往往也存在對(duì)高并發(fā)寫請(qǐng)求的需求,例如網(wǎng)站的實(shí)時(shí)統(tǒng)計(jì)在線用戶狀態(tài),記錄熱門帖子的點(diǎn)擊次數(shù),投票計(jì)數(shù)等,因此這是一個(gè)相當(dāng)普遍的需求。(微博 :明星曝光戀情)
-
Huge Storage - 對(duì)海量數(shù)據(jù)的高效率存儲(chǔ)和訪問(wèn)的需求
類似Facebook,twitter,Friendfeed這樣的SNS網(wǎng)站,每天用戶產(chǎn)生海量的用戶動(dòng)態(tài),以Friendfeed為例,一個(gè)月就達(dá)到了2.5億條用戶動(dòng)態(tài),對(duì)于關(guān)系數(shù)據(jù)庫(kù)來(lái)說(shuō),在一張2.5億條記錄的表里面進(jìn)行SQL查詢,效率是極其低下乃至不可忍受的。再例如大型web網(wǎng)站的用戶登錄系統(tǒng),例如騰訊,盛大,動(dòng)輒數(shù)以億計(jì)的帳號(hào),關(guān)系數(shù)據(jù)庫(kù)也很難應(yīng)付。
-
High Scalability && High Availability- 對(duì)數(shù)據(jù)庫(kù)的高可擴(kuò)展性和高可用性的需求
在基于web的架構(gòu)當(dāng)中,數(shù)據(jù)庫(kù)是最難進(jìn)行橫向擴(kuò)展的,當(dāng)一個(gè)應(yīng)用系統(tǒng)的用戶量和訪問(wèn)量與日俱增的時(shí)候,你的數(shù)據(jù)庫(kù)卻沒(méi)有辦法像web server和app server那樣簡(jiǎn)單的通過(guò)添加更多的硬件和服務(wù)節(jié)點(diǎn)來(lái)擴(kuò)展性能和負(fù)載能力。對(duì)于很多需要提供24小時(shí)不間斷服務(wù)的網(wǎng)站來(lái)說(shuō),對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行升級(jí)和擴(kuò)展是非常痛苦的事情,往往需要停機(jī)維護(hù)和數(shù)據(jù)遷移,為什么數(shù)據(jù)庫(kù)不能通過(guò)不斷的添加服務(wù)器節(jié)點(diǎn)來(lái)實(shí)現(xiàn)擴(kuò)展呢?
NOSQL的特點(diǎn)
在大數(shù)據(jù)存取上具備關(guān)系型數(shù)據(jù)庫(kù)無(wú)法比擬的性能優(yōu)勢(shì),例如:
-
易擴(kuò)展
NoSQL數(shù)據(jù)庫(kù)種類繁多,但是一個(gè)共同的特點(diǎn)都是去掉關(guān)系數(shù)據(jù)庫(kù)的關(guān)系型特性。數(shù)據(jù)之間無(wú)關(guān)系,這樣就非常容易擴(kuò)展。也無(wú)形之間,在架構(gòu)的層面上帶來(lái)了可擴(kuò)展的能力。
-
大數(shù)據(jù)量,高性能
NoSQL數(shù)據(jù)庫(kù)都具有非常高的讀寫性能,尤其在大數(shù)據(jù)量下,同樣表現(xiàn)優(yōu)秀。這得益于它的無(wú)關(guān)系性,數(shù)據(jù)庫(kù)的結(jié)構(gòu)簡(jiǎn)單。
-
靈活的數(shù)據(jù)模型
NoSQL無(wú)需事先為要存儲(chǔ)的數(shù)據(jù)建立字段,隨時(shí)可以存儲(chǔ)自定義的數(shù)據(jù)格式。而在關(guān)系數(shù)據(jù)庫(kù)里,增刪字段是一件非常麻煩的事情。如果是非常大數(shù)據(jù)量的表,增加字段簡(jiǎn)直就是一個(gè)噩夢(mèng)。這點(diǎn)在大數(shù)據(jù)量的Web2.0時(shí)代尤其明顯。
-
高可用
NoSQL在不太影響性能的情況,就可以方便的實(shí)現(xiàn)高可用的架構(gòu)。比如Cassandra,HBase模型,通過(guò)復(fù)制模型也能實(shí)現(xiàn)高可用。
NoSQL:非關(guān)系型數(shù)據(jù)庫(kù) 是關(guān)系型數(shù)據(jù)庫(kù)的一個(gè)補(bǔ)充。
為什么要使用NOSQL
高并發(fā)讀寫需求
高效率存儲(chǔ)和訪問(wèn)的需求
高擴(kuò)展性和高可用性需求
主流的NoSQL
redis
MongoDB
什么是Redis
Redis是用C語(yǔ)言開(kāi)發(fā)的一個(gè)開(kāi)源的高性能鍵值對(duì)(key-value)數(shù)據(jù)庫(kù),數(shù)據(jù)是保存在內(nèi)存里面的. 官方提供測(cè)試數(shù)據(jù),50個(gè)并發(fā)執(zhí)行100000個(gè)請(qǐng)求,讀的速度是110000次/s,寫的速度是81000次/s ,且Redis通過(guò)提供多種鍵值數(shù)據(jù)類型來(lái)適應(yīng)不同場(chǎng)景下的存儲(chǔ)需求,目前為止Redis支持的鍵值數(shù)據(jù)類型如下:
key是string類型,value可以是下面這五種類型
-
字符串類型 string
-
散列類型 hash java-hashmap
-
列表類型 list java-linkedlist
-
集合類型 set java-hashset
-
有序集合類型 sortedset 簡(jiǎn)稱:zset 有序且唯一
Redis支持的數(shù)據(jù)類型有五種:string、hash、list、set、zset
redis的應(yīng)用場(chǎng)景
-
緩存(數(shù)據(jù)查詢、短連接、新聞內(nèi)容、商品內(nèi)容、首頁(yè)等等)
-
任務(wù)隊(duì)列。(秒殺、搶購(gòu)、12306等等)
-
數(shù)據(jù)過(guò)期處理(可以精確到毫秒, 短信驗(yàn)證碼)
-
分布式集群架構(gòu)中 session共享
-
分布式鎖實(shí)現(xiàn)
-
聊天室的在線好友列表
-
應(yīng)用排行榜
-
網(wǎng)站訪問(wèn)統(tǒng)計(jì)
redis中存儲(chǔ)的數(shù)據(jù)是以key-value的形式存在的.key是string類型,其中==value==支持5種數(shù)據(jù)類型 .在日常開(kāi)發(fā)中主要使用比較多的有字符串string、哈希hash、字符串列表list、字符串集合set 四種類型,其中最為常用的是==字符串類型==。
字符串(String)
哈希(hash) 類似HashMap 適合存儲(chǔ)對(duì)象(屬性,屬性值)
字符串列表(list) 類似LinkedList
字符串集合(set) 類似HashSet
有序的字符串集合(sorted-set或者叫zset) 有序且唯一
Redis字符串(String)
| SET key value | 設(shè)置指定 key 的值 |
| GET key | 獲取指定 key 的值 |
| DEL key | 刪除key |
| GETSET key value | 將給定 key 的值設(shè)為 value ,并返回 key 的舊值(old value)。 |
| SETEX key seconds value | 將值 value 關(guān)聯(lián)到 key ,并將 key 的過(guò)期時(shí)間設(shè)為 seconds (以秒為單位)。 |
| SETNX key value | 只有在 key 不存在時(shí)設(shè)置 key 的值。 |
| INCR key | 將 key 中儲(chǔ)存的數(shù)字值增一。 |
| INCRBY key increment | 將 key 所儲(chǔ)存的值加上給定的增量值(increment) 。 |
| DECR key | 將 key 中儲(chǔ)存的數(shù)字值減一。 |
| DECRBY key decrement | key 所儲(chǔ)存的值減去給定的減量值(decrement) 。 |
?
Redis 哈希(Hash)
| hset key filed value | 將哈希表 key 中的字段 field 的值設(shè)為 value |
| hmset key field1 value1 [field2 value2]... | 同時(shí)將多個(gè) field-value (字段-值)對(duì)設(shè)置到哈希表 key 中 |
| hget key filed | 獲取存儲(chǔ)在哈希表中指定字段的值 |
| hmget key filed1 filed2 | 獲取多個(gè)給定字段的值 |
| hdel key filed1 [filed2] | 刪除一個(gè)或多個(gè)哈希表字段 |
| hlen key | 獲取哈希表中字段的數(shù)量 |
| del key | 刪除整個(gè)hash(對(duì)象) |
| HGETALL key | 獲取在哈希表中指定 key 的所有字段和值 |
| HKEYS key | 獲取所有哈希表中的字段 |
| HVALS key | 獲取哈希表中所有值 |
?Redis 列表(List)
| lpush key value1 value2... | 將一個(gè)或多個(gè)值插入到列表頭部(左邊) |
| rpush key value1 value2... | 在列表中添加一個(gè)或多個(gè)值(右邊) |
| lpop key | 左邊彈出一個(gè) 相當(dāng)于移除第一個(gè) |
| rpop key | 右邊彈出一個(gè) 相當(dāng)于移除最后一個(gè) |
| llen key | 返回指定key所對(duì)應(yīng)的list中元素個(gè)數(shù) |
| LINDEX key index | 通過(guò)索引獲取列表中的元素 |
| LINSERT key BEFORE| AFTER pivot value | 在列表元素前或后插入元素 eg:linsert words before c e pivot表示列表中的元素 value表示新插入的值 |
?
Redis 集合(Set)
| sadd key member1 [member2] | 向集合添加一個(gè)或多個(gè)成員 |
| srem key member1 [member2] | 移除一個(gè)成員或者多個(gè)成員 |
| smembers key | 返回集合中的所有成員,查看所有 |
| SCARD key | 獲取集合的成員數(shù) |
| SPOP key | 返回集合中移除的一個(gè)隨機(jī)元素 |
| SDIFF key1 [key2] | 返回給定所有集合的差集 |
| SUNION key1 [key2] | 返回所有給定集合的并集 |
| SINTER key1 [key2] | 返回給定所有集合的交集 |
Redis 有序集合(sorted set | zset)
| ZADD key score member [score member ...] | 增加元素 |
| ZSCORE key member | 獲取元素的分?jǐn)?shù) |
| ZREM key member [member ...] | 刪除元素 |
| ZCARD key | 獲得集合中元素的數(shù)量 |
| ZRANGE key start stop[WITHSCORES] | 獲得排名在某個(gè)范圍的元素列表 查看所有元素:zrange key 0 -1 倒序排列查看:zrevrange key 0 2 |
Redis不僅是使用命令來(lái)操作,現(xiàn)在基本上主流的語(yǔ)言都有客戶端支持,比如java、C、C#、C++、php、Node.js、Go等。 在官方網(wǎng)站里列一些Java的客戶端,有Jedis、Redisson、lettuce、JDBC-Redis、等其中官方推薦使用Jedis和Redisson。 在企業(yè)中用的最多的就是Jedis,Jedis同樣也是托管在github上.
| new Jedis(host, port) | 創(chuàng)建jedis對(duì)象,參數(shù)host是redis服務(wù)器地址,參數(shù)port是redis服務(wù)端口 |
| set(key,value) | 設(shè)置字符串類型的數(shù)據(jù) |
| get(key) | 獲得字符串類型的數(shù)據(jù) |
| hset(key,field,value) | 設(shè)置哈希類型的數(shù)據(jù) |
| hget(key,field) | 獲得哈希類型的數(shù)據(jù) |
| lpush(key,values) | 設(shè)置列表類型的數(shù)據(jù) |
| lpop(key) | 列表左面彈棧 |
| rpop(key) | 列表右面彈棧 |
| sadd(String key, String... members) | 設(shè)置set類型的數(shù)據(jù) |
| zrange(String key, long start, long end) | 獲得在某個(gè)范圍的元素列表 |
| del(key) | 刪除key |
| exists(key) | 判斷key是否存在 |
jedis的介紹
| new Jedis(host, port) | 創(chuàng)建jedis對(duì)象,參數(shù)host是redis服務(wù)器地址,參數(shù)port是redis服務(wù)端口 |
| set(key,value) | 設(shè)置字符串類型的數(shù)據(jù) |
| get(key) | 獲得字符串類型的數(shù)據(jù) |
| hset(key,field,value) | 設(shè)置哈希類型的數(shù)據(jù) |
| hget(key,field) | 獲得哈希類型的數(shù)據(jù) |
| lpush(key,values) | 設(shè)置列表類型的數(shù)據(jù) |
| lpop(key) | 列表左面彈棧 |
| rpop(key) | 列表右面彈棧 |
| sadd(String key, String... members) | 設(shè)置set類型的數(shù)據(jù) |
| zrange(String key, long start, long end) | 獲得在某個(gè)范圍的元素列表 |
| del(key) | 刪除key |
| exists(key) | 判斷key是否存在 |
總結(jié)
以上是生活随笔為你收集整理的Redis 内存数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iphone屏幕突然变暗_如果你的iPh
- 下一篇: java爬虫12306_java爬虫12