




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Redis IntroductionAlex Zhu REmote DIctionary ServerLatest Stable Release 2.6.16www.redis.ioTCP:6379 Alessia MerzTape is Dead,Disk is Tape,F(xiàn)lash is Disk,RAM Locality is King - Jim Gray1944 2007?Whats Redis? Redis是一款開源的、高性能的鍵-值存儲(chǔ)(key-value store)。它常被稱作是一款數(shù)據(jù)結(jié)構(gòu)服務(wù)器(data structure server)。Redis的鍵值可以包括字符串(
2、strings)類型,同時(shí)它還包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等數(shù)據(jù)類型。 對(duì)于這些數(shù)據(jù)類型,你可以執(zhí)行原子操作。例如:對(duì)字符串進(jìn)行附加操作(append);遞增哈希中的值;向列表中增加元素;計(jì)算集合的交集、并集與差集等。Whats Redis? 為了獲得優(yōu)異的性能,Redis采用了內(nèi)存中(in-memory)數(shù)據(jù)集(dataset)的方式。同時(shí),Redis支持?jǐn)?shù)據(jù)的持久化,你可以每隔一段時(shí)間將數(shù)據(jù)集轉(zhuǎn)存到磁盤上(snapshot),或者在日志尾部追加每一條操作命令(append only file,aof)。 Whats R
3、edis? Redis同樣支持主從復(fù)制(master-slave replication),并且具有非常快速的非阻塞首次同步( non-blocking first synchronization)、網(wǎng)絡(luò)斷開自動(dòng)重連等功能。同時(shí)Redis還具有其它一些特性,其中包括簡(jiǎn)單的事物支持、發(fā)布訂閱 ( pub/sub)、管道(pipeline)和虛擬內(nèi)存(vm)等 。 Redis具有豐富的客戶端,支持現(xiàn)階段流行的大多數(shù)編程語(yǔ)言。php常用的是phpredis( http:/redis.io/clients )Redis & Memcache 都是Key-Value存儲(chǔ) Redis可以存儲(chǔ)到磁盤
4、 Redis的存儲(chǔ)類型更豐富 同樣支持主從復(fù)制 Memcache支持二進(jìn)制數(shù)據(jù)存儲(chǔ)(圖像,聲音) 重啟系統(tǒng)后Memcache不會(huì)恢復(fù) Redis更像數(shù)據(jù)庫(kù)Installation make & make installFrameworkRedis PerformanceString string是redis最基本的類型,而且string類型是二進(jìn)制安全的。 redis的string可以包含任何數(shù)據(jù)。包括jpg圖片或者序列化的對(duì)象。 最大上限是1G字節(jié)。 如果只用string類型,redis就可以被看作加上持久化特性的memcached String 相關(guān)命令相關(guān)命令set key va
5、lue 設(shè)置key對(duì)應(yīng)的值為string類型的value,返回1表示成功,0失敗setnx key value 同上,如果key已經(jīng)存在,返回0 。nx 是not exist的意思get key 獲取key對(duì)應(yīng)的string值,如果key不存在返回nilgetset key value 設(shè)置key的值,并返回key的舊值。如果key不存在返回nilmget key1 key2 . keyN 一次獲取多個(gè)key的值,如果對(duì)應(yīng)key不存在,則對(duì)應(yīng)返回nil。下面是個(gè)實(shí)驗(yàn), nonexisting不存在,對(duì)應(yīng)返回nilString 相關(guān)命令相關(guān)命令mset key1 value1 . keyN va
6、lueN 一次設(shè)置多個(gè)key的值,成功返回1表示所有的值都設(shè)置了,失敗返回0表示沒(méi)有任何值被設(shè)置msetnx key1 value1 . keyN valueN 同上,但是不會(huì)覆蓋已經(jīng)存在的keyincr key 對(duì)key的值做加加操作,并返回新的值。注意incr一個(gè)不是int的value會(huì)返回錯(cuò)誤,incr一個(gè)不存在的key,則設(shè)置key為1decr key 同上,但是做的是減減操作,decr一個(gè)不存在key,則設(shè)置key為-1incrby key integer 同incr,加指定值 ,key不存在時(shí)候會(huì)設(shè)置key,并認(rèn)為原來(lái)的value是 0decrby key integer 同dec
7、r,減指定值。decrby完全是為了可讀性,我們完全可以通過(guò)incrby一個(gè)負(fù)值來(lái)實(shí)現(xiàn)同樣效果,反之一樣。String 相關(guān)命令相關(guān)命令append key value 給指定key的字符串值追加value,返回新字符串值的長(zhǎng)度。下面給個(gè)例子substr key start end 返回截取過(guò)的key的字符串值,注意并不修改key的值。下標(biāo)是從0開始的。Listredis的list類型其實(shí)就是一個(gè)每個(gè)子元素都是string類型的雙向鏈表。我們可以通過(guò)push,pop操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊(duì)列。list的pop操作還有阻塞版本的。當(dāng)我們lrp
8、op一個(gè)list對(duì)象是,如果list是空,或者不存在,會(huì)立即返回nil。但是阻塞版本的blrpop可以則可以阻塞,當(dāng)然可以加超時(shí)時(shí)間,超時(shí)后也會(huì)返回nil。為什么要阻塞版本的pop呢,主要是為了避免輪詢。舉個(gè)簡(jiǎn)單的例子如果我們用list來(lái)實(shí)現(xiàn)一個(gè)工作隊(duì)列。執(zhí)行任務(wù)的thread可以調(diào)用阻塞版本的pop去獲取任務(wù)這樣就可以避免輪詢?nèi)z查是否有任務(wù)存在。當(dāng)任務(wù)來(lái)時(shí)候工作線程可以立即返回,也可以避免輪詢帶來(lái)的延遲。 List相關(guān)命令相關(guān)命令lpush key string 在key對(duì)應(yīng)list的頭部添加字符串元素,返回1表示成功,0表示key存在且不是list類型rpush key string 同
9、上,在尾部添加llen key 返回key對(duì)應(yīng)list的長(zhǎng)度,key不存在返回0,如果key對(duì)應(yīng)類型不是list返回錯(cuò)誤lrange key start end 返回指定區(qū)間內(nèi)的元素,下標(biāo)從0開始,負(fù)值表示從后面計(jì)算,-1表示倒數(shù)第一個(gè)元素 ,key不存在返回空列表ltrim key start end 截取list,保留指定區(qū)間內(nèi)元素,成功返回1,key不存在返回錯(cuò)誤lset key index value 設(shè)置list中指定下標(biāo)的元素值,成功返回1,key或者下標(biāo)不存在返回錯(cuò)誤lrem key count value 從key對(duì)應(yīng)list中刪除count個(gè)和value相同的元素。count
10、為0時(shí)候刪除全部lpop key 從list的頭部刪除元素,并返回刪除元素。如果key對(duì)應(yīng)list不存在或者是空返回nil,如果key對(duì)應(yīng)值不是list返回錯(cuò)誤List相關(guān)命令相關(guān)命令rpop 同上,但是從尾部刪除blpop key1.keyN timeout 從左到右掃描返回對(duì)第一個(gè)非空l(shuí)ist進(jìn)行l(wèi)pop操作并返回,比如blpop list1 list2 list3 0 ,如果list1不存在,list2,list3都是非空則對(duì)list2做lpop并返回從list2中刪除的元素。如果所有的list都是空或不存在,則會(huì)阻塞timeout秒,timeout為0表示一直阻塞。當(dāng)阻塞時(shí),如果有cl
11、ient對(duì)key1.keyN中的任意key進(jìn)行push操作,則第一在這個(gè)key上被阻塞的client會(huì)立即返回。如果超時(shí)發(fā)生,則返回nil。brpop 同blpop,一個(gè)是從頭部刪除一個(gè)是從尾部刪除rpoplpush srckey destkey 從srckey對(duì)應(yīng)list的尾部移除元素并添加到destkey對(duì)應(yīng)list的頭部,最后返回被移除的元素值,整個(gè)操作是原子的.如果srckey是空或者不存在返回nilSetredis的set是string類型的無(wú)序集合。set元素最大可以包含(2的32次方-1)個(gè)元素。set的是通過(guò)hash table實(shí)現(xiàn)的,hash table會(huì)隨著添加或者刪除自動(dòng)
12、的調(diào)整大小關(guān)于set集合類型除了基本的添加刪除操作,其他有用的操作還包含集合的取并集(union),交集(intersection),差集(difference)。通過(guò)這些操作可以很容易的實(shí)現(xiàn)sns中的好友推薦和blog的tag功能。Set相關(guān)命令相關(guān)命令sadd key member 添加一個(gè)string元素到,key對(duì)應(yīng)的set集合中,成功返回1,如果元素以及在集合中返回0,key對(duì)應(yīng)的set不存在返回錯(cuò)誤srem key member 從key對(duì)應(yīng)set中移除給定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對(duì)應(yīng)的不是set類型的值返回錯(cuò)誤spop k
13、ey 刪除并返回key對(duì)應(yīng)set中隨機(jī)的一個(gè)元素,如果set是空或者key不存在返回nilsrandmember key 同spop,隨機(jī)取set中的一個(gè)元素,但是不刪除元素smove srckey dstkey member 從srckey對(duì)應(yīng)set中移除member并添加到dstkey對(duì)應(yīng)set中,整個(gè)操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set類型返回錯(cuò)誤scard key 返回set的元素個(gè)數(shù),如果set是空或者key不存在返回0sismember key member 判斷member是否在set中,存在返回1,0表示不存在或者key不
14、存在sinter key1 key2.keyN 返回所有給定key的交集sinterstore dstkey key1.keyN 同sinter,但是會(huì)同時(shí)將交集存到dstkey下Set相關(guān)命令相關(guān)命令sunion key1 key2.keyN 返回所有給定key的并集sunionstore dstkey key1.keyN 同sunion,并同時(shí)保存并集到dstkey下sdiff key1 key2.keyN 返回所有給定key的差集sdiffstore dstkey key1.keyN 同sdiff,并同時(shí)保存差集到dstkey下smembers key 返回key對(duì)應(yīng)set的所有元素,結(jié)
15、果是無(wú)序的Sorted set和set一樣sorted set也是string類型元素的集合,不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類型的score。sorted set的實(shí)現(xiàn)是skip list和hash table的混合體。當(dāng)元素被添加到集合中時(shí),一個(gè)元素到score的映射被添加到hash table中,另一個(gè)score到元素的映射被添加到skip list并按照score排序,所以就可以有序的獲取集合中的元素。 Sorted set 相關(guān)命令相關(guān)命令zadd key score member 添加元素到集合,元素在集合中存在則更新對(duì)應(yīng)scorezrem key member 刪除指定元
16、素,1表示成功,如果元素不存在返回0zincrby key incr member 增加對(duì)應(yīng)member的score值,然后移動(dòng)元素并保持skip list有序。返回更新后的score值z(mì)rank key member 返回指定元素在集合中的排名(下標(biāo),非score),集合中元素是按score從小到大排序的zrevrank key member 同上,但是集合中元素是按score從大到小排序zrange key start end 類似lrange操作從集合中取指定區(qū)間的元素。返回的是有序結(jié)果zrevrange key start end 同上,返回結(jié)果是按score逆序的zrangebysc
17、ore key min max 返回集合中score在給定區(qū)間的元素zcount key min max 返回集合中score在給定區(qū)間的數(shù)量zcard key 返回集合中元素個(gè)數(shù)zscore key element 返回給定元素對(duì)應(yīng)的scorezremrangebyrank key min max 刪除集合中排名在給定區(qū)間的元素zremrangebyscore key min max 刪除集合中score在給定區(qū)間的元素HashHashredis hash是一個(gè)string類型的field和value的映射表。hash特別適合用于存儲(chǔ)對(duì)象。相較于將對(duì)象的每個(gè)字段存成單個(gè)string類型。將一
18、個(gè)對(duì)象存儲(chǔ)在hash類型中會(huì)占用更少的內(nèi)存,并且可以更方便的存取整個(gè)對(duì)象。Hash相關(guān)命令相關(guān)命令hset key field value 設(shè)置hash field為指定值,如果key不存在,則先創(chuàng)建hget key field 獲取指定的hash fieldhmget key filed1.fieldN 獲取全部指定的hash filedhmset key filed1 value1 . filedN valueN 同時(shí)設(shè)置hash的多個(gè)fieldhincrby key field integer 將指定的hash filed 加上給定值hexists key field 測(cè)試指定field
19、是否存在hdel key field 刪除指定的hash fieldhlen key 返回指定hash的field數(shù)量hkeys key 返回hash的所有fieldhvals key 返回hash的所有valuehgetall 返回hash的所有filed和value主從復(fù)制主從復(fù)制主從復(fù)制允許多個(gè)slave server擁有和master server相同的數(shù)據(jù)庫(kù)副本。下面是關(guān)于redis主從復(fù)制的一些特點(diǎn) 1.master可以有多個(gè)slave 2.除了多個(gè)slave連到相同的master外,slave也可以連接其他slave形成圖狀結(jié)構(gòu) 3.主從復(fù)制不會(huì)阻塞master。也就是說(shuō)當(dāng)一個(gè)或
20、多個(gè)slave與master進(jìn)行初次同步數(shù)據(jù)時(shí),master可以繼續(xù)處理client發(fā)來(lái)的請(qǐng)求。相反slave在初次同步數(shù)據(jù)時(shí)則會(huì)阻塞,不能處理client的請(qǐng)求。 4.主從復(fù)制可以用來(lái)提高系統(tǒng)的可伸縮性(我們可以用多個(gè)slave 專門用于client的讀請(qǐng)求,比如sort操作可以使用slave來(lái)處理),也可以用來(lái)做簡(jiǎn)單的數(shù)據(jù)冗余。 5.可以在master禁用數(shù)據(jù)持久化,只需要注釋掉master 配置文件中的所有save配置,然后只在slave上配置數(shù)據(jù)持久化。事務(wù)事務(wù)redis對(duì)事務(wù)的支持目前還比較簡(jiǎn)單。redis只能保證一個(gè)client發(fā)起的事務(wù)中的命令可以連續(xù)的執(zhí)行,而中間不會(huì)插入其他c
21、lient的命令。 Multi 事務(wù)開始 Exec 執(zhí)行事務(wù) Discard 放棄事務(wù) Watch 監(jiān)聽key Unwatch 放棄所有key的監(jiān)聽watch 命令會(huì)監(jiān)視給定的key,當(dāng)exec時(shí)候如果監(jiān)視的key從調(diào)用watch后發(fā)生過(guò)變化,則整個(gè)事務(wù)會(huì)失敗。注意watch的key是對(duì)整個(gè)連接有效的,和事務(wù)一樣,如果連接斷開,監(jiān)視和事務(wù)都會(huì)被自動(dòng)清除。 發(fā)布訂閱(發(fā)布訂閱(pub/sub )發(fā)布訂閱(pub/sub)是一種消息通信模式。訂閱者可以通過(guò)subscribe和psubscribe命令向redis server訂閱自己感興趣的消息類型,redis將消息類型稱為通道(channel)。
22、當(dāng)發(fā)布者通過(guò)publish命令向redis server發(fā)送特定類型的消息時(shí)。訂閱該消息類型的全部client都會(huì)收到此消息。這里消息的傳遞是多對(duì)多的。一個(gè)client可以訂閱多個(gè) channel,也可以向多個(gè)channel發(fā)送消息。 Subscribe Unsubscribe Psubscribe Punsubscribe Publish管道(管道(pipeline)redis是一個(gè)cs模式的tcp server,使用和http類似的請(qǐng)求響應(yīng)協(xié)議。一個(gè)client可以通過(guò)一個(gè)socket連接發(fā)起多個(gè)請(qǐng)求命令。每個(gè)請(qǐng)求命令發(fā)出后client通常 會(huì)阻塞并等待redis服務(wù)處理,redis處理完
23、后請(qǐng)求命令后會(huì)將結(jié)果通過(guò)響應(yīng)報(bào)文返回給client。基本的通信過(guò)程如下Client: INCR XServer: 1Client: INCR XServer: 2Client: INCR XServer: 3Client: INCR XServer: 4基本上四個(gè)命令需要8個(gè)tcp報(bào)文才能完成。由于通信會(huì)有網(wǎng)絡(luò)延遲,假如從client和server之間的包傳輸時(shí)間需要0.125秒。那么上面的四個(gè)命令8個(gè)報(bào)文至少會(huì)需要1秒才能完成。 管道(管道(pipeline)利用pipeline的方式從client打包多條命令一起發(fā)出,不需要等待單條命令的響應(yīng)返回,而redis服務(wù)端會(huì)處理完多條命令后會(huì)將多
24、條命令的處理結(jié)果打包到一起返回給客戶端。通信過(guò)程如下Client: INCR XClient: INCR XClient: INCR XClient: INCR XServer: 1Server: 2Server: 3Server: 4Redis 命令參考 /en/latest/index.htmlRedis應(yīng)用場(chǎng)景應(yīng)用場(chǎng)景1.取最新取最新N個(gè)數(shù)據(jù)的操作個(gè)數(shù)據(jù)的操作比如典型的取你網(wǎng)站的最新文章,通過(guò)下面方式,我們可以將最新的5000條評(píng)論的ID放在Redis的List集合中,并將超出集合部分從數(shù)據(jù)庫(kù)獲取使用LPUSH ments命令,向li
25、st集合中插入數(shù)據(jù) 插入完成后再用LTRIM ments 0 5000命令使其永遠(yuǎn)只保存最近5000個(gè)ID 然后我們?cè)诳蛻舳双@取某一頁(yè)評(píng)論時(shí)可以用下面的邏輯(偽代碼) FUNCTION get_latest_comments(start,num_items): id_list = redis.lrange(ments,start,start+num_items-1) IF id_list.length num_items id_list = SQL_DB(SELECT . ORDER BY time LIMIT .) END RETURN id_list END 如果你還有不同的篩選維度,比如某個(gè)分類的最新N條,那么你可以再建一個(gè)按此分類的List,只存ID的話,Redis是非常高效的。Redis應(yīng)用場(chǎng)景應(yīng)用場(chǎng)景2.排行榜應(yīng)用,取排行榜應(yīng)用,取TOP N操作操作 這個(gè)需求與上面需求的不同之處在于,前面操作以時(shí)間為權(quán)重,這個(gè)是以某個(gè)條件為權(quán)重,比如按頂?shù)拇螖?shù)排序,這時(shí)候就需要我們的sorted set出馬了,將你要排序的值設(shè)置成sorted set的score,將具體的數(shù)據(jù)設(shè)
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)庫(kù)考試中的案例解讀與復(fù)盤試題及答案
- 學(xué)習(xí)方法的試題及答案分享
- 投資組合的動(dòng)態(tài)調(diào)整技術(shù)考核試卷
- 天然氣開采業(yè)的創(chuàng)新路徑與發(fā)展模式研究考核試卷
- 數(shù)據(jù)庫(kù)中的數(shù)據(jù)排序與分組試題及答案
- 數(shù)據(jù)庫(kù)管理中的代碼審計(jì)與安全控制策略試題及答案
- 金融顧問(wèn)培訓(xùn)理財(cái)知識(shí)和投資技巧培訓(xùn)考核試卷
- 嵌入式遙控技術(shù)的實(shí)現(xiàn)試題及答案
- 稀土金屬加工質(zhì)量改進(jìn)項(xiàng)目策劃與管理方法考核試卷
- 報(bào)考信息系統(tǒng)監(jiān)理師2025年試題及答案
- 燃?xì)夤艿滥甓葯z驗(yàn)報(bào)告
- 《功能性食品開發(fā)與應(yīng)用》課件-增強(qiáng)免疫力功能食品的開發(fā)與應(yīng)用
- 客戶管理跟進(jìn)表
- 中東及非洲民用頻段無(wú)線電臺(tái)行業(yè)現(xiàn)狀及發(fā)展機(jī)遇分析2024-2030
- 新能源汽車車身與電氣系統(tǒng)檢修 課件 項(xiàng)目1、2 新能源汽車電氣基礎(chǔ)、新能源汽車車身與低壓供電系統(tǒng)檢修
- 抽血室工作制度
- 湖南省長(zhǎng)沙市芙蓉區(qū)2022-2023學(xué)年五年級(jí)下學(xué)期期末數(shù)學(xué)試卷
- 小學(xué)升初中數(shù)學(xué)考試試卷含答案下載
- 廣東省勞動(dòng)合同電子版
- DZ∕T 0130.6-2006 地質(zhì)礦產(chǎn)實(shí)驗(yàn)室測(cè)試質(zhì)量管理規(guī)范 第6部分:水樣分析(正式版)
- 績(jī)效與薪酬管理:薪酬設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論