個最近想提高公司網站的效能,之前為求先縮短第一版開發的時程,先用MySQL來實作session store,始終覺得有殺雞用牛刀的感覺。便著手研究目前非常流行的Redis,它是一種No SQL及In-Memory 的資料庫,就一個倶有Key-Value結構等特性的資料庫而言,十分適合用來做Session Store使用。
安裝
為Redis 的網站說明做的不錯,照著下載區及其安裝說明,三步驟安裝:
|
網站上建議使用2.4 版,筆者下載2.4.6 穩定版來安裝。
目前開發環境在Mac OS X Lion及 Ubuntu 11.10上,安裝都十分順利;但無法在cygwin中編譯成功。安裝完成後,預設無密碼。直接執行 redis-server 啟動:
/home/ubuntu# redis-server /usr/local/etc/redis.conf [1264] 30 Jan 14:35:26 * Server started, Redis version 2.4.6 [1264] 30 Jan 14:35:26 * DB loaded from disk: 0 seconds [1264] 30 Jan 14:35:26 * The server is now ready to accept connections on port 6379 [1264] 30 Jan 14:35:26 - DB 0: 1 keys (0 volatile) in 4 slots HT. [1264] 30 Jan 14:35:26 - 0 clients connected (0 slaves), 717560 bytes in use [1264] 30 Jan 14:35:31 - DB 0: 1 keys (0 volatile) in 4 slots HT. [1264] 30 Jan 14:35:31 - 0 clients connected (0 slaves), 717560 bytes in use |
接著使用redis-cli 便可直接連上redis-server。(詳參照data types intro)
$ redis-cli redis 127.0.0.1:6379> get a "1" redis 127.0.0.1:6379> set a 2 OK redis 127.0.0.1:6379> get a "2" redis 127.0.0.1:6379> incr a (integer) 3 redis 127.0.0.1:6379> get a "3" redis 127.0.0.1:6379> quit |
python redis.py
|
或
sudo easy_install redis |
使用python import redis 來測試看看
ubuntu@redis:~$ python Python 2.7.2+ (default, Oct 4 2011, 20:06:09) [GCC 4.6.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import redis >>> r = redis.StrictRedis(host='localhost', port=6379, db=0) >>> r.get('a') '3' >>> r.set('b', 10) True >>> r.incr('b') 11 >>> r.get('b') '11' >>> |
就session store或engine 有關django的目前找下列三種:
- https://github.com/martinrusev/django-redis-sessions
- Followers: 44 forks: 6
- https://bitbucket.org/dpaccoud/django-redis-sessions/src
- Followers: 30 forks:2
- https://github.com/MirkoRossini/django-redis-engine
- Followers: 33 forks: 3
小結
redis安裝起來,十分簡單,也很容易使用。
目前在github 上,有許多python 相關的函式庫可供使用,值得花些時間學習看看。
相關問題?
如何停止redis-server?
強烈建議請使用shutdown 命令,來完成將記憶體中尚未資料儲存至硬碟中,否則資料可能遺失。
原因為redis 設定中,有命令save 命令在特定時間內有變更多少筆鍵值才會進行儲存。
預設設定檔如下:
# # Save the DB on disk: # # save <seconds> <changes> # # Will save the DB if both the given number of seconds and the given # number of write operations against the DB occurred. # # In the example below the behaviour will be to save: # after 900 sec (15 min) if at least 1 key changed # after 300 sec (5 min) if at least 10 keys changed # after 60 sec if at least 10000 keys changed # # Note: you can disable saving at all commenting all the "save" lines. save 900 1 save 300 10 save 60 10000 |
安全性?
在redis.conf 中,可利用requirepass 來設定,就官方文件要求需要設定強度較高且長度較長的密碼,
因若redis在較高效能的機器上,同時大量執行的密碼驗證(auth)命令時,可達15K次每秒,可能在極短時間內破解強度較弱的密碼。
就筆者看來,最好使用 iptables 或host ACL方法,只授權必要使用redis server的相關伺服器接入。
Ubuntu 11.10 執行警告訊息
[1063] 30 Jan 14:17:26 # 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. |
請務必設定vm.overcommit_memory=1的值,不可忽略。