系統的資料越來越多,也越來越複雜,許多資料需求必須仰賴高速的磁碟I/O,但再快的磁碟也沒有記憶體快,如果將一些可以化成Key-Value的資料放進記憶體中,不僅可以減少資料庫資源的使用,也能加速系統的反應。
一直以來,資料庫的速度幾乎箝制了使用者對網站、系統的使用感受,然而要提升資料庫速度的方式不外乎如:換更多核心/速度更快的CPU、增加更多記憶體、更改磁碟架構提高I/O...等,有人會說:『修改SQL呀!』,但我也要先看懂好幾年前前輩自己都看不懂的SQL啊!上禮拜我寫的程式碼有註解都快要看不懂了,何況反正公司本來就有升級硬體的預算,我幹嘛花好幾倍的時間折磨自己呢?
但是按經驗,更換硬體配置來達到提高資料庫效能這種做法只能是暫時的,原因有二,一:資料會增加、系統會老化、升級不會永無止盡;二:因為效能變好了,新寫的SQL又開始恣意的Join了,又開始寫一堆消耗效能的語法;這都是不爭的事實。
可以分析一下資料庫中的Table,如果有很多資料是可以被化為Key-Value的形式,那現在有一個很棒的良藥,那就是No-SQL記憶體資料庫:Redis (官方網站),目前穩定版本來到3.2.8,Redis提供單機、HA架構,也可以設定資料自動過期...等功能。
有人一定會說:『資料放在記憶體裡面,萬一系統斷電或Crash,那資料不就都不見了,很危險!』,這句話是對,也是錯,對的部分是系統關機、Crash後,資料確實會消失,這是記憶體的特性,沒有辦法改變;錯的部分是你不會把資料放在記憶體資料庫中不寫回資料庫,因為記憶體資料庫只是充當資料庫的快取,所以嚴格來說他是以類似資料庫的形式將資料存在記憶體的一種資料存放技術,所以並不危險,若記憶體資料庫沒了,你的程式仍然必須到傳統資料庫去取得資料,然後待記憶體資料庫恢復服務後,將資料寫進去當作快取來使用。當然,上述的情境只是記憶體資料庫眾多解決方案中的一種,還有其他更多的解決方案等著被各家工程師挖掘呢!
這次,選用號稱『最穩定的伺服器作業系統:CentOS』來作為Redis記憶體資料庫的運作環境,相關版本如下:
- CentOS 7 x64
- Redis 3.2.8
其他必須要安裝的套件及版本如下:
- gcc.x86_64 4.8.5-11.e17
- make.x86_64 1:3.82-23.e17
- tcl.x86_64 1:8.5.13-8.e17
- wget.x86_64 1.14-13.e17
第一步:安裝gcc, make, tcl,若是最小安裝的CentOS 7,還必須額外安裝wget。
[root@localhost peter]# yum install gcc make tcl wget
第二步:使用wget下載Redis的安裝包,下載連結點我。
[root@localhost peter]# wget http://download.redis.io/releases/redis-3.2.8.tar.gz
第一步:解壓縮安裝檔。
[root@localhost peter]# tar zxvf redis-3.2.8.tar.gz
第二步:進到Redis安裝包的資料夾並編譯Redis,編譯需要花費一點時間,視伺服器效能而定囉!不過通常也是幾分鐘而已!
[root@localhost peter]# cd redis-3.2.8
[root@localhost redis-3.2.8]# make && make install
第三步:編譯完成後進入到utils資料夾,執行安裝script進行安裝。
[root@localhost redis-3.2.8]# cd utils/
[root@localhost utils]# ./install_server.sh
第四步:確認或更改安裝的設定,若沒有要更改任何設定,完全按照預設的設定檔,那就一直按『Enter』就可以了。
Please select the redis port for this instance: [6379]
Please select the redis config file name [/etc/redis/6379.conf]
Please select the redis log file name [/var/log/redis_6379.log]
Please select the data directory for this instance [/var/lib/redis/6379]
Please select the redis executable path [/usr/local/bin/redis-server]
最後系統會將設定值都在列出來讓你確定,沒問題就按下『Enter』安裝囉!否則就按Ctrl-C來取消安裝。
Selected config:
Port : 6379
Config file : /etc/redis/6379.conf
Log file : /var/log/redis_6379.log
Data dir : /var/lib/redis/6379
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
安裝完成後,系統會提示安裝成功。
Installation successful!
第一步:剛剛安裝完畢,有的時候你會發現明明系統提示說Redis已經在運作了,但卻好像沒有,這時你可以使用systemctl來確認。
[root@localhost utils]# systemctl status redis_6379.service
● redis_6379.service - LSB: start and stop redis_6379
Loaded: loaded (/etc/rc.d/init.d/redis_6379; bad; vendor preset: disabled)
Active: inactive (dead)
Docs: man:systemd-sysv-generator(8)
第二步:如果Active的值為inactive的話,那就代表Redis並沒有被成功啟動,這時我們只要執行以下語法:
[root@localhost utils]# systemctl start redis_6379.service
然後再次檢查Redis的啟動狀態:
[root@localhost utils]# systemctl status redis_6379.service
● redis_6379.service - LSB: start and stop redis_6379
Loaded: loaded (/etc/rc.d/init.d/redis_6379; bad; vendor preset: disabled)
Active: active (exited) since Sat 2017-04-15 19:59:40 CST; 2s ago
Docs: man:systemd-sysv-generator(8)
Process: 13473 ExecStart=/etc/rc.d/init.d/redis_6379 start (code=exited, status=0/SUCCESS)
Apr 15 19:59:40 localhost.localdomain systemd[1]: Starting LSB: start and stop redis_6379...
Apr 15 19:59:40 localhost.localdomain redis_6379[13473]: /var/run/redis_6379.pid exists, process is already ru...hed
Apr 15 19:59:40 localhost.localdomain systemd[1]: Started LSB: start and stop redis_6379.
Hint: Some lines were ellipsized, use -l to show in full.
Active的值是active了,表示Redis已經正常在運作。
第三步:使用Redis的命令來確認系統正常運作。
[peter@localhost ~]$ redis-cli ping
PONG
若系統回覆『PONG』,表示Redis已經正常運作了。