Redis使用總結-基礎篇

來源:互聯網
上載者:User

標籤:

年底的時候開始嘗試在重構的項目中使用redis,現在項目穩定運行也有一段時間了,這裡做一下階段性總結。

一、簡介

首先,redis是什麼意思呢,官方文檔的FAQ裡給出了答案:It means REmote DIctionary Server.也就是說,它是一個可提供遠程調用的字典伺服器,從名字就可以看出,它起碼得是一個k-v伺服器吧:),事實上,它除了支援get、set、del等基本操作之外,還支援許多更複雜一些的操作,這也是它優於memcached等其他k-v組件的地方。

Redis是一個進階的k-v伺服器,既可以做cache使用,也可以做儲存使用,同時,它也可以被稱作是一個資料結構伺服器。為什麼說它可以叫資料結構伺服器呢?因為它支援幾種資料結構,作為key-value裡的value這一項,它可以儲存strings, hashes, lists, sets, sorted sets, bitmaps以及hyperloglogs等資料結構,同時,針對不同的資料結構,Redis專門提供了一些特別的操作,使得我們可以使用get set之外的一些操作,例如你可以對兩個set取交集並返回結果。

二、安裝和啟動

Redis的安裝非常簡單,從官網下載最新的穩定版用戶端,make就可以了:

$ wget http://download.redis.io/releases/redis-2.8.19.tar.gz$ tar xzf redis-2.8.19.tar.gz$ cd redis-2.8.19$ make

 

啟動也非常簡單,編譯好的二進位檔案會產生在src目錄下,直接執行,即可使用預設配置啟動redis服務:

$ src/redis-server

 

         這樣服務就啟動起來了,redis預設監聽6379連接埠,我們可以使用用戶端(redis-cli)訪問並測試它:

$ src/redis-cliredis> set foo barOKredis> get foo"bar"

 

更複雜的配置設定我們在後邊再介紹。

三、基本使用舉例

         想要快速瞭解redis的使用方法,強烈推薦官網的一篇文章Writing a simple Twitter clone with PHP and Redis(http://redis.io/topics/twitter-clone),如果不熟悉php文法沒有關係,php的client基本上就是把redis的命令原封不動的封裝了,該文章從實戰的角度描述了幾種資料結構的使用方法以及在實際使用過程中應該如何設計自己的儲存方式。這裡我們簡單介紹幾種資料結構的使用方法:

3.1 string

         String是最基本的資料結構了,如果單純的使用string,那麼redis與普通的k-v資料庫並無區別,無非就是get、set,下面我們看一下string的基本操作:

> set mykey somevalueOK> get mykey"somevalue"

當執行set的時候,如果”mykey”這個key下原來沒有值,則會把”somevalue”存進去,否則下儲存的值會被覆蓋。

如果只提供get、set,那redis就不是redis了,對於一個key,我們還可以使用INCR,DECR來使數實值型別的值增加或減少,還有MGET命令,可以同時擷取多個key的值,這在實際使用過程中都會非常有用,例如當你需要同時擷取多個數值時,只要一次調用MGET即可,大幅減少網路開銷。

3.2 hashes

         接下來我們看hash,第一反應,我們可能會想,剛才的string不就是hash嗎,從key映射到value。事實上,redis這裡說的hash,相當於是對於剛才的string形式的一種嵌套,相當於是我們有一個hash的對象,這個對象的名字叫做key,而它的值又是一個hash,而它的值的key,在redis裡叫做field,那麼我們就可以瞭解hash的插入資料的命令了:

> hset user:1000 usernameOK> hget user:1000 username"antirez"

Hash也可以同時寫入多個值,使用HMSET命令即可:

> hmset user:1000 username antirez birthyear 1977 verified 1OK

類似的,同時讀取多個值的時候也可以用HMGET命令,但是需要注意的是使用HMGET擷取的時候,一次只能讀取同一個key下的多個field值,而不能擷取不同的key下的不同field值,如果想擷取不同key下不同field值,可以使用redis的pipeline方式擷取,從而減少開銷。

3.3 sorted sets

         Sorted set是一種進階的set,redis本身也支援set,但是我們這裡直接講sorted set吧,它相比普通的set,多了一個score項,也即當插入資料的時候,每一個值都可以賦予它一個score,那麼score是做什麼用的呢?sorted set,顧名思義,就是可以根據score進行排序了,當我們取出來的時候就可以看到,這個列表是排好序的,這個功能非常的有用,例如當我們想要開發一個熱門排行榜的時候,直接插入榜單項和排名分數就可以了,亦或是要開發一個微博系統時,使用它來儲存timeline,使用訊息發表時間作為score,那麼timeline自然就是排好序的了,而且再利用redis本身提供的取交集或並集功能,這使得業務層的開發量極大的減少,下面我們看一下命令樣本:

> zadd hackers 1940 "Alan Kay"(integer) 1> zadd hackers 1957 "Sophie Wilson"(integer 1)> zadd hackers 1953 "Richard Stallman"(integer) 1> zadd hackers 1949 "Anita Borg"(integer) 1> zadd hackers 1965 "Yukihiro Matsumoto"(integer) 1> zadd hackers 1914 "Hedy Lamarr"(integer) 1> zadd hackers 1916 "Claude Shannon"(integer) 1> zadd hackers 1969 "Linus Torvalds"(integer) 1> zadd hackers 1912 "Alan Turing"(integer) 1

讀取的時候使用ZRANGE或者ZREVRANGE,顧名思義就是正序或反序讀取:

> zrange hackers 0 -1 withscores

1) "Alan Turing"

2) "1912"

3) "Hedy Lamarr"

4) "1914"

5) "Claude Shannon"

6) "1916"

7) "Alan Kay"

8) "1940"

9) "Anita Borg"

10) "1949"

11) "Richard Stallman"

12) "1953"

13) "Sophie Wilson"

14) "1957"

15) "Yukihiro Matsumoto"

16) "1965"

17) "Linus Torvalds"

18) "1969"

其中withscores是告訴redis是否要返回score項,如果不帶此參數則只返回人名列表,非常的方便。

3.4 小結

         Redis提供非常豐富的命令可供使用,使得我們可以很方便的對儲存資料進行一些進階的操作,而不是僅僅把它當作一個k-v的儲存資料,這樣可以從一定程度上減少我們的業務複雜性。

Redis命令可以在官網查詢到(http://redis.io/commands),在此不一一列舉。

四、配置與部署

4.1 持久化

         Redis提供兩種持久化的方式,使得資料可以落到磁碟上,避免服務崩潰或者機器重啟後資料丟失,它們分別是AOF和RDB。

         AOF相當於我們服務中通常使用的binlog,每當有寫請求過來的時候,redis都會把這個請求寫入到AOF檔案中,當redis崩潰時,可以讀取AOF檔案從而重建資料。

         RDB又叫snapshoting,也就是快照,相當於我們服務中經常用到的把資料從共用記憶體dump到磁碟上的操作。

         這兩個選項均可以在設定檔中配置,redis提供了一個設定檔模版,在redis檔案夾下的redis.conf檔案,當使用設定檔啟動redis時,在redis後邊加一個設定檔的參數即可:

         src/redis-cli redis.conf

         想要開啟AOF功能,則可以修改設定檔中的appendonly項為yes,並指定appendfilename為aof的檔案名稱,注意這裡只是設定檔名,檔案路徑需要修改dir配置項,這個配置項同樣應用於RDB檔案。

         RDB功能是預設開啟的,它受設定檔中的save項影響:

save 900 1save 300 10save 60 10000

 

這裡解釋一下這幾個選項的意思:SAVE N M代表每N秒至少有M個變化的時候,才進行rdb操作,那麼上邊的三個選項意思是,當60秒內有10000個變化時,就寫磁碟,而當300秒內有10個變化時,也要寫磁碟,如果寫入實在不頻繁,那麼900秒內,如果有一個變化,也要寫一次。

除了自動化的方式,我們也可以手動調用BGSAVE命令,強制執行資料備份,但是這個命令從字面上來看貌似是background的,但是實際上,也會造成服務阻塞!

需要注意的是,AOF功能可以開啟壓縮機制,當AOF檔案過大時,可以進行壓縮;但是這個操作是會阻塞進程的,所以謹慎使用!RDB檔案也是同樣,當執行寫RDB操作時,進程也是阻塞的,這兩個地方是redis比較讓人頭疼的地方,目前並沒有發現太完美的解決方案。

4.2 主備同步

         主備同步的設定比較簡單,在設定檔中配置slavof選項:

         slaveof <masterip> <masterport>

         redis啟動的時候就會跟主機建立串連,然後主機會把資料同步過來,但是要注意的是,這個過程也是阻塞的,服務在這個時間內也不可訪問。

4.3 小結

         Redis提供了簡單的持久化的方式,但是它阻塞的方式往往會造成一定時間內的服務不可用,所以在選型的時候要結合自己的業務情況再做決定應該使用怎樣的配置。

Redis使用總結-基礎篇

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.