Redis使用手冊

suifeng3051發表於2014-08-18

給公司整理了一個簡單的Redis使用手冊,其中很多部分也是參考的他人的資料,在這裡分享一下~ 

 

Redis調研及使用文件


1  引言

隨著業務的增長和產品的完善,急速增長的資料給Oracle資料庫帶來了很大的壓力,而隨著我們對產品服務質量要求的提高,傳統的資料查詢方式已無法滿足我們需求。為此我們需要尋找另外一種模式來提高資料查詢效率。NoSQL記憶體資料庫是最近興起的新型資料庫,它的特點就是把資料放在記憶體中操作,資料處理速度相對於磁碟提高了好幾個量級,因此,通過把經常訪問的資料轉移到記憶體資料庫中,不但可以緩解Oracle的訪問壓力,而且可以極大提高資料的訪問速度,提高使用者體驗。

2  概述

Redis是一個開源的,先進的key-value持久化產品。它通常被稱為資料結構伺服器,它的值可以是字串(String)、雜湊(Map)、列表(List)、集合(Sets)和有序集合(Sorted sets)等型別。可以在這些型別上面做一些原子操作,如:字串追加、增加Hash裡面的值、新增元素到列表、計算集合的交集,並集和差集;或者區有序集合中排名最高的成員。為了取得好的效能,Redis是一個記憶體型資料庫。不限於此,Redis也可以把資料持久化到磁碟中,或者把資料操作指令追加了一個日誌檔案,把它用於持久化。也可以用Redis容易的搭建master-slave架構用於資料複製。其它讓它像快取的特性包括,簡單的check-and-set機制,pub/sub和配置設定。Redis可以用大部分程式語言來操作:C、C++、C#、Java、Node.js、php、ruby等等。Redis是用ANSIC寫的,可以執行在多數POSIX系統,如:Linux,*BSD,OS
X和Soloris等。官方版本不支援Windows下構建,可以選擇一些修改過的版本,照樣可以使用Redis。

3  Redis介紹

3.1     五種資料型別

3.1.1         String型別

String是最基本的型別,而且string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如 jpg 圖片或者序列化的物件。從內部實現來看其實 string 可以看作 byte 陣列,最大上限是 1G 位元組。

string型別資料操作指令簡介

1.        set keyvalue設定key對應string型別的值,返回1表示成功,0失敗。

2.        setnx keyvalue如果key不存在,設定key對應string型別的值。如果key已經存在,返回0。

3.        get key獲取key對應的string值,如果key不存在返回nil

4.        getsetkey value先獲取key的值,再設定key的值。如果key不存在返回nil。

5.        mget key1key2 …… keyN一次獲取多個key的值,如果對應key不存在,則對應返回nil

6.        mset key1value1 …… keyN valueN一次設定多個key的值,成功返回1表示所有的值都設定了,失敗返回0表示沒有任何值被設定。

7.        msetnxkey1 value1 …… keyN valueN一次設定多個key的值,但是不會覆蓋已經存在的key incr key 對key的值做++操作,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設定key值為1。

8.        decr key: 對key的值做–操作,decr一個不存在key,則設定key值為-1。

9.        incrbykey integer對key加上指定值,key不存在時候會設定key,並認為原來的value 是0。

10.    decrbykey integer對key減去指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。

3.1.2         hash型別

hash是一個string型別的field和value的對映表。新增,刪除操作都是O(1)(平均)。 hash特別適合用於儲存物件。相對於將物件的每個欄位存成單個string型別。將一個物件儲存在hash型別中會佔用更少的記憶體,並且可以更方便的存取整個物件。省記憶體的原因是新建一個hash物件時開始是用 zipmap(又稱為 small hash)來儲存的。這個 zipmap 其實並不是hashtable,但是zipmap相比正常的hash實現可以節省不少hash本身需要的一些後設資料儲存開銷。儘管zipmap的新增,刪除,查詢都是
O(n),但是由於一般物件的field 數量都不太多。所以使用zipmap也是很快的,也就是說新增刪除平均還是O(1)。如果field 或者 value的大小超出一定限制後,redis會在內部自動將zipmap替換成正常的hash實現.這個限制可以在配置檔案中指定。

hash型別資料操作指令簡介

1.        hset keyfield value 設定hash field為指定值,如果key不存在,則建立。

2.        hget keyfield 獲取指定的hash field。

3.        hmget keyfiled1….fieldN 獲取全部指定的hash filed。

4.        hmset keyfiled1 value1 …… filedN valueN 同時設定hash的多個field。

5.        hincrbykey field integer 將指定的hashfiled 加上指定值。成功返回hashfiled變更後的值。

6.        hexistskey field 檢測指定field是否存在。 hdelkey field 刪除指定的hash field。

7.        hlen key 返回指定hash的field數量。 hkeys key 返回hash的所有field。

8.        hvals key 返回hash的所有value。

9.        hgetall 返回hash的所有filed和value。

3.1.3         List型別

list是一個連結串列結構,可以理解為一個每個子元素都是 string 型別的雙向連結串列。主要功

能是push、pop、獲取一個範圍的所有值等。操作中key理解為連結串列的名字。

List型別資料操作指令簡介

1.        lpush keystring 在key對應list的頭部新增字串元素,返回1表示成功,0表示key存在且不是list型別。

2.        rpush keystring 在key對應list的尾部新增字串元素。

3.        llen key 返回key對應list的長度,如果key不存在返回0,如果key對應型別不是list 返回錯誤。

4.        lrangekey start end 返回指定區間內的元素,下標從0開始,負值表示從後面計算,-1表示倒數第一個元素 ,key不存在返回空列表。

5.        ltrim keystart end 擷取list指定區間內元素,成功返回1,key不存在返回錯誤。

6.        lset keyindex value 設定list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤。

7.        lrem keycount value 從 List 的頭部(count正數)或尾部(count負數)刪除一定數量(count)匹配value的元素,返回刪除的元素數量。count為0時候刪除全部。

8.        lpop key 從list的頭部刪除並返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤。

9.        rpop key從list的尾部刪除並返回刪除元素。

10.    blpopkey1 …… keyN timeout 從左到右掃描,返回對第一個非空list進行lpop操作並返回,比如blpop list1 list2 list3 0 ,如果list不存在list2,list3都是非空則對list2做 lpop並返回從list2中刪除的元素。如果所有的list都是空或不存在,則會阻塞timeout秒,timeout為0表示一直阻塞。當阻塞時,如果有client對key1…keyN中的任意key
進行push操作,則第一在這個key上被阻塞的client會立即返回。如果超時發生,則返回 nil。有點像unix的select或者poll。

11.    brpop 同blpop,一個是從頭部刪除一個是從尾部刪除。

3.1.4         Set型別

set是無序集合,最大可以包含(2的 32 次方-1)個元素。set 的是通過 hash table 實現的,所以新增,刪除,查詢的複雜度都是 O(1)。hash table 會隨著新增或者刪除自動的調整大小。需要注意的是調整 hash table 大小時候需要同步(獲取寫鎖)會阻塞其他讀寫操作。可能不久後就會改用跳錶(skip list)來實現。跳錶已經在 sorted sets 中使用了。關於 set 集合型別除了基本的新增刪除操作,其它有用的操作還包含集合的取並集(union),交集(intersection),差集(difference)。通過這些操作可以很容易的實現
SNS 中的好友推薦和 blog 的 tag 功能。

 set型別資料操作指令簡介

1.        sadd keymember 新增一個string元素到key對應set集合中,成功返回1,如果元素以及在集合中則返回0,key對應的set不存在則返回錯誤。

2.        srem keymember 從key對應set中移除指定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對應的不是set型別的值返回錯誤。

3.        spop key 刪除並返回key對應set中隨機的一個元素,如果set是空或者key不存在返回 nil。

4.        srandmemberkey 同spop,隨機取set中的一個元素,但是不刪除元素。

5.        smovesrckey dstkey member 從srckey對應set中移除member並新增到dstkey對應set中,整個操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set 型別返回錯誤。

6.        scard key 返回set的元素個數,如果set是空或者key不存在返回0。

7.        sismemberkey member 判斷member是否在set中,存在返回1,0表示不存在或者key不存在。

8.        sinterkey1 key2 …… keyN 返回所有給定key的交集。

9.        sinterstoredstkey key1 ……. keyN 返回所有給定key的交集,並儲存交集存到dstkey下。

10.    sunionkey1 key2 …… keyN 返回所有給定key的並集。

11.    sunionstoredstkey key1 …… keyN 返回所有給定key的並集,並儲存並集到dstkey下。

12.    sdiffkey1 key2 …… keyN 返回所有給定key的差集。

13.    sdiffstoredstkey key1 …… keyN 返回所有給定key的差集,並儲存差集到dstkey下。

14.    smemberskey 返回key對應set的所有元素,結果是無序的。

3.1.5         Sorted Set

sorted set是有序集合,它在set的基礎上增加了一個順序屬性,這一屬性在新增修改元素的時候可以指定,每次指定後,會自動重新按新的值調整順序。可以理解了有兩列的 mysql表,一列存value,一列存順序。操作中key理解為sorted set的名字。

Sorted Set型別資料操作指令簡介

1.        add keyscore member 新增元素到集合,元素在集合中存在則更新對應score。

2.        zrem keymember 刪除指定元素,1 表示成功,如果元素不存在返回 0。

3.        zincrbykey incr member 增加對應 member 的 score 值,然後移動元素並保持skip list 保持有序。返回更新後的 score 值。

4.        zrank keymember 返回指定元素在集合中的排名(下標),集合中元素是按 score 從小到大排序的。

5.        zrevrankkey member 同上,但是集合中元素是按score 從大到小排序。

6.        zrangekey start end 類似 lrange 操作從集合中去指定區間的元素。返回的是有序結果

7.        zrevrangekey start end 同上,返回結果是按 score 逆序的。

8.        zrangebyscorekey min max 返回集合中 score 在給定區間的元素。

9.        zcountkey min max 返回集合中 score 在給定區間的數量。

10.    zcard key 返回集合中元素個數。

11.    zscorekey element 返回給定元素對應的 score。

12.    zremrangebyrankkey min max 刪除集合中排名在給定區間的元素。

13.    zremrangebyscorekey min max 刪除集合中 score 在給定區間的元素。

3.2     Redis主從複製

3.2.1         主從複製介紹

Redis支援將資料同步到多臺從庫上,這種特性對提高讀取效能非常有益。master可以有多個slave。除了多個slave連到相同的master外,slave也可以連線其它slave形成圖狀結構。主從複製不會阻塞master。也就是說當一個或多個slave與master進行初次同步資料時,master可以繼續處理客戶端發來的請求。相反slave在初次同步資料時則會阻塞不能處理客戶端的請求。

主從複製可以用來提高系統的可伸縮性,我們可以用多個slave 專門用於客戶端的讀請求,比如sort操作可以使用slave來處理。也可以用來做簡單的資料冗餘。可以在 master 禁用資料持久化,只需要註釋掉 master 配置檔案中的所有 save 配置,然後只在 slave 上配置資料持久化。

3.2.2         主從複製過程

當設定好 slave 伺服器後,slave 會建立和 master 的連線,然後傳送 sync命令。無論是第一次同步建立的連線還是連線斷開後的重新連線,master 都會啟動一個後臺程式,將資料庫快照儲存到檔案中,同時 master 主程式會開始收集新的寫命令並快取起來。後臺程式完成寫檔案後,master 就傳送檔案給 slave,slave 將檔案儲存到磁碟上,然後載入到記憶體恢復資料庫快照到 slave 上。接著 master 就會把快取的命令轉發給 slave。而且後續 master 收到的寫命令都會通過開始建立的連線傳送給slave。從master到slave的同步資料的命令和從客戶端傳送的命令使用相同的協議格式。當
master 和 slave 的連線斷開時 slave 可以自動重新建立連線。如果 master 同時收到多個 slave 發來的同步連線命令,只會啟動一個程式來寫資料庫映象,然後傳送給所有 slave。

配置 slave伺服器很簡單,只需要在配置檔案中加入如下配置

slaveof  192.168.1.1 6379     #指定 master的 ip 和埠。

3.3     Redis持久化

通常Redis將資料儲存在記憶體中或虛擬記憶體中,但它提供了資料持久化功能可以把記憶體中的資料持久化到磁碟。持久化有什麼好處呢?比如可以保證斷電後資料不會丟失,升級伺服器也會變得更加方便。Redis提供了兩種資料持久化的方式。

3.3.1         RDB Snapshotting方式持久化(預設方式)

這種方式就是將記憶體中資料以快照的方式寫入到二進位制檔案中,預設的檔名為 dump.rdb。客戶端也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主執行緒中儲存快照的,由於redis是用一個主執行緒來處理所有客戶端的請求,這種方式會阻塞所有客戶端請求。所以不推薦使用。另一點需要注意的是,每次快照持久化都是將記憶體資料完整寫入到磁碟一次,並不是增量的只同步增量資料。如果資料量大的話,寫操作會比較多,必然會引起大量的磁碟IO操作,可能會嚴重影響效能。

這種方式的缺點也是顯而易見的,由於快照方式是在一定間隔時間做一次的,所以如果 redis 意外當機的話,就會丟失最後一次快照後的所有資料修改。

3.3.2         AOF方式持久化

這種方式 redis 會將每一個收到的寫命令都通過 write 函式追加到檔案中(預設 appendonly.aof)。當redis重啟時會通過重新執行檔案中儲存的寫命令來在記憶體中重建整個資料庫的內容。當然由於作業系統會在核心中快取write做的修改,所以可能不是立即寫到磁碟上。這樣的持久化還是有可能會丟失部分修改。不過我們可以通過配置檔案告訴 redis我們想要通過fsync函式強制作業系統寫入到磁碟的時機。有三種方式如下(預設是:每秒fsync一次)

appendonly  yes     //啟用日誌追加持久化方式

1.        appendfsync always     //每次收到寫命令就立即強制寫入磁碟,最慢的,但是保證完全持久化,不推薦使用。

2.        appendfsync everysec //每秒鐘強制寫入磁碟一次,在效能和持久化方面做了很好的折中,推薦使用。

3.        appendfsync no    //完全依賴作業系統,效能最好,持久化沒保證。

日誌追加方式同時帶來了另一個問題。持久化檔案會變的越來越大。例如我們呼叫 incr test 命令 100 次,檔案中必須儲存全部 100 條命令,其實有 99 條都是多餘的。因為要恢復資料庫狀態其實檔案中儲存一條 set test 100 就夠了。為了壓縮這種持久化方式的日誌檔案。 redis 提供了 bgrewriteaof 命令。收到此命令 redis 將使用與快照類似的方式將記憶體中的資料以命令的方式儲存到臨時檔案中,最後替換原來的持久化日誌檔案。

3.4     Redis虛擬記憶體

3.4.1         虛擬記憶體介紹

首先說明下redis的虛擬記憶體與作業系統虛擬記憶體不是一碼事,但是思路和目的都是相同的。就是暫時把不經常訪問的資料從記憶體交換到磁碟中,從而騰出寶貴的記憶體空間。對於 redis這樣的記憶體資料庫,記憶體總是不夠用的。除了可以將資料分割到多個redis 伺服器以外。另外的能夠提高資料庫容量的辦法就是使用虛擬記憶體技術把那些不經常訪問的資料交換到磁碟上。如果我們儲存的資料總是有少部分資料被經常訪問,大部分資料很少被訪問,對於網站來說確實總是隻有少量使用者經常活躍。當少量資料被經常訪問時,使用虛擬記憶體不但能提高單臺redis資料庫伺服器的容量,而且也不會對效能造成太多影響。

redis沒有使用作業系統提供的虛擬記憶體機制而是自己在使用者態實現了自己的虛擬內

存機制。主要的理由有以下兩點,作業系統的虛擬記憶體是以4k/頁為最小單位進行交換的。而redis的大多數物件都遠小於4k,所以一個作業系統頁上可能有多個redis物件。另外redis的集合物件型別如 list,set可能存在於多個作業系統頁上。最終可能造成只有10%的key被經常訪問,但是所有作業系統頁都會被作業系統認為是活躍的,這樣只有記憶體真正耗盡時作業系統才會進行頁的交換。相比作業系統的交換方式。redis可以將被交換到磁碟的物件進行壓縮,儲存到磁碟的物件可以去除指標和物件後設資料資訊。一般壓縮後的物件會比記憶體中的物件小
10倍。這樣redis的虛擬記憶體會比作業系統的虛擬記憶體少做很多IO操作。

3.4.1         虛擬記憶體相關設定

vm-enabled  yes    開啟虛擬記憶體功能

vm-swap-file  /tmp/redis.swap     交換出來value儲存的檔案路徑/tmp/redis.swapvm-max-memory268435456  redis使用的最大記憶體上限(256MB),超過上限後
redis開始交換value到磁碟swap檔案中。建議設定為系統空閒記憶體的60 %-80%

vm-page-size  32  每個redis頁的大小32個位元組

vm-pages  134217728  最多在檔案中使用多少個頁,交換檔案的大小 =(vm-page-size* vm-pages)4 GB

vm-max-threads  8 用於執行value物件換入換出的工作執行緒數量。0 表示不使用工作執行緒

3.5     Redis叢集

Redis最新穩定版還不支援叢集,會在以後的V3.0提供叢集功能,現在進度是V3.0已經發布Beta-7版,計劃今年年底正式推出穩定版。Redis提供了Partitioning(類似於Memcached在客戶端進行Hash對映)機制以支援多例項,下面介紹下Partitioning目標:

1.        突破了單一計算機記憶體限制,可以利用到多個計算機的記憶體和

2.        通過配置多個計算機來擴充計算能力,解決網路、網路卡瓶頸 

Partitioning支援:

1.        通過Client端實現Partitioning,即Client端在讀寫資料的時候根據自己的選擇演算法自動選擇合適的Redis例項

2.        代理Partitioning,即客戶端把讀寫請求發到代理,由來自選擇合適的例項,twitter為Redis和Memcached專門寫了一個代理 Twemproxy

3.        查詢時自動routing:客戶端隨機傳送命令到任何一個例項,這個例項會把請求轉發給合適的例項,這個功能現在還不支援,3.0版本實現的叢集功能支援

3.6     其它參考資料

所有特性請參考:http://redis.io/documentation

所有命令請參考:http://redis.io/commands#sorted_set

4  環境安裝

4.1 下載、解壓、安裝

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

 

4.2 啟動Redis例項

$ src/redis-server

 

4.3 通過內建客戶端進行測試

$ src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"
具體請參考:http://redis.io/download    

5  配置檔案

1.        Redis預設不是以守護程式的方式執行,可以通過該配置項修改,使用yes啟用守護程式

daemonize yes

2.        當Redis以守護程式方式執行時,Redis預設會把pid寫入/var/run/redis.pid檔案,可以通過pidfile指定

pidfile/usr/local/redis/var/redis.pid

3.        指定Redis監聽埠,預設埠為6379,作者在自己的一篇博文中解釋了為什麼選用6379作為預設埠,因為6379在手機按鍵上MERZ對應的號碼,而MERZ取自義大利歌女Alessia Merz的名字。

port 6379

4.        繫結的主機地址

bind 127.0.0.1

5.        當客戶端閒置多長時間後關閉連線,如果指定為0,表示關閉該功能

timeout 0

6.        對客戶端傳送ACK資訊,linux中單位為秒

tcp-keepalive 0

7.        指定日誌記錄級別,Redis總共支援四個級別:debug、verbose、notice、warning,預設為notice

loglevel notice

8.        日誌記錄位置,預設為標準輸出

logfile/usr/local/redis/var/redis.log

9.        設定資料庫的數量,預設資料庫為0,可以使用SELECT 命令在連線上指定資料庫id

databases 16

10.    指定在多長時間內,有多少次更新操作,就將資料同步到資料檔案,可以多個條件配合

Save分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。

Redis預設配置檔案中提供了三個條件:

save 900 1

save 300 10

save 60 10000

11.    持久化失敗以後,redis是否停止

stop-writes-on-bgsave-erroryes

12.    指定儲存至本地資料庫時是否壓縮資料,預設為yes,Redis採用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致資料庫檔案變的巨大

rdbcompression yes

rdbchecksum yes

13.    指定本地資料庫檔名,預設值為dump.rdb

dbfilename dump.rdb

14.    指定本地資料庫存放目錄

dir /usr/local/redis/var

 

15.    設定當本機為slave服務時,設定master服務的IP地址及埠,在Redis啟動時,它會自動從master進行資料同步

 slaveof

16.    當master服務設定了密碼保護時,slave服務連線master的密碼

 masterauth

17.    設定Redis連線密碼,如果配置了連線密碼,客戶端在連線Redis時需要通過AUTH 命令提供密碼,預設關閉

 requirepass foobared

18.    設定同一時間最大客戶端連線數,在 Redis2.4中,最大連線數是被直接硬編碼在程式碼裡面的,而在2.6版本中這個值變成可配置的。maxclients 的預設值是 10000,你也可以在 redis.conf 中對這個值進行修改。當然,這個值只是 Redis 一廂情願的值,Redis 還會照顧到系統本身對程式使用的檔案描述符數量的限制。在啟動時 Redis 會檢查系統的 soft limit,以檢視開啟檔案描述符的個數上限。如果系統設定的數字,小於我們們希望的最大連線數加32,那麼這個 maxclients
的設定將不起作用,Redis 會按系統要求的來設定這個值。(加32是因為 Redis 內部會使用最多32個檔案描述符,所以連線能使用的相當於所有能用的描述符號減32)。當上面說的這種情況發生時(maxclients 設定後不起作用的情況),Redis 的啟動過程中將會有相應的日誌記錄。比如下面命令希望設定最大客戶端數量為10000,所以 Redis 需要 10000+32 個檔案描述符,而系統的最大檔案描述符號設定為10144,所以 Redis 只能將maxclients 設定為 10144 – 32 =
10112。

 maxclients 10000

19.    指定Redis最大記憶體限制,Redis在啟動時會把資料載入到記憶體中,達到最大記憶體後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理後,仍然到達最大記憶體設定,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放記憶體,Value會存放在swap區

 maxmemory

slave-serve-stale-data yes

slave-read-only yes

repl-disable-tcp-nodelay no

slave-priority 100

20.    指定是否在每次更新操作後進行日誌記錄,Redis在預設情況下是非同步的把資料寫入磁碟,如果不開啟,可能會在斷電時導致一段時間內的資料丟失。因為Redis本身同步資料檔案是按上面slave條件來同步的,所以有的資料會在一段時間內只存在於記憶體中。預設為no

appendonly no

21.    指定更新日誌檔名,預設為appendonly.aof

 appendfilename appendonly.aof

22.    指定更新日誌條件,共有3個可選值:

no表示等作業系統進行資料快取同步到磁碟(快)

always:表示每次更新操作後手動呼叫fsync()將資料寫到磁碟(慢,安全)

everysec:表示每秒同步一次(折衷,預設值)

appendfsync everysec

23.    指定是否啟用虛擬記憶體機制,預設值為no,簡單的介紹一下,VM機制將資料分頁存放,由Redis將訪問量較少的頁即冷資料swap到磁碟上,訪問多的頁面由磁碟自動換出到記憶體中(在後面的文章我會仔細分析Redis的VM機制)

vm-enabled no

24.    虛擬記憶體檔案路徑,預設值為/tmp/redis.swap,不可多個Redis例項共享

vm-swap-file /tmp/redis.swap

25.    將所有大於vm-max-memory的資料存入虛擬記憶體,無論vm-max-memory設定多小,所有索引資料都是記憶體儲存的(Redis的索引資料就是keys),也就是說,當vm-max-memory設定為0的時候,其實是所有value都存在於磁碟。

vm-max-memory 0

26.    Redis swap檔案分成了很多的page,一個物件可以儲存在多個page上面,但一個page上不能被多個物件共享,vm-page-size是要根據儲存的 資料大小來設定的,作者建議如果儲存很多小物件,page大小最好設定為32或者64bytes;如果儲存很大大物件,則可以使用更大的page,如果不確定,就使用預設值

vm-page-size32

27.    設定swap檔案中的page數量,由於頁表(一種表示頁面空閒或使用的bitmap)是在放在記憶體中的,,在磁碟上每8個pages將消耗1byte的記憶體。

vm-pages 134217728

28.    設定訪問swap檔案的執行緒數,最好不要超過機器的核數,如果設定為0,那麼所有對swap檔案的操作都是序列的,可能會造成比較長時間的延遲。預設值為4

vm-max-threads 4

no-appendfsync-on-rewrite no

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

lua-time-limit 5000

slowlog-log-slower-than 10000

slowlog-max-len 128

29.    指定在超過一定的數量或者最大的元素超過某一臨界值時,採用一種特殊的雜湊演算法

hash-max-ziplist-entries 512

hash-max-ziplist-value 64

list-max-ziplist-entries 512

list-max-ziplist-value 64

set-max-intset-entries 512

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

30.    指定是否啟用重置雜湊,預設為開啟(後面在介紹Redis的雜湊演算法時具體介紹)

activerehashing yes

client-output-buffer-limit normal 0 00

client-output-buffer-limit slave256mb 64mb 60

client-output-buffer-limit pubsub32mb 8mb 60

hz 10

31.    指定包含其它的配置檔案,可以在同一主機上多個Redis例項之間使用同一份配置檔案,而同時各個例項又擁有自己的特定配置檔案

具體請參考:https://raw.githubusercontent.com/antirez/redis/2.6/redis.conf

 

6  示例程式碼

我們選擇的Redis客戶端實現是Jedis,這是比較成熟的Redis客戶端,也是官網力薦的。因為Redis本身不支援叢集功能,我們的思路是在叢集中啟動多個獨立的例項,在客戶端通過“一致性hash”技術來實現對叢集中各個Redis例項進行讀寫,Jedis通過ShardJedis物件對”一致性hash”提供支援。

 

6.1     定義一個ShardJedisPool

static ShardedJedisPoolpool;

static {

      //配置

JedisPoolConfig config = new JedisPoolConfig();      config.setMaxTotal(1024);

      config.setMaxIdle(5);

      config.setMaxWaitMillis(1000*2);

      //建立ShardJedis物件

      String masterA = “10.10.0.3”;

      String masterB = “10.10.0.131”;

      int port = 6379;

List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>(2);

      JedisShardInfo infoA = new JedisShardInfo(masterA, port);

      JedisShardInfo infoB = new JedisShardInfo(masterB, port);

      jdsInfoList.add(infoA);

      jdsInfoList.add(infoB);

      //建立ShardJedisPool

      pool =
new
ShardedJedisPool(config,
jdsInfoList
, Hashing.MURMUR_HASH, Sharded.DEFAULT_KEY_TAG_PATTERN);

 

}

 

6.2     使用ShardJedis物件

   ShardedJedis jedis= pool.getResource();//從池中獲取

jedis.set("foo","bar");//寫入Redis
String value = jedis.get("foo");//讀出
pool.returnResource(jedis);//釋放掉資源
 

 

具體請參考:https://github.com/xetorthio/jedis


相關文章