redis的用途


很多小夥伴在花時間學習完redis數據庫後,很迷茫.感覺很空虛,不知道自己學習完這東西,能做點什麼.從而喪失了繼續學習的動力.爲了能夠讓大家在學習redis的道路上繼續前行.我覺得很有必要爲大家整理一份簡單實用的redis應用場景指南.

說明:

這篇指南是以工作場景爲背景,以項目爲引導,以redis基本命令爲驅動來展開的,讓你學習redis的應用場景就像讀故事一樣簡單,閱讀這些故事片段,你就能輕鬆掌握redis的基本應用場景,將其玩弄於鼓掌之上.

什麼人適合閱讀這篇文章?

熟悉redis的基本操作命令,理解nosql與sql之間的區別,但是糾結於學完redis我能拿它做什麼的初學者.

什麼人不適合閱讀本文?

1: 大牛,老牛

2: 對文字有密集恐懼症者

1. 獲取最新的n個數據

爲了讓小夥伴更好地理解,我這裏結合示例講解.

示例:

現在你在和訊網黃金頻道上班,項目經理讓你負責每天在頻道首頁生成一張數據表,來展示1個月內的國際黃金的開盤和收盤價格.如果我們從mysql數據庫中按時間排序取出,固然可以.但是你要考慮和訊網的併發量,和你排序時對資源的一個浪費程度.

這個時候我們選取redis的列表存取,就顯得很有必要了,我們知道redis有一種隊列(list)的數據結構,同時它還具備先進先出的特性.那這樣的話,我去最新的1個月的數據不就信手拈來麼.一個lrange命令即可簡單地取出你想要的區間的值.

2. 獲取 TOP N 的數據

接下來的這個例子,看標題,感覺跟第1中應用差不多,其實還是有差別的.應用1我們是利用列表的先進先出的特性,按存取時間來取,接下來我們的這個示例,就是利用有序集合的特性來解決實際問題.

現在你受僱於APPLESTORE,項目經理要求你在商店首頁,展示下載量排行前30的APP.

這個時候,你若能夠想到我們redis學習過程中,給大家講到的SortedSet有序集合,那就再好不過了.我們只需要將每個APP生成一個唯一的ID,將其作爲集合中成員member,下載數目作爲成員的score.那麼當你將這個score插入到有序集合中時,redis就會按其進行大小排序,自然有個有序的集合就形成了.最終你要取前N或者後N的數據,就在於你自己了.

3. 設置精準的搶購時間

設置搶購,促銷時間,這項技術在電商領域確實很實用.

現在你在阿里的淘寶事業部上班,領隊組長分配你來完成一個限時搶購活動,某商品中午10:00開始進行搶購,1小時後,活動結束.

咿呀,既然限時,要準確地1個小時結束.這個時候我們學習redis的過程中,講到的key的有效期就派上用場了.我們可以將某個活動的key的過期時間設置爲過期時刻的時間戳,用戶搶購的過程中併發是很高的.那麼這個時候提交的數據我們未必就需要立即存入我們的硬盤數據庫.用戶下單時我們獲取該活動的key是否過期,未過期,允許用戶下單,訂單數據暫時內存緩存.一旦該key失效,禁止用戶下單,同時,我們可以將剛纔併發的那麼多筆單進行硬盤數據庫的導入即可.一來實現了精準時間的設定,二來,應對了搶購的高併發量.

4. 輕鬆實現計數器

你目前就職的單位是中央全面深化改革領導小組技術顧問辦公室,在過去如果全國人民一起選代表,既浪費人力又浪費財力.現在網絡技術發展了,習近平組長交代由你牽頭開發點贊選人大平臺.

接到這個項目,你是不是很犯難,13億啊!可能同時集中在某個時間段,點贊,如此大的IO請求.硬盤數據庫多少有些力不從心.哎,這個時候你要運用上我們的內存數據庫系統了,redis中對key的增incre,減decr不正適合你的需求麼.

5. 去除重複值

去除重複值,聽起來很熟悉,我們的MySQL不是有unique索引嗎?哦,好吧,我要說的是我們redis中的對字符串的set命令更使用.

你現在在下廚房平臺,任職技術兼策劃.你準備收集天下美食,苦於不知菜名.網絡是有魔力的,人名羣衆的智慧是無窮的.你準備發動全國的網友們,爲你提供菜名,同時你還不想讓大家發出相同菜名.

看到如此問題,你是否還能想到我們之前在學習redis的字符串類型時,說到的set命令,我們講默認情況,不給其他參數時,如果我們的key不存在,則創建添加.如果key已經存在,則舊值覆蓋新值.既然如此,key值存在,則覆蓋.不正是我們需要的模型麼?

6. 利用set命令製作反垃圾系統

很多小夥伴,看到這,蒙了.一個破set命令什麼時候還能反垃圾了.咦,你應該腦洞大一些,再大一些.

上次你製作的統計菜名系統,領導會上先把你肯定了一番,然後義正言辭地說,小明啊,你這系統不太符合淨網行動的要求啊,有些網友把一些帶有明顯淫穢色情的菜名都提交到了系統.還被展示出來投票,這不荒唐嗎?

嚇的你一陣冷汗,這個時候你想到了在XX教育高性能架構班學習的同桌小胖.電話裏小胖告訴你,當我們使用set命令對字符串進行操作時,給它一個NX參數,這樣的話只有用戶提交的key不存在時,纔會對key進行操作.你去網上down一個敏感字彙字典,提前set入庫,不就可以實現反垃圾了麼.聽完小胖的指導,緊張的你如釋重負.

7. 利用發佈訂閱的中的SUBSCRIBE和PUBLISH命令構建實時消息推送系統

費了老鼻子勁,你終於進入了新浪微博事業部.第二天組長找到正埋頭苦幹的你.小明,咱們微博也要搞個跟FB一樣一樣的關注功能,搞大V認證,大V一發消息,趕緊推送給關注的那羣XX,讓XX跟大V趕緊互動起來.以此來提高用戶粘性.組長走後,”趕緊,推送”,這兩個詞在你的耳畔不時地迴響.

你又想到了小胖,小胖電話裏告訴你.redis裏有subscribe訂閱和publish發佈功能的.你掛了電話,去自學it網裏一搜索,果不其然.一個subscribe可以訂閱不同的用戶模型,只要對應的模型有publish實現,訂閱者即可實時收到,推送的消息.你雖然不是王大錘,但你也萬萬沒想到redis竟然有如此功能.O(∩_∩)O哈哈~

8. 構建隊列系統

忙完微博的事,正準備收拾東西去擠地鐵的你.突然被組長叫住了.

小明,你雖然完成了微博關注和推送的技術架構.但是這幾天又有個新問題出現了.因爲FB用不了,微博用戶暴增.特別是認證大V的用戶越來越多,就連門口烤紅薯的大爺早上還拽着我說,給他整個大V吧,俺不差錢.老闆爲了緩解認證方面的壓力,已經開始收費認證了,但是還是擋不住這羣XX.趕上過節飯點,大V們幾乎同時發微博,推送服務器有點壓力.你把這個問題解決了,再走吧,晚點回去打車公司報銷.然後打完卡他走了.

“同時發微博”,”同時推送,服務器壓力大”.你從電腦中找到了小胖之前發給你的那本redis自學筆記,筆記上說.我們可以將若干個需要執行的事件加入隊列,然後按時間的順序去逐個逐個的執行.這個時候你又想到了一個提高用戶互動性的好辦法.我能不能讓粉絲數目多的大V的微博優先推送呢?畢竟粉絲基數大,影響大,總能搞出一個大新聞.既然這樣,我直接使用有序隊列不就行了.把一個個大V的微博推送事件ID存入有序隊列,同時依據粉絲數給予權重(或說優先級).不就可以達到我們的需求了麼.

9. 緩存

這一點大家應該很熟悉了,它可以像memcache一樣充當緩存數據庫.不過的它的數據類型比memcache多的多,應對場景自然要比memcache豐富的多.比較時髦的用法是,用其來緩存會話哦.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章