做者好牛逼,我不懂的他全都懂。git
Redis: Zero to Master in 30 minutes - Part 2github
Part 1介紹了 Redis, 主要集中介紹了五種數據結構,而且介紹了你能夠怎樣使用它們。這部分咱們能夠開始用 Redis 作一個簡單的應用,表示咱們已經在 30 分鐘內精通了。(我根本還不知道是什麼嘛,我精通拼寫 Redis 了卻是真的)redis
開始以前,你應該注意一下, Redis 的 API 和大多數的不同。不是一般的 CRUD 四天王,Redis 有一堆專用方法。到目前爲止,咱們只看到了一小部分。咱們的應用也只會用到一小部分,一個通用的場景。一些你死也用不到的,或者你會我擦的方法,你要去查文檔。精通 Redis 又不是讓你把全部的方法都背下來(說的好!但是我仍是不懂啊...)。所謂的精通,(a) 理解五元素,(b)理解怎麼查詢數據模型,(c)結合 a 和 b來證實 Redis 的牛逼。數據庫
好了,咱們要作的是這樣的一個例子, jobs.openmymind.net。它上面的碼農崗位是從隨便從哪抓來的,而後顯示他們。完整的代碼在這裏。我先認可,用關係型數據庫或者文檔型數據庫會更直接。編程
保存崗位json
後臺線程用來運行和獲取各類的 json 和 RSS 服務,用來獲取崗位。咱們的方法會處理每一個崗位的字符串值。 Key 的格式將會是 job:SOURCE:SOURCE_ID。好比,咱們給 github 一個 1, 而後 http://jobs.github.com/positions/73c9e09a-09b0-11e1-9819-355783013ce0 上的工做的 key 將是 job:1:73c9e09a-09b0-11e1-9819-355783013ce0。值就是這個 key 對應的工做的詳細。數組
假設咱們把咱們的崗位解析成 hash,用 Redis 保存,看起來應該是這樣:數據結構
<!-- lang: js --> def save(job) key = "job:#{job[:source]}:#{job[:source_id]}" redis.set(key, job.to_json) end
這裏,咱們單純的想按照時間逆序顯示崗位。咱們不須要分頁,咱們只須要顯示最新的 X 個崗位。固然,咱們不能用上面的代碼來完成,咱們須要 keys ,而後按照日期排序。咱們第一個嘗試是簡單的用一個列表,就像咱們在 Part 1 中看到的:編程語言
<!-- lang: js --> def save(job) key = "job:#{job[:source]}:#{job[:source_id]}" redis.multi do #begins a transaction redis.set(key, job.to_json) redis.lpush('jobs', key) end end
嗯,這不是真的,由於咱們把崗位插到 Redis 的時間並不須要映射到這個崗位是何時建立的。這種方式會把崗位按照咱們處理它的時間排序,而不是崗位建立時間。解決方法是?用 Sorted set 取代 list:學習
<!-- lang: js --> def save(job) key = "job:#{job[:source]}:#{job[:source_id]}" redis.multi do redis.set(key, job.to_json) redis.zadd('jobs', job[:created_at], key) # :created_at is already an integer (seconds since ..) end end
嗯,若是咱們已經保存了崗位咋辦?事實證實,毫無問題。咱們只要重設一下咱們的崗位字符串(其實是有變化的崗位詳細內容),而後,咱們用這個 Set 的時候,能夠從新把 Key 加到 Set 裏面去。
嗯,稍後咱們再繼續這個,總的來講,這是個很好的開端。
列出崗位
咱們不單止保存每一個崗位,一樣的咱們也排序崗位的 key。從這裏面拿到崗位內容顯示就不難了:
<!-- lang: js --> def get_latest_jobs keys = redis.zrevrange('jobs', 0, 150) jobs = redis.mget(*keys) jobs.map do |j| job = JSON.parse(j) job['created_at'] = Time.at(job['created_at']) job end end
把集合按照從小到大來排序。意思是說,越新的數據有越高的權重(從1970到今天的毫秒數比到1980的毫秒數多...)。若是咱們那前面的150條數據(用 zrange)咱們將會拿到最老的150個崗位。咱們但願拿最近的最新的150個崗位,那些咱們有高權重的。所以咱們用 zrevrange(取反)。
咱們從 set 裏面拿到的是一個 key 的數組。咱們用 mget 來獲取實際的崗位值(要作反序列化)。若是你不懂 Ruby, 那個用在 mget 方法裏面的 ***** 號其實是把數組轉變爲了參數(擼逼們常常這樣乾的)。(那不是指針符號麼,這是取地址的意思吧)。
嗯,就是這樣。
清理崗位
由於咱們只要顯示最新的150個崗位,咱們不必保存一堆舊的。內存就是錢啊。咱們要作的就是把那些舊崗位從集合裏面清除出去,刪除 key。讓咱們來看看怎麼作的:
<!-- lang: js --> redis.multi do keys = redis.zrange('jobs', 0, -300) redis.del(*keys) redis.zrem('jobs', *keys) end
顯而易見,這裏是把 0 到 -300 的數據都清理掉。注意咱們在這裏用的是 zrange 。意思是說,低權重優先(也就是剛纔咱們存的老崗位)。好比說咱們有 500 個崗位,咱們將會把 1-200(即500-300)刪除。由於咱們只顯示 150 個崗位,咱們能夠用 -150。 不過仍是保持一個緩衝,以防不測。
或者,咱們也能夠用 EXPIRE 這個 key-command 來讓 Redis 自動刪除老崗位(好比說,十日前)。固然,須要對咱們的集合來處理,你不能處理單獨的記錄,記住,咱們應該有大局觀。
Twitter Integration
Redis 有很是棒的發佈訂閱 API。而且它有很是讚的庫,好比說 Resque 用來構建 Redis 的隊列。咱們來作個很是基礎的例子。
當咱們有一個新崗位的時候,咱們會把 key 加到 list 中。所以,保存一個崗位,應該看起來像這樣:
<!-- lang: js --> def save(job) key = "job:#{job[:source]}:#{job[:source_id]}" if !redis.exists(key) redis.rpush('jobs:new', key) end redis.multi do redis.set(key, job.to_json) redis.zadd('jobs', job[:created_at], key) end end
而後咱們在後臺能夠這樣 pop 他們:
<!-- lang: js --> def get_new_job key = redis.lpop('jobs:new') key ? JSON.parse(redis.get(key)) : nil end
嗯,不強壯,不過實現了需求。
以上
也許你還沒以爲你精通了 Redis(你特麼逗我麼?精通?!)。事實上,你還有許多須要學習的。但願經過此次學習,你有足夠好的基礎去開始你本身的 Redis 之旅。
裝 Redis 有幾種方式。它能夠在許多包管理上找到(好比說 brew),或者你能夠下載源碼。 Windows 用戶能夠經過這篇文章(我就是這樣作的)。下載以後,你就能夠經過 redis-server 來開啓你的服務了。而後經過 redis-cli 啓動客戶端。你能夠下載你所喜歡的編程語言的客戶端。
或者,你能夠試試在線教程。
最後,若是你對 Redis 模型討論感興趣,你可能對個人這兩篇文章感興趣:
若是你對更復雜的實際應用感興趣的話,看這裏: LamerNews
★差評!差評!我花了一下午都沒精通!