安裝linux
[root@localhost ~]# mkdir -p /usr/local/services/download
新建下載目錄
[root@localhost ~]# cd /usr/local/services/download
[root@localhost download]# wget http://redis.googlecode.com/files/redis-2.4.2.tar.gz
下載地址:
--2011-11-15 19:30:48-- http://redis.googlecode.com/files/redis-2.4.2.tar.gz
Resolving redis.googlecode.com... 64.233.183.82
Connecting to redis.googlecode.com|64.233.183.82|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 627947 (613K) [application/octet-stream]
Saving to: `redis-2.4.2.tar.gz'redis
100%[=============================================================================================================================>] 627,947 930K/s in 0.7s 數據庫
2011-11-15 19:30:48 (930 KB/s) - `redis-2.4.2.tar.gz' saved [627947/627947]ubuntu
安裝命令以下
[root@localhost download]# tar zxvf redis-2.4.2.tar.gz
[root@localhost download]# mv redis-2.4.2 ../
[root@localhost services]# cd redis-2.4.2/
[root@localhost redis-2.4.2]# make
直接make就行
make命令執行完成後,會再src目錄下生成本個可執行文件,分別是redis-server、redis-cli、redis-benchmark、redis-stat,它們的做用以下:vim
[root@localhost redis-2.4.2]# vim redis.conf
當前目錄redis.conf是redis的配置文件
daemonize no 將no改成redis後臺運行
daemonize yes
緩存
保存退出服務器
[root@localhost redis-2.4.2]# cd src/
啓動腳本redis-server就在src目下
[root@localhost src]# ./redis-server ../redis.conf
腳本後面跟上.conf的路徑 數據結構
[root@localhost src]# ps aux | grep redis
root 4833 0.0 0.0 39672 1400 ? Ssl 19:39 0:00 ./redis-server ../redis.conf
root 4838 0.0 0.0 61148 776 pts/0 R+ 19:39 0:00 grep redis架構
./redis-cli是測試客戶端腳本(執行這個腳本就能夠和redis交互了)併發
[root@localhost src]# ./redis-cli
redis 127.0.0.1:6379> set a b
OK
redis 127.0.0.1:6379> get a
"b"
安裝完成
二、 配置redis
vi /usr/local/redis/redis.conf
daemonize yes
pidfile /usr/local/redis/redis.pid
port 6379
timeout 300
loglevel verbose
logfile /usr/local/redis/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /usr/local/redis
slave-serve-stale-data yes
maxmemory 67108864 #64M*1024*8
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
vm-enabled no
vm-swap-file /tmp/redis.swap
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 8
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
activerehashing yes
1,是否之後臺進程運行,默認爲no
daemonize no
2,如之後臺進程運行,則需指定一個pid,默認爲/var/run/redis.pid
pidfile /var/run/redis.pid
3,監聽端口,默認爲6379
port 6379
4,綁定主機IP,默認值爲127.0.0.1(註釋)
#bind 127.0.0.1
5,超時時間,默認爲300(秒)
timeout 300
6,日誌記錄等級,有4個可選值,debug,verbose(默認值),notice,warning
loglevel verbose
7,日誌記錄方式,默認值爲stdout
logfile stdout
8,可用數據庫數,默認值爲16,默認數據庫爲0
databases 16
9,指出在多長時間內,有多少次更新操做,就將數據同步到數據文件。這個能夠多個條件配合,好比默認配置文件中的設置,就設置了三個條件。
900秒(15分鐘)內至少有1個key被改變
save 900 1
300秒(5分鐘)內至少有10個key被改變
save 300 10
10,存儲至本地數據庫時是否壓縮數據,默認爲yes
rdbcompression yes
11,本地數據庫文件名,默認值爲dump.rdb
dbfilename /root/redis_db/dump.rdb
12,本地數據庫存放路徑,默認值爲 ./
dir /root/redis_db/
13,當本機爲從服務時,設置主服務的IP及端口(註釋)(重要)
slaveof <masterip> <masterport>
14,當本機爲從服務時,設置主服務的鏈接密碼(註釋)
masterauth <master-password>
15,鏈接密碼(註釋)
requirepass foobared
16,最大客戶端鏈接數,默認不限制(註釋)0爲不限制
maxclients 0
17,設置最大內存,達到最大內存設置後,Redis會先嚐試清除已到期或即將到期的Key,當此方法處理後,任到達最大內存設置,將沒法再進行寫入操做。(註釋)
maxmemory 67108864 (64M)
18,是否在每次更新操做後進行日誌記錄,若是不開啓,可能會在斷電時致使一段時間內的數據丟失。由於redis自己同步數據文件是按上面save條件來同步的,因此有的數據會在一段時間內只存在於內存中。默認值爲no
appendonly no
19,更新日誌文件名,默認值爲appendonly.aof(註釋)
appendfilename /root/redis_db/appendonly.aof
20,更新日誌條件,共有3個可選值。no表示等操做系統進行數據緩存同步到磁盤,always表示每次更新操做後手動調用fsync()將數據寫到磁盤,everysec表示每秒同步一次(默認值)。
appendfsync everysec
21,是否使用虛擬內存,默認值爲no
vm-enabled no
22,虛擬內存文件路徑,默認值爲/tmp/redis.swap,不可多個Redis實例共享
vm-swap-file /tmp/redis.swap
23,將全部大於vm-max-memory的數據存入虛擬內存,不管vm-max-memory設置多小,全部索引數據都是內存存儲的 (Redis的索引數據就是keys),也就是說,當vm-max-memory設置爲0的時候,實際上是全部value都存在於磁盤。默認值爲0。
vm-max-memory 0
24,虛擬內存文件以塊存儲,每塊32bytes
vm-page-size 32
25,虛擬內在文件的最大數
vm-pages 134217728
26,能夠設置訪問swap文件的線程數,設置最好不要超過機器的核數,若是設置爲0,那麼全部對swap文件的操做都是串行的.可能會形成比較長時間的延遲,可是對數據完整性有很好的保證.
vm-max-threads 4
27,把小的輸出緩存放在一塊兒,以便可以在一個TCP packet中爲客戶端發送多個響應,具體原理和真實效果我不是很清楚。因此根據註釋,你不是很肯定的時候就設置成yes
glueoutputbuf yes
28,在redis 2.0中引入了hash數據結構。當hash中包含超過指定元素個數而且最大的元素沒有超過臨界時,hash將以一種特殊的編碼方式(大大減小內存使用)來存儲,這裏能夠設置這兩個臨界值
hash-max-zipmap-entries 64
29,hash中一個元素的最大值
hash-max-zipmap-value 512
30,開啓以後,redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行從新hash,能夠下降內存的使用。當你的使用場景中,有很是嚴格的實時性須要,不可以接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置爲no。若是沒有這麼嚴格的實時性要求,能夠設置 爲yes,以便可以儘量快的釋放內存
activerehashing yes
Redis支持不少的參數,但都有默認值。
??daemonize:
默認狀況下,redis不是在後臺運行的,若是須要在後臺運行,把該項的值更改成yes
??pidfile
當Redis在後臺運行的時候,Redis默認會把pid文件放在/var/run/redis.pid,你能夠配置到其餘地址。當運行多個redis服務時,須要指定不一樣的pid文件和端口
??bind
指定Redis只接收來自於該IP地址的請求,若是不進行設置,那麼將處理全部請求,在生產環境中最好設置該項
??port
監聽端口,默認爲6379
??timeout
設置客戶端鏈接時的超時時間,單位爲秒。當客戶端在這段時間內沒有發出任何指令,那麼關閉該鏈接
??loglevel
log等級分爲4級,debug, verbose, notice, 和warning。生產環境下通常開啓notice
??logfile
配置log文件地址,默認使用標準輸出,即打印在命令行終端的窗口上
??databases
設置數據庫的個數,可使用SELECT <dbid>命令來切換數據庫。默認使用的數據庫是0
??save
設置Redis進行數據庫鏡像的頻率。 if(在60秒以內有10000個keys發生變化時){ 進行鏡像備份 }else if(在300秒以內有10個keys發生了變化){ 進行鏡像備份 }else if(在900秒以內有1個keys發生了變化){ 進行鏡像備份 }
??rdbcompression
在進行鏡像備份時,是否進行壓縮
??dbfilename
鏡像備份文件的文件名
??dir
數據庫鏡像備份的文件放置的路徑。這裏的路徑跟文件名要分開配置是由於Redis在進行備份時,先會將當前數據庫的狀態寫入到一個臨時文件中,等備份完成時,再把該該臨時文件替換爲上面所指定的文件,而這裏的臨時文件和上面所配置的備份文件都會放在這個指定的路徑當中
??slaveof
設置該數據庫爲其餘數據庫的從數據庫
??masterauth
當主數據庫鏈接須要密碼驗證時,在這裏指定
??requirepass
設置客戶端鏈接後進行任何其餘指定前須要使用的密碼。警告:由於redis速度至關快,因此在一臺比較好的服務器下,一個外部的用戶能夠在一秒鐘進行150K次的密碼嘗試,這意味着你須要指定很是很是強大的密碼來防止暴力破解。
??maxclients
限制同時鏈接的客戶數量。當鏈接數超過這個值時,redis將再也不接收其餘鏈接請求,客戶端嘗試鏈接時將收到error信息。
??maxmemory
設置redis可以使用的最大內存。當內存滿了的時候,若是還接收到set命令,redis將先嚐試剔除設置過expire信息的key,而無論該key的過時時間尚未到達。在刪除時,將按照過時時間進行刪除,最先將要被過時的key將最早被刪除。若是帶有expire信息的key都刪光了,那麼將返回錯誤。這樣,redis將再也不接收寫請求,只接收get請求。maxmemory的設置比較適合於把redis看成於相似memcached的緩存來使用。
??appendonly
默認狀況下,redis會在後臺異步的把數據庫鏡像備份到磁盤,可是該備份是很是耗時的,並且備份也不能很頻繁,若是發生諸如拉閘限電、拔插頭等情況,那麼將形成比較大範圍的數據丟失。因此redis提供了另一種更加高效的數據庫備份及災難恢復方式。開啓append only模式以後,redis會把所接收到的每一次寫操做請求都追加到appendonly.aof文件中,當redis從新啓動時,會從該文件恢復出以前的狀態。可是這樣會形成appendonly.aof文件過大,因此redis還支持了BGREWRITEAOF指令,對appendonly.aof進行從新整理。因此我認爲推薦生產環境下的作法爲關閉鏡像,開啓appendonly.aof,同時能夠選擇在訪問較少的時間天天對appendonly.aof進行重寫一次。
??appendfsync
設置對appendonly.aof文件進行同步的頻率。always表示每次有寫操做都進行同步,everysec表示對寫操做進行累積,每秒同步一次。這個須要根據實際業務場景進行配置
??vm-enabled
是否開啓虛擬內存支持。由於redis是一個內存數據庫,並且當內存滿的時候,沒法接收新的寫請求,因此在redis 2.0中,提供了虛擬內存的支持。可是須要注意的是,redis中,全部的key都會放在內存中,在內存不夠時,只會把value值放入交換區。這樣保證了雖然使用虛擬內存,但性能基本不受影響,同時,你須要注意的是你要把vm-max-memory設置到足夠來放下你的全部的key
??vm-swap-file
設置虛擬內存的交換文件路徑
??vm-max-memory
這裏設置開啓虛擬內存以後,redis將使用的最大物理內存的大小。默認爲0,redis將把他全部的能放到交換文件的都放到交換文件中,以儘可能少的使用物理內存。在生產環境下,須要根據實際狀況設置該值,最好不要使用默認的0
??vm-page-size
設置虛擬內存的頁大小,若是你的value值比較大,好比說你要在value中放置博客、新聞之類的全部文章內容,就設大一點,若是要放置的都是很小的內容,那就設小一點。
??vm-pages
設置交換文件的總的page數量,須要注意的是,page table信息會放在物理內存中,每8個page就會佔據RAM中的1個byte。總的虛擬內存大小= vm-page-size * vm-pages
??vm-max-threads
設置VM IO同時使用的線程數量。由於在進行內存交換時,對數據有編碼和解碼的過
程,因此儘管IO設備在硬件上本上不能支持不少的併發讀寫,可是仍是若是你所保存的vlaue值比較大,將該值設大一些,仍是可以提高性能的
??glueoutputbuf
把小的輸出緩存放在一塊兒,以便可以在一個TCP packet中爲客戶端發送多個響應,具體原理和真實效果我不是很清楚。因此根據註釋,你不是很肯定的時候就設置成yes
??hash-max-zipmap-entries
在redis 2.0中引入了hash數據結構。當hash中包含超過指定元素個數而且最大的元素沒有超過臨界時,hash將以一種特殊的編碼方式(大大減小內存使用)來存儲,這裏能夠設置這兩個臨界值
??activerehashing
開啓以後,redis將在每100毫秒時使用1毫秒的CPU時間來對redis的hash表進行從新hash,能夠下降內存的使用。當你的使用場景中,有很是嚴格的實時性須要,不可以接受Redis時不時的對請求有2毫秒的延遲的話,把這項配置爲no。若是沒有這麼嚴格的實時性要求,能夠設置爲yes,以便可以儘量快的釋放內存
3、啓動,使用redis
redis-server /usr/local/redis/redis.conf //啓動redis
//如下redis-cli來設置key-value值,而且取得數據
root@ubuntu:/usr/local/redis# redis-cli set test "我要測試一下"
OK
root@ubuntu:/usr/local/redis# redis-cli get test
"\xe6\x88\x91\xe8\xa6\x81\xe6\xb5\x8b\xe8\xaf\x95\xe4\xb8\x80\xe4\xb8\x8b" //如下是telnet的方式來設置key-value值
root@ubuntu:/usr/local/redis# telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
set test mytest
+OK
get test
$6
mytest
quit
+OK
Connection closed by foreign host.
4、關閉redis
redis-cli shutdown
# killall -9 redis-server //關閉全部
檢測Redis是否啓動:
netstat -an –t
五、redis開機啓動
Vi /etc/rc.d/rc.local
redis-server /usr/local/redis/redis.conf或
echo "redis-server /usr/local/redis/redis.conf" >> /etc/rc.d/rc.local
redis是單線程來處理全部client的請求的
實驗
下面是個實驗,首先清空當前數據庫,而後
設置k1,k2.獲取時k3對應返回nil
redis> flushdb
OK
redis> dbsize
(integer) 0
redis> set k1 a
OK
redis> set k2 b
OK
redis> mget k1 k2 k3
1. "a"
2. "b"
3. (nil)
mset key1 value1 ... keyN valueN 一次設置多個key的值,成功返回1表示全部的值都設置了,失敗返回0表示沒有任何值被設置
msetnx key1 value1 ... keyN valueN 同上,可是不會覆蓋已經存在的key
incr key 對key的值作加加操做,並返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設置key爲1
decr key 同上,可是作的是減減操做,decr一個不存在key,則設置key爲-1
incrby key integer 同incr,加指定值 ,key不存在時候會設置key,並認爲原來的value是 0
decrby key integer 同decr,減指定值。decrby徹底是爲了可讀性,咱們徹底能夠經過incrby一個負值來實現一樣效果,反之同樣。
append key value 給指定key的字符串值追加value,返回新字符串值的長度。下面給個例子
redis> set k hello
OK
redis> append k ,world
(integer) 11
redis> get k
"hello,world"
substr key start end 返回截取過的key的字符串值,注意並不修改key的值。下標是從0開始的,接着上面例子
redis> substr k 0 8
"hello,wor"
redis> get k
"hello,world"
主從複製
redis主從複製配置和使用都很是簡單。經過主從複製能夠容許多個slave server擁有和master server相同的數據庫副本。下面是關於redis主從複製的一些特色
1.master能夠有多個slave
2.除了多個slave連到相同的master外,slave也能夠鏈接其餘slave造成圖狀結構
3.主從複製不會阻塞master。也就是說當一個或多個slave與master進行初次同步數據時,master能夠繼續處理client發來的請求。相反slave在初次同步數據時則會阻塞不能處理client的請求。
4.主從複製能夠用來提升系統的可伸縮性,咱們能夠用多個slave 專門用於client的讀請求,好比sort操做可使用slave來處理。也能夠用來作簡單的數據冗餘
5.能夠在master禁用數據持久化,只須要註釋掉master 配置文件中的全部save配置,而後只在slave上配置數據持久化。
下面介紹下主從複製的過程
當設置好slave服務器後,slave會創建和master的鏈接,而後發送sync命令。不管是第一次同步創建的鏈接仍是鏈接斷開後的從新鏈接,master都會啓動一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存起來。後臺進程完成寫文件後,master就發送文件給slave,slave將文件保存到磁盤上,而後加載到內存恢復數據庫快照到slave上。接着master就會把緩存的命 令轉發給slave。並且後續master收到的寫命令都會經過開始創建的鏈接發送給slave。從master到slave的同步數據的命令和從 client發送的命令使用相同的協議格式。當master和slave的鏈接斷開時slave能夠自動從新創建鏈接。若是master同時收到多個 slave發來的同步鏈接命令,只會使用啓動一個進程來寫數據庫鏡像,而後發送給全部slave。
redis主從複製特色:
1.master(主)能夠擁有多個slave(從)
2.多個slave能夠鏈接同一個master外,還能夠鏈接到其餘slave
3.主從複製不會阻塞master,在同步數據時,master能夠繼續處理client請求
4.提升系統的伸縮性
5.能夠在master禁用數據持久化,註釋掉master配置文件中的全部save配置,只需在slave上配置數據持久化
#當有一條Keys數據被改變是,900秒刷新到disk一次
#save 900 1
#當有10條Keys數據被改變時,300秒刷新到disk一次
#save 300 10
#當有1w條keys數據被改變時,60秒刷新到disk一次
#save 60 10000
redis主從複製過程:
當配置好slave後,slave與master創建鏈接,而後發送sync命令。不管是第一次鏈接仍是從新鏈接,master都會啓動一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存。後臺進程完成寫文件後,master就發送文件給slave,slave將文件保存到硬盤上,再加載到內存中,接着master就會把緩存的命令轉發給slave,後續master將收到的寫命令發送給slave。若是 master同時收到多個slave發來的同步鏈接命令,master只會啓動一個進程來寫數據庫鏡像,而後發送給全部的slave。
配置
Redis的主從複製功能很是強大,一個master能夠擁有多個slave,而一個slave又能夠擁有多個slave,如此下去,造成了強大的多級 服務器集羣架構。下面我演示下怎樣在多臺服務器上進行Redis數據主從複製。這裏我假設有兩臺服務器,一臺是Linux操做系統(局域網 IP:192.168.3.159),一臺是Linux操做系統(局域網IP:192.168.3.169)此時咱們要到用到linux ,這裏咱們採用centOs5.4 ,redis採用redis-2.0.4。
這裏我使用1個master以及1個slave(master在一個Linux下,一個slave在一個Linux下,基本流程是
client -----whrite----->>>【Linux(master 192.168.3159:6379)】<<<--------------------slave----【Linux (slave 192.168.3.169:6381)】<<<<------read---------client
1.在master上修改redis.conf
#bind 192.168.3.159(可不設置)
2.在slave上修改redis.conf
port 6381(slave上端口)
bind 192.168.3.169
slaveof 192.168.3.159 6379 (設置master的Host以及Port)
3.啓動服務
首先啓動master
redis-server redis.conf
而後啓動slave
redis-server redis.conf
查看日誌出現
tail -f redis.log
* Connecting to MASTER...
[5374] 23 Aug 03:33:20 * Receiving 5479067bytes data dump from MASTER
[5374]23 Aug 03:33:21 * MASTER <-> SLAVE sync succeeded
完整配置實例(關閉主從服務器防火牆)
redis主從配置:
【master】
daemonize yes
pidfile /var/run/redis.pid
port 6379
timeout 300
loglevel verbose
logfile /usr/local/redis-2.2.12/var/log/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
maxmemory
rdbcompression yes
dbfilename dump.rdb
dir /usr/local/redis-2.2.12/var/data
requirepass redis
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
slowlog-log-slower-than 10000
slowlog-max-len 1024
vm-enabled no
vm-swap-file /tmp/redis.swap
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
activerehashing yes
【slave】
daemonize yes
pidfile /var/run/redis.pid
port 6379
timeout 300
loglevel verbose
logfile /usr/local/redis-2.2.12/var/log/redis.log
databases 16
save 900 1
save 300 10
save 60 10000
rdbcompression yes
dbfilename dump.rdb
dir /usr/local/redis-2.2.12/var/data
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
slowlog-log-slower-than 10000
slowlog-max-len 1024
vm-enabled no
vm-swap-file /tmp/redis.swap
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4
hash-max-zipmap-entries 512
hash-max-zipmap-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
activerehashing yes
slaveof 192.168.1.159 6379 #主
redis複製測試
tail -f redis.log
查看master端日誌:
[8930] 31 Jul 19:16:09 – Accepted 192.168.1.136:54774
[8930] 31 Jul 19:16:09 * Slave ask for synchronization
[8930] 31 Jul 19:16:09 * Starting BGSAVE for SYNC
[8930] 31 Jul 19:16:09 * Background saving started by pid 10782
[10782] 31 Jul 19:16:09 * DB saved on disk
[8930] 31 Jul 19:16:09 * Background saving terminated with success
[8930] 31 Jul 19:16:09 * Synchronization with slave succeeded
[8930] 31 Jul 19:16:14 – DB 0: 1 keys (0 volatile) in 4 slots HT.
[8930] 31 Jul 19:16:14 – 1 clients connected (1 slaves), 807320 bytes in use
查看slave端日誌:
[24398] 01 Aug 10:16:10 * Connecting to MASTER…
[24398] 01 Aug 10:16:10 * MASTER <-> SLAVE sync started: SYNC sent
[24398] 01 Aug 10:16:10 * MASTER <-> SLAVE sync: receiving 25 bytes from master
[24398] 01 Aug 10:16:10 * MASTER <-> SLAVE sync: Loading DB in memory
[24398] 01 Aug 10:16:10 * MASTER <-> SLAVE sync: Finished with success
[24398] 01 Aug 10:16:15 – DB 0: 1 keys (0 volatile) in 4 slots HT.
[24398] 01 Aug 10:16:15 – 1 clients connected (0 slaves), 798960 bytes in use
master端操做:
redis 127.0.0.1:6379> set k_m master
OK
slave端操做:
redis 127.0.0.1:6379> get k_m
「master」
什麼是內存文件系統了?就是操做系統把系統內存劃出一部分看成硬盤使用。你能夠像操做磁盤那樣的操做內存。但效率遠遠比硬盤來的快多了。通俗叫作內存文件系統,只要服務器不重起數據將一直都在。
redis-cli -p 6379 info 查看狀態。
操做數據庫
插入數據 127.0.0.1:6379> set name wwl OK 設置一個key-value對 查詢數據 127.0.0.1:6379> get name "wwl" 取出key所對應的value 刪除鍵值 127.0.0.1:6379> del name 刪除這個key及對應的value |
驗證鍵是否存在 127.0.0.1:6379> exists name (integer) 0 |
其中0,表明此key不存在;1表明存在
詳細的redis解釋在http://hanjie.blog.51cto.com/2684172/488374這位博主的博客有