大數據高性能數據庫Redis在Windows上的使用教程

Redis學習筆記----Redis在windows上的安裝配置和使用node

Redis簡介

  redis是一個key-value存儲系統。和Memcached相似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操做,並且這些操做都是原子性的。在此基礎上,redis支持各類不一樣方式的排序。與memcached同樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操做寫入追加的記錄文件,而且在此基礎上實現了master-slave(主從)同步。Redis通常部署在linux服務器上,可是咱們也能夠在windows上學習他的安裝和配置。linux

Redis性能

下面是官方的bench-mark數據:
測試完成了50個併發執行100000個請求。
設置和獲取的值是一個256字節字符串。
Linux box是運行Linux 2.6,這是X3320 Xeon 2.5 ghz。
文本執行使用loopback接口(127.0.0.1)。
結果:讀的速度是110000次/s,寫的速度是81000次/s
 

Redis在windows上的安裝和配置

 
首先下載Redis完整包。

Redis完整包下載redis

解壓下載後的完整包,打開MasterRedis文件夾(此文件夾爲主Redis數據庫文件夾,後面會介紹)。算法

redis.conf文件爲Redis服務的配置文件,能夠根據須要進行配置。數據庫

 

  下面是redis.conf的主要配置參數的意義:
daemonize:是否之後臺daemon方式運行
 
pidfile:pid文件位置
 
port:監聽的端口號
 
timeout:請求超時時間
 
loglevel:log信息級別
 
logfile:log文件位置
 
databases:開啓數據庫的數量
 
save * *:保存快照的頻率,第一個*表示多長時間,第二個*表示執行多少次寫操做。在必定時間內執行必定數量的寫操做時,自動保存快照。可設置多個條件。
 
rdbcompression:是否使用壓縮
 
dbfilename:數據快照文件名(只是文件名,不包括目錄)
 
dir:數據快照的保存目錄(這個是目錄)
 
appendonly:是否開啓appendonlylog,開啓的話每次寫操做會記一條log,這會提升數據抗風險能力,但影響效率。
 
appendfsync:appendonlylog如何同步到磁盤(三個選項,分別是每次寫都強制調用fsync、每秒啓用一次fsync、不調用fsync等待系統本身同步)

  下面給出配置文件的詳細說明:windows

 

1 daemonize  no


默認狀況下,redis 不是在後臺運行的,若是須要在後臺運行,把該項的值更改成yes。


2 pidfile  /var/run/redis.pid


當Redis 在後臺運行的時候,Redis 默認會把pid 文件放在/var/run/redis.pid,你能夠配置到其餘地址。當運行多個redis 服務時,須要指定不一樣的pid 文件和端口


3 port


監聽端口,默認爲6379


4 #bind 127.0.0.1


指定Redis 只接收來自於該IP 地址的請求,若是不進行設置,那麼將處理全部請求,在生產環境中爲了安全最好設置該項。默認註釋掉,不開啓


5 timeout 0


設置客戶端鏈接時的超時時間,單位爲秒。當客戶端在這段時間內沒有發出任何指令,那麼關閉該鏈接


6 tcp-keepalive 0


指定TCP鏈接是否爲長鏈接,"偵探"信號有server端維護。默認爲0.表示禁用


7 loglevel notice


log 等級分爲4 級,debug,verbose, notice, 和warning。生產環境下通常開啓notice


8 logfile stdout


配置log 文件地址,默認使用標準輸出,即打印在命令行終端的窗口上,修改成日誌文件目錄


9 databases 16


設置數據庫的個數,可使用SELECT 命令來切換數據庫。默認使用的數據庫是0號庫。默認16個庫


10 


save 900 1
save 300 10
save 60 10000


保存數據快照的頻率,即將數據持久化到dump.rdb文件中的頻度。用來描述"在多少秒期間至少多少個變動操做"觸發snapshot數據保存動做


 


默認設置,意思是:


if(在60 秒以內有10000 個keys 發生變化時){


進行鏡像備份


}else if(在300 秒以內有10 個keys 發生了變化){


進行鏡像備份


}else if(在900 秒以內有1 個keys 發生了變化){


進行鏡像備份


}


11 stop-writes-on-bgsave-error yes


當持久化出現錯誤時,是否依然繼續進行工做,是否終止全部的客戶端write請求。默認設置"yes"表示終止,一旦snapshot數據保存故障,那麼此server爲只讀服務。若是爲"no",那麼這次snapshot將失敗,但下一次snapshot不會受到影響,不過若是出現故障,數據只能恢復到"最近一個成功點"


12 rdbcompression yes


在進行數據鏡像備份時,是否啓用rdb文件壓縮手段,默認爲yes。壓縮可能須要額外的cpu開支,不過這可以有效的減少rdb文件的大,有利於存儲/備份/傳輸/數據恢復


13 rdbchecksum yes


讀取和寫入時候,會損失10%性能


14 rdbchecksum yes


是否進行校驗和,是否對rdb文件使用CRC64校驗和,默認爲"yes",那麼每一個rdb文件內容的末尾都會追加CRC校驗和,利於第三方校驗工具檢測文件完整性


14 dbfilename dump.rdb


鏡像備份文件的文件名,默認爲 dump.rdb


15 dir ./


數據庫鏡像備份的文件rdb/AOF文件放置的路徑。這裏的路徑跟文件名要分開配置是由於Redis 在進行備份時,先會將當前數據庫的狀態寫入到一個臨時文件中,等備份完成時,再把該臨時文件替換爲上面所指定的文件,而這裏的臨時文件和上面所配置的備份文件都會放在這個指定的路徑當中


16 # slaveof <masterip> <masterport>


設置該數據庫爲其餘數據庫的從數據庫,併爲其指定master信息。


17 masterauth


當主數據庫鏈接須要密碼驗證時,在這裏指定


18 slave-serve-stale-data yes


當主master服務器掛機或主從複製在進行時,是否依然能夠容許客戶訪問可能過時的數據。在"yes"狀況下,slave繼續向客戶端提供只讀服務,有可能此時的數據已通過期;在"no"狀況下,任何向此server發送的數據請求服務(包括客戶端和此server的slave)都將被告知"error"


19 slave-read-only yes


slave是否爲"只讀",強烈建議爲"yes"


20 # repl-ping-slave-period 10


slave向指定的master發送ping消息的時間間隔(秒),默認爲10


21 # repl-timeout 60


slave與master通信中,最大空閒時間,默認60秒.超時將致使鏈接關閉


22 repl-disable-tcp-nodelay no


slave與master的鏈接,是否禁用TCP nodelay選項。"yes"表示禁用,那麼socket通信中數據將會以packet方式發送(packet大小受到socket buffer限制)。


能夠提升socket通信的效率(tcp交互次數),可是小數據將會被buffer,不會被當即發送,對於接受者可能存在延遲。"no"表示開啓tcp nodelay選項,任何數據都會被當即發送,及時性較好,可是效率較低,建議設爲no


23 slave-priority 100


適用Sentinel模塊(unstable,M-S集羣管理和監控),須要額外的配置文件支持。slave的權重值,默認100.當master失效後,Sentinel將會從slave列表中找到權重值最低(>0)的slave,並提高爲master。若是權重值爲0,表示此slave爲"觀察者",不參與master選舉


24 # requirepass foobared


設置客戶端鏈接後進行任何其餘指定前須要使用的密碼。警告:由於redis 速度至關快,因此在一臺比較好的服務器下,一個外部的用戶能夠在一秒鐘進行150K 次的密碼嘗試,這意味着你須要指定很是很是強大的密碼來防止暴力破解。


25 # rename-command CONFIG 3ed984507a5dcd722aeade310065ce5d    (方式:MD5('CONFIG^!'))


重命名指令,對於一些與"server"控制有關的指令,可能不但願遠程客戶端(非管理員用戶)連接隨意使用,那麼就能夠把這些指令重命名爲"難以閱讀"的其餘字符串


26 # maxclients 10000


 


限制同時鏈接的客戶數量。當鏈接數超過這個值時,redis 將再也不接收其餘鏈接請求,客戶端嘗試鏈接時將收到error 信息。默認爲10000,要考慮系統文件描述符限制,不宜過大,浪費文件描述符,具體多少根據具體狀況而定


27 # maxmemory <bytes>


redis-cache所能使用的最大內存(bytes),默認爲0,表示"無限制",最終由OS物理內存大小決定(若是物理內存不足,有可能會使用swap)。此值儘可能不要超過機器的物理內存尺寸,從性能和實施的角度考慮,能夠爲物理內存3/4。此配置須要和"maxmemory-policy"配合使用,當redis中內存數據達到maxmemory時,觸發"清除策略"。在"內存不足"時,任何write操做(好比set,lpush等)都會觸發"清除策略"的執行。在實際環境中,建議redis的全部物理機器的硬件配置保持一致(內存一致),同時確保master/slave中"maxmemory""policy"配置一致。


當內存滿了的時候,若是還接收到set 命令,redis 將先嚐試剔除設置過expire 信息的key,而無論該key 的過時時間尚未到達。在刪除時,


將按照過時時間進行刪除,最先將要被過時的key 將最早被刪除。若是帶有expire 信息的key 都刪光了,內存還不夠用,那麼將返回錯誤。這樣,redis 將再也不接收寫請求,只接收get 請求。maxmemory 的設置比較適合於把redis 看成於相似memcached的緩存來使用。


28 # maxmemory-policy volatile-lru


內存不足"時,數據清除策略,默認爲"volatile-lru"。


volatile-lru  ->對"過時集合"中的數據採起LRU(近期最少使用)算法.若是對key使用"expire"指令指定了過時時間,那麼此key將會被添加到"過時集合"中。將已通過期/LRU的數據優先移除.若是"過時集合"中所有移除仍不能知足內存需求,將OOM.
allkeys-lru ->對全部的數據,採用LRU算法
volatile-random ->對"過時集合"中的數據採起"隨即選取"算法,並移除選中的K-V,直到"內存足夠"爲止. 若是若是"過時集合"中所有移除所有移除仍不能知足,將OOM
allkeys-random ->對全部的數據,採起"隨機選取"算法,並移除選中的K-V,直到"內存足夠"爲止
volatile-ttl ->對"過時集合"中的數據採起TTL算法(最小存活時間),移除即將過時的數據.
noeviction ->不作任何干擾操做,直接返回OOM異常
另外,若是數據的過時不會對"應用系統"帶來異常,且系統中write操做比較密集,建議採起"allkeys-lru"


29 # maxmemory-samples 3


默認值3,上面LRU和最小TTL策略並不是嚴謹的策略,而是大約估算的方式,所以能夠選擇取樣值以便檢查


29 appendonly no


默認狀況下,redis 會在後臺異步的把數據庫鏡像備份到磁盤,可是該備份是很是耗時的,並且備份也不能很頻繁。因此redis 提供了另一種更加高效的數據庫備份及災難恢復方式。開啓append only 模式以後,redis 會把所接收到的每一次寫操做請求都追加到appendonly.aof 文件中,當redis 從新啓動時,會從該文件恢復出以前的狀態。可是這樣會形成appendonly.aof 文件過大,因此redis 還支持了BGREWRITEAOF 指令,對appendonly.aof 進行從新整理。若是不常常進行數據遷移操做,推薦生產環境下的作法爲關閉鏡像,開啓appendonly.aof,同時能夠選擇在訪問較少的時間天天對appendonly.aof 進行重寫一次。


另外,對master機器,主要負責寫,建議使用AOF,對於slave,主要負責讀,挑選出1-2臺開啓AOF,其他的建議關閉


30 # appendfilename appendonly.aof


aof文件名字,默認爲appendonly.aof


31 


# appendfsync always
appendfsync everysec
# appendfsync no


設置對appendonly.aof 文件進行同步的頻率。always 表示每次有寫操做都進行同步,everysec 表示對寫操做進行累積,每秒同步一次。no不主動fsync,由OS本身來完成。這個須要根據實際業務場景進行配置


32 no-appendfsync-on-rewrite no


在aof rewrite期間,是否對aof新記錄的append暫緩使用文件同步策略,主要考慮磁盤IO開支和請求阻塞時間。默認爲no,表示"不暫緩",新的aof記錄仍然會被當即同步


33 auto-aof-rewrite-percentage 100


當Aof log增加超過指定比例時,重寫log file, 設置爲0表示不自動重寫Aof 日誌,重寫是爲了使aof體積保持最小,而確保保存最完整的數據。


34 auto-aof-rewrite-min-size 64mb


觸發aof rewrite的最小文件尺寸


35 lua-time-limit 5000


lua腳本運行的最大時間


36 slowlog-log-slower-than 10000


"慢操做日誌"記錄,單位:微秒(百萬分之一秒,1000 * 1000),若是操做時間超過此值,將會把command信息"記錄"起來.(內存,非文件)。其中"操做時間"不包括網絡IO開支,只包括請求達到server後進行"內存實施"的時間."0"表示記錄所有操做


37 slowlog-max-len 128


"慢操做日誌"保留的最大條數,"記錄"將會被隊列化,若是超過了此長度,舊記錄將會被移除。能夠經過"SLOWLOG <subcommand> args"查看慢記錄的信息(SLOWLOG get 10,SLOWLOG reset)


38


 hash-max-ziplist-entries 512


hash類型的數據結構在編碼上可使用ziplist和hashtable。ziplist的特色就是文件存儲(以及內存存儲)所需的空間較小,在內容較小時,性能和hashtable幾乎同樣.所以redis對hash類型默認採起ziplist。若是hash中條目的條目個數或者value長度達到閥值,將會被重構爲hashtable。


這個參數指的是ziplist中容許存儲的最大條目個數,,默認爲512,建議爲128
hash-max-ziplist-value 64


ziplist中容許條目value值最大字節數,默認爲64,建議爲1024


39 


list-max-ziplist-entries 512
list-max-ziplist-value 64


對於list類型,將會採起ziplist,linkedlist兩種編碼類型。解釋同上。


40 set-max-intset-entries 512


intset中容許保存的最大條目個數,若是達到閥值,intset將會被重構爲hashtable


41 


zset-max-ziplist-entries 128
zset-max-ziplist-value 64


zset爲有序集合,有2中編碼類型:ziplist,skiplist。由於"排序"將會消耗額外的性能,當zset中數據較多時,將會被重構爲skiplist。


42 activerehashing yes


是否開啓頂層數據結構的rehash功能,若是內存容許,請開啓。rehash可以很大程度上提升K-V存取的效率


43 


client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60


客戶端buffer控制。在客戶端與server進行的交互中,每一個鏈接都會與一個buffer關聯,此buffer用來隊列化等待被client接受的響應信息。若是client不能及時的消費響應信息,那麼buffer將會被不斷積壓而給server帶來內存壓力.若是buffer中積壓的數據達到閥值,將會致使鏈接被關閉,buffer被移除。


buffer控制類型包括:normal -> 普通鏈接;slave ->與slave之間的鏈接;pubsub ->pub/sub類型鏈接,此類型的鏈接,每每會產生此種問題;由於pub端會密集的發佈消息,可是sub端可能消費不足.
指令格式:client-output-buffer-limit <class> <hard> <soft> <seconds>",其中hard表示buffer最大值,一旦達到閥值將當即關閉鏈接;
soft表示"容忍值",它和seconds配合,若是buffer值超過soft且持續時間達到了seconds,也將當即關閉鏈接,若是超過了soft可是在seconds以後,buffer數據小於了soft,鏈接將會被保留.
其中hard和soft都設置爲0,則表示禁用buffer控制.一般hard值大於soft.


44 

hz 10


Redis server執行後臺任務的頻率,默認爲10,此值越大表示redis對"間歇性task"的執行次數越頻繁(次數/秒)。"間歇性task"包括"過時集合"檢測、關閉"空閒超時"的鏈接等,此值必須大於0且小於500。此值太小就意味着更多的cpu週期消耗,後臺task被輪詢的次數更頻繁。此值過大意味着"內存敏感"性較差。建議採用默認值。


45 


# include /path/to/local.conf
# include /path/to/other.conf


額外載入配置文件。
點擊展開說明

打開Redis服務 

 

打開命令行進入MasterRedis文件夾目錄。好比我下載的文件夾路徑爲 E:\Redis\RedisFull,就在命令行輸入:緩存

 

接着輸入:安全

此時會看到進程裏多了一個服務器

說明Redis服務開啓成功。網絡

Redis主從服務簡介

 

Redis主從服務原理:

  在Slave啓動並鏈接到Master以後,它將主動發送一個SYNC命令。此後Master將啓動後臺存盤進程,同時收集全部接收到的用於修改數據集的命令,在後臺進程執行完畢後,Master將傳送整個數據庫文件到Slave,以完成一次徹底同步。而Slave服務器在接收到數據庫文件數據以後將其存盤並加載到內存中。此後,Master繼續將全部已經收集到的修改命令,和新的修改命令依次傳送給Slaves,Slave將在本次執行這些數據修改命令,從而達到最終的數據同步。若是Master和Slave之間的連接出現斷連現象,Slave能夠自動重連Master,可是在鏈接成功以後,一次徹底同步將被自動執行。

Redis主從服務注意事項:    

 1). 同一個Master能夠同步多個Slaves。
    2). Slave一樣能夠接受其它Slaves的鏈接和同步請求,這樣能夠有效的分載Master的同步壓力。
    3). Master Server是以非阻塞的方式爲Slaves提供服務,因此在Master-Slave同步期間,客戶端仍然能夠提交查詢或修改請求。
    4). Slave Server一樣是以非阻塞的方式完成數據同步。在同步期間,若是有客戶端提交查詢請求,Redis則返回同步以前的數據。
    5). 爲了分載Master的讀操做壓力,Slave服務器能夠爲客戶端提供只讀操做的服務,寫服務仍然必須由Master來完成。
    6). Master能夠將數據保存操做交給Slaves完成,從而避免了在Master中要有獨立的進程來完成此操做。

 

Redis主從服務配置

 

打開SlaveRedis文件夾,修改redis.conf文件的port項,修改值任意,可是不能和主服務的port相同(下載的完整包中我已經修改過),bind項改成主服務器的IP(本地測試改成127.0.0.1),slaveof項改成127.0.0.1 6379(已改)。

打開命令行輸入命令:

 

會發現進程中有2個redis-server.exe進程。

Redis主從同步C#代碼測試

 

首先下載Redis的C#組件,用於操做Redis數據庫。

Redis4C#包下載

新建一個控制檯項目。

添加Redis4C#包內3個程序集的引用。

添加測試代碼。

 

 1        var client = new RedisClient("127.0.0.1", 6379);
 2             client.Set<string>("6379_1", "test");
 3             client.Set<string>("6379_2", "test");
 4  5             string name = client.Get<string>("6379");
 6             Console.WriteLine(name);
 7 
 8             //Redis隊列
 9             client.EnqueueItemOnList("jayjay", "12345");
10             client.EnqueueItemOnList("jayjay", "12345");
11 12 
13             int length1 = client.GetListCount("jayjay");
14             for (int i = 0; i < length1; i++)
15             {
16                 Console.WriteLine(client.DequeueItemFromList("jayjay"));
17             }
18 
19 
20             //Redis壓棧出棧
21             client.PushItemToList("name", "jayjay6379");
22             client.PushItemToList("name", "jayjay6379");
23 
24             int length2 = client.GetListCount("name");
25             for (int i = 0; i < length2; i++)
26             {
27                 Console.WriteLine(client.PopItemFromList("name"));
28             }
29 
30             Console.ReadKey();

 

運行代碼。

將主服務端口6379改成從服務端口6381,讀出剛剛放入的數據,例如:

1             var client = new RedisClient("127.0.0.1", 6381);
2             string name = client.Get<string>("6379_1");
3             Console.WriteLine(name);

能讀到說明主服務保存的數據已經同步到從服務中。

PS:1.Redis文件夾路徑中不能出現中文(命令行採用的是ANSIC編碼,中文會出錯)!

 

   2.dump.rdb是數據快照文件,主服務的數據快照並不會當即同步到從服務的數據快照中!

本文是我在學習Redis時的一些積累,目的是和各類園友分享經驗,若是有什麼錯誤或者不完善的地方歡迎你們指出!

相關文章
相關標籤/搜索