2012年1月30日 星期一

python 與 Redis 資料庫初探

image

個最近想提高公司網站的效能,之前為求先縮短第一版開發的時程,先用MySQL來實作session store,始終覺得有殺雞用牛刀的感覺。便著手研究目前非常流行的Redis,它是一種No SQL及In-Memory 的資料庫,就一個倶有Key-Value結構等特性的資料庫而言,十分適合用來做Session Store使用。


安裝

為Redis 的網站說明做的不錯,照著下載區及其安裝說明,三步驟安裝:

$ wget http://redis.googlecode.com/files/redis-2.4.6.tar.gz
$ tar xzf redis-2.4.6.tar.gz
$ cd redis-2.4.6
$ make

網站上建議使用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 pip install redis
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的目前找下列三種:








尚未進行測試,之後會陸續評估看看那個較為適合目前的使用情境。

小結

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的值,不可忽略。

沒有留言: