閱讀642 返回首頁    go 技術社區[雲棲]


Redis使用手冊

給公司整理了一個簡單的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     其它參考資料

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

所有命令請參考:https://redis.io/commands

4  環境安裝

4.1 下載、解壓、安裝

$ wget https://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"
具體請參考:https://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


最後更新:2017-04-04 07:31:59

  上一篇:go C# 動態加載Dll
  下一篇:go 機房收費係統之思想性總結