redis是一個key-value存儲系統,和memcached類似,他支持存儲的value類型相對更多,包括String,List,set,zset。這些數據類型都支持push/pup.add/remove及取交集並集和更加豐富的操作,並且這些操作都是原子性的,在此基礎上,Redis支持各種不同方式的排序,爲了保證速率,數據都是緩存在內存中的,區別的是Redis會週期性的把更新的數據寫入磁盤把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步
=============================================================================
雲存儲
Key-Value Store 最大的特點就是它的可擴展性,這也就是它最大的優勢。所謂的可擴展性,在我看來這裏包括了兩方面內容。一方面,是指 Key-Value Store 可以支持極大的數據的存儲,它的分佈式的架構決定了只要有更多的機器,就能夠保證存儲更多的數據。另一方面,是指它可以支持數量很多的併發的查詢。對於 RDBMS,一般幾百個併發的查詢就可以讓它很吃力了,而一個 Key-Value Store,可以很輕鬆的支持上千的併發查詢。
===============================================================================
雲存儲特點:
Key-value store:一個 key-value 數據存儲系統,只支持一些基本操作,如:SET(key, value),和 GET(key) 等;
分佈式:多臺機器(nodes)同時存儲數據和狀態,彼此交換消息來保持數據一致,可視爲一個完整的存儲系統。
數據一致:所有機器上的數據都是同步更新的、不用擔心得到不一致的結果;
冗餘:所有機器(nodes)保存相同的數據,整個系統的存儲能力取決於單臺機器(node)
的能力;
容錯:如果有少數 nodes 出錯,比如重啓、當機、斷網、網絡丟包等各種 fault/fail 都
不影響整個系統的運行;
高可靠性:容錯、冗餘等保證了數據庫系統的可靠性。
====================================================================
Redis 實際應用案例:
Redis 的部署場景很多,大概分爲如下的 2 種:
第一種是應用程序直接訪問 Redis 數據庫:
第二種:第二種是應用程序直接訪問 Redis,只有當 Redis 訪問失敗時才訪問 MySQL
數據類型
作爲 Key-value 型數據庫,Redis 也提供了鍵(Key)和鍵值(Value)的映射關係。但是,除
了常規的數值或字符串,Redis 的鍵值還可以是以下形式之一:
Lists (列表)
Sets (集合)
Sorted sets (有序集合)
Hashes (哈希表)
鍵值的數據類型決定了該鍵值支持的操作。Redis 支持諸如列表、集合或有序集合的交集、
並集、查集等高級原子操作;同時,如果鍵值的類型是普通數字,Redis 則提供自增等原子
操作。
================================
主從同步
Redis 支持將數據同步到多臺從庫上,這種特性對提高讀取性能非常有益。
===============================================================
linux下下載Redis
下載Redis 的官方下載站是 http://redis.io/download,可以去上面下載最新的安裝程序下來,我寫
此文章時的的穩定版本是 2.2.12。
怎麼安裝 Redis 數據庫呢?下面將介紹 Linux 版本的安裝方法
步驟 一: 下載 Redis
下載安裝包:wget http://redis.googlecode.com/files/redis-2.2.12.tar.gz
[root@localhost 4setup]# wget http://redis.googlecode.com/files/redis-2.2.12.tar.gz
--19:06:56-- http://redis.googlecode.com/files/redis-2.2.12.tar.gz
正在解析主機 redis.googlecode.com... 74.125.71.82
Connecting to redis.googlecode.com|74.125.71.82|:80... 已連接。
已發出 HTTP 請求,正在等待迴應... 200 OK
長度:455240 (445K) [application/x-gzip]
Saving to: `redis-2.2.12.tar.gz'
100%[==========================================>] 455,240 34.8K/s in 13s
19:07:16 (34.8 KB/s) - `redis-2.2.12.tar.gz' saved [455240/455240]
[root@localhost 4setup]#
步驟 二: 編譯源程序
[root@localhost 4setup]# ll
總計 29168
-rw-r--r-- 1 root root 455240 2011-07-22 redis-2.2.12.tar.gz
[root@localhost 4setup]# tar xzf redis-2.2.12.tar.gz
[root@localhost 4setup]# cd redis-2.2.12
[root@localhost redis-2.2.12]# make
cd src && make all
make[1]: Entering directory `/root/4setup/redis-2.2.12/src'
步驟 三: 啓動 Redis 服務
src/redis-server
[root@localhost redis-2.2.12]# src/redis-server
[6246] 05 Aug 19:17:22 # Warning: no config file specified, using the default config. In order to
specify a config file use 'redis-server /path/to/redis.conf'
[6246] 05 Aug 19:17:22 * Server started, Redis version 2.2.12
[6246] 05 Aug 19:17:22 # WARNING overcommit_memory is set to 0! Background save may fail
under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to
/etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this
to take effect.
[6246] 05 Aug 19:17:22 * The server is now ready to accept connections on port 6379
[6246] 05 Aug 19:17:22 - 0 clients connected (0 slaves), 539544 bytes in use
Redis 服務端的默認連接端口是 6379
步驟 四: 將 將 Redis 作爲 Linux 服務隨機啓動
vi /etc/rc.local, 使用 vi 編輯器打開隨機啓動配置文件,並在其中加入下面一行代碼
/root/4setup/redis-2.2.12/src/redis-server
步驟 五: 客戶端連接驗證
新打開一個 Session 輸入:src/redis-cli,如果出現下面提示,那麼您就可以開始 Redis 之
旅了
[root@localhost redis-2.2.12]# src/redis-cli
redis 127.0.0.1:6379>
步驟 六: 查看 Redis 日誌
查看服務器端 session,即可對 Redis 的運行狀況進行查看或分析了
[6246] 05 Aug 19:24:33 - 0 clients connected (0 slaves), 539544 bytes in use
[6246] 05 Aug 19:24:37 - Accepted 127.0.0.1:51381
[6246] 05 Aug 19:24:38 - 1 clients connected (0 slaves), 547372 bytes in use
以上的幾個步驟就OK了!!這樣一個簡單的Redis數據庫就可以暢通無阻地運行起來了。
步驟 七: 停止 Redis 實例
最簡單的方法是在啓動實例的 session 中,直接使用 Control-C 來將實例停止。
我們還可以用客戶端來停止服務,如可以用 shutdown 來停止 Redis 實例, 具體如下:
[root@localhost redis-2.2.12]# src/redis-cli shutdown
配置 Redis
如果是一個專業的 DBA,那麼實例啓動時會加很多的參數以便使系統運行的非常穩定,這樣
就可能會在啓動時在 Redis 後面加一個參數,以指定配置文件的路徑,就象 mysql 一樣的讀
取啓動配置文件的方式來啓動數據庫。源碼編譯完成後,在 redis-2.2.12 目錄下有一個
redis.conf 文件,這個文件即是 Redis 的配置文件,用配置文件來啓動 Redis 的方法如下:
[root@localhost redis-2.2.12]# src/redis-server redis.conf
[6353] 05 Aug 19:36:45 * Server started, Redis version 2.2.12
[6353] 05 Aug 19:36:45 # WARNING overcommit_memory is set to 0! Background save may fail
under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to
/etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this
to take effect.
[6353] 05 Aug 19:36:45 * The server is now ready to accept connections on port 6379
[6353] 05 Aug 19:36:45 - 0 clients connected (0 slaves), 539540 bytes in use
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,以便能夠儘可能快的釋放內存