我的redis使用場景_第1頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

展現(xiàn)最新數(shù)據(jù)Web應(yīng)用常常要展現(xiàn)最新數(shù)據(jù),就會根據(jù)時間對數(shù)據(jù)排序:SELECT*FROMfooWHERE...ORDERBYtimeDESCLIMIT10隨著數(shù)據(jù)的增加,問題變得越來越復(fù)雜,速度也越來越慢。這種情況可以用Redis解決,如這個問題:一個web應(yīng)用需要展示最新的20條用戶評論。每當(dāng)一條新評論產(chǎn)生時,將評論id加到redis的list中:LPUSHments<ID>裁剪list,保持固定長度(如只保留5000條):LTRIMments05000當(dāng)需要展示具體評論時,可以調(diào)用如下函數(shù):[plain]

\o"viewplain"viewplain

\o"copy"copyFUNCTION

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

在這里,redis做為一個實時緩存,無需不停的刷新。MySQL只有在需要更細(xì)節(jié)的信息和間隔可以較長的情況下被使用。刪除和篩選注意到可以用LREM刪除評論。如果刪除不頻繁,也可以在redis中保留這條記錄,在我們?nèi)ysql查詢時,會獲取不到結(jié)果。很多時候,你想篩選展現(xiàn)不同的數(shù)據(jù)表,使用多個redislist就可以了。每個list包含5000條,而redis用很少的內(nèi)存就可以存儲上百萬的記錄。排行榜和相關(guān)問題如果數(shù)據(jù)存儲在DB中,且每秒都有很多更新。要想實時的展現(xiàn)一個分?jǐn)?shù)排名榜,且要很好的性能,就會變得很困難。這個經(jīng)典例子就是在線游戲的排名榜,如Facebook游戲,但是這種類型適用于很多場景。在線游戲里,你會收到非常多的用戶分?jǐn)?shù)更新,利用這些分?jǐn)?shù),你想完成如下功能:展現(xiàn)排名前100的分?jǐn)?shù)展現(xiàn)用戶自己的排名即使你有數(shù)百萬用戶,每分鐘有數(shù)百萬的分?jǐn)?shù)更新,使用Redis的sortedset處理這類問題也很容易。處理方法:每當(dāng)收到一個新分?jǐn)?shù)時,就如下操作[cpp]

\o"viewplain"viewplain

\o"copy"copyZADD

leaderboard

<score>

<username>

得到前100用戶排名只需:ZREVRANGEleaderboard099告訴用戶自己的排名:ZREVRANKleaderboard<username>補:ZRANK/ZRANGE是從小到大排序,ZREVRANK/ZREVRANGE是從大到小排序你可以做的還有很多,如展示和用戶排名相近的分?jǐn)?shù):ZRANGEBYSCOREleaderboard500700根據(jù)用戶投票和時間排序上個例子是根據(jù)分?jǐn)?shù)排名,但是新聞網(wǎng)站會采用下面的公式排名新聞。[cpp]

\o"viewplain"viewplain

\o"copy"copyscore

=

points

/

time^alpha

用戶投票會相應(yīng)的提升排名,但是時間會指數(shù)式的拉低排名??梢园l(fā)現(xiàn)可以展現(xiàn)在首頁的新聞只可能在最新的新聞中選出(如最新的1000條),所以可以忽略其他的新聞:每當(dāng)提交一條新聞時,將ID增加到list中:LPUSH+LTRIM(保證1000條)啟動一個線程不斷的讀取list并計算最終的分?jǐn)?shù),然后使用zadd將結(jié)果存到sortedset中,同時將舊新聞從sortedset中清除在這個例子中,我們使用了保存1000條新聞、根據(jù)分?jǐn)?shù)排名的sortedset。這個sortedset可以支持每秒10萬次的查詢,很容易的適應(yīng)網(wǎng)站的規(guī)模數(shù)據(jù)過期sortedset的另一個用處可以用時間來索引數(shù)據(jù),如unixtime做為score。但是更好的使用我們可以用來過期主庫中的一些數(shù)據(jù):當(dāng)有新數(shù)據(jù)插入DB時,將它同時插入sortedset,用該數(shù)據(jù)應(yīng)該過期的時間做為score(current_time+time_to_live)后臺程序使用ZRANGE...WITHSCORES來去最新的10條,如果表示時間的score已經(jīng)過去了,我們就將這條數(shù)據(jù)從db中刪除計數(shù)使用INCRBY和其他類似的命令,Redis可以成為一個很好的計數(shù)器。很多時候,你想在db中新增計數(shù)器來統(tǒng)計新信息,但又不得不避免使用它,因為對于db來說它是個寫密集的任務(wù)。使用Redis就沒有這種顧忌了。原子自增實現(xiàn)計數(shù),GETSET原子性的獲得計數(shù)器當(dāng)前值并清零,設(shè)置有效期來達(dá)到只在規(guī)定時間內(nèi)進(jìn)行計數(shù)的目的。[cpp]

\o"viewplain"viewplain

\o"copy"copyINCR

user:<id>

EXPIRE

user:<id>

60

如上,你可以計數(shù)用戶60s內(nèi)看了多少網(wǎng)頁,如果達(dá)到20,你可以展現(xiàn)一些提示或者橫幅。固定時間內(nèi)單獨的N條數(shù)據(jù)統(tǒng)計一段時間內(nèi)瀏覽某資源的單獨用戶量,這個功能對于db很困難,但使用redis就很容易實現(xiàn)。例如,我想知道閱讀一篇文章的單獨注冊用戶數(shù)或者單獨IP數(shù)。每當(dāng)獲得一次頁面瀏覽時,只需要做:[cpp]

\o"viewplain"viewplain

\o"copy"copySADD

page:day1:<page_id>

<user_id>

day1可以用今天的第一秒(unixtime:time()-(time()%3600*24))。想知道單獨用戶數(shù)?SCARDpage:day1:<page_id>想知道某個用戶是否已經(jīng)看過該頁面?SISMEMBERpage:day1:<page_id>實時分析通過redis的各種命令和數(shù)據(jù)結(jié)構(gòu),可以很容易的實現(xiàn)大數(shù)據(jù)的實時統(tǒng)計,來增強反垃圾郵件系統(tǒng)或者用新信息來提高服務(wù)質(zhì)量。Pub/SubRedis的Pub/Sub非常簡單、穩(wěn)定、快速,而且支持模式匹配、動態(tài)訂閱/取消訂閱頻道等等。隊列你可能已經(jīng)注意到list的push/pop命令很適合用來實現(xiàn)隊列,當(dāng)list沒有元素時,你甚至可以使用BLPOP來阻塞POP命令。Redis做為隊列的使用可以參考Resque。list的RPOPLPUSH,sortedset等都可以實現(xiàn)很多有趣的隊列。緩存單單這部分就可以用一篇專門的博客來介紹。這里長話短說,Redis可以做為memcached的替代,讓你的cache更新更容易,數(shù)據(jù)管理更方便。Redis現(xiàn)在就可以修復(fù)你的問題現(xiàn)在就使用redis吧,會讓你的用戶更滿意,系統(tǒng)更

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論