redis入門

什麼是redis
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,以便能夠儘可能快的釋放內存



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章