主題: [DB] Redis的一點經驗分享 [打印本頁]
發表人:
Vic 時間: 2013-1-5 10:56 PM 主題: Redis的一點經驗分享
Redis是memory-based的Key-Value資料庫…屬於NoSQL的一分支…
強項在於極快的寫入與讀取速度 (O(1))…多種儲存資料類型(key, list, hash, set and ordered set)…支援持久化儲存(persistent storage)…也有主從同步(master-slave)
詳情可見wiki:
http://zh.wikipedia.org/zh-tw/Redis
安裝方面很簡單…在centos/redhat下…用remi的yum repo就有最新版本
windows沒有直接支援…需要第3方的port…詳情見官網
http://redis.io/download
Remi repo 安裝:
Enterprise Linux 6 (with EPEL)
wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
Enterprise Linux 5 (with EPEL)
wget http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
rpm -Uvh remi-release-5*.rpm epel-release-5*.rpm
加好remi後…以yum來安裝redis
yum install redis --enablerepo=remi
redis的config在/etc/redis.conf…默認的設定已經蠻不錯…有需要可以修改
開始redis
service redis start
redis的port是6379…redis內也有client…
redis-cli
就可以登入localhost:6379的默認redis server。
==================
如果要compile source也很簡單, 以目前的最新版2.6.7為例:
wget http://redis.googlecode.com/files/redis-2.6.7.tar.gz
tar zxvf redis-2.6.7.tar.gz
cd redis-2.6.7
make
conf與redis-server / redis-cli在.src內
發表人:
Vic 時間: 2013-1-5 10:57 PM
使用經驗分享
redis 指令 help
1. 官網-最新最完整
2. 在redis-cli下,
help <command>
e.g.
help lrange
LRANGE key start stop
summary: Get a range of elements from a list
since: 1.0.0
group: list
小技巧:用tab可以auto-complete…h<tab>=HDEL, h<tab><tab>=HEXISTS
php應用
php下有幾個比較成熟的client…
Predis
phpredis
Rediska
其中熊認為最簡單快速的就是phpredis
如果需要自建redis class…可以用Predis...
有關predis與phpreids的分別…predis的作者寫了一篇很好的說明
不過熊個人比較喜歡用phpredis…因為安裝容易(yum install php-redis)...以c來寫…比較快…(如果redis以internet來連接的話…這方面的優勢將大大減低)
有關phpredis的API…請看phpredis在github的網頁
它也提供phpdoc…加到你的IDE上就支援autocomplete…
下圖是熊在phpStorm的效果
性能表現參考
以下只做參考…如果對性能很在意的…請根據你的application做測試
redis有提供benchmark tool…
redis-benchmark
熊的macbook pro i5 2.3GHz, 8G Ram…部份結果是
====== SET ======
10000 requests completed in 0.19 seconds
50 parallel clients
3 bytes payload
keep alive: 1
====== GET ======
10000 requests completed in 0.19 seconds
50 parallel clients
3 bytes payload
keep alive: 1
====== INCR ======
10000 requests completed in 0.20 seconds
50 parallel clients
3 bytes payload
keep alive: 1
可見get與set的速度很接近…按redis的說法…get與set都是O(1)...也就是不管多少keys…都只找/存1次
熊小也做了與MySQL的比較
case 1) 同一主機, 新增300000記錄
MySQL: 256.7819 seconds (1168 inserts per second)
Redis: 22.0615 seconds (13598 inserts per second)
結果: Redis 比MySQL快 1164%
case 2) 經Internet(本地), 新增300000記錄
MySQL: 1093.9527 seconds (274 inserts per second)
Redis: 1045.5704 seconds (287 inserts per second)
結果: Redis 比MySQL快 4.4%
case 3) 經internet(海外), 新增1000記錄 (300000需時太太太久了…)
MySQL: 278.7297 seconds (4.7 inserts per second)
Redis: 181.3516 seconds (5.9 inserts per second)
結果: Redis比MySQL快25%
待完成中…
發表人:
Vic 時間: 2013-1-6 12:14 AM
程式應用經驗分享
有關資料模型 (data type)
redis提供多種的data type…熊認為這是它比memcached好用的地方…
除了最基本的key-value外…redis也支援另外四種模型 (as of 2.6.7)
Lists (列表)
Sets (集合)
Sorted sets (有序集合)
Hashes (雜湊表)
List
List是用來儲存string的列表…次序是根據存入時間來定。
List時間排序的特性可用於timeline之類的應用…好像facebook wall的post…LPUSH加到最新…再以LRANGE來抽取n個最新的post…
List也可用於queue system…以FIFO (First In First Out)為例…RPUSH加新job到queue…LPOP則獲得第一個(也是最舊)的job…簡單的queue就可以這樣建立。
因為LPOP/RPOP都直刪除一個job…就算這個job並沒有完成…它也不會自動requeue再處理一次…所以如果需要可靠的queue system…則需要利用key與key的expire…如果有人有興趣…熊再說明吧。(這一段我改了好幾次,還是覺得說得不清楚@@)
待完成…
發表人:
CTR 時間: 2013-1-7 08:02 PM
阿.........
資料庫的東西.也得像學校課程一樣.了解系統工作原理.尋找合用物件嗎?
然後一個資料庫.視為一個主程式.資料庫與資料庫交換資訊.
少掉一般程式所需要的繁雜程序(api)?
發表人:
Vic 時間: 2013-1-7 11:34 PM
CTR兄…熊不是看得很懂你的問題…
你提到有關“資料庫與資料庫交換資訊”…熊覺得並不容易…很多品牌都不能直接交換資訊…而需要用到第3方軟件…所以很少看到同一project而用不同資料庫…e.g. SQL Server + MySQL
Redis與傳統的RDBMS有些不同…因為他比較專門…(Redis屬於key-value這支…)
以Redis為例…它沒有類似SQL的語言…應用方面要多靠編程的人設計才能做一些簡單的如select where之類的功能…
說是資料庫…Redis其實更像php內的associate array (java的maps,.NET的dictionaries)…
因為Redis是memory-based…所以很快…一些常用又不大的資料…完全可以放到裡面…而一些不常用的…可以放到MySQL…Redis + MySQL可以做很好的配搭…
(怎麼我覺得好似沒有答到你的問題…呵呵)
發表人:
CTR 時間: 2013-1-8 06:42 AM
超過十年沒看程式的東西.SQL PHP等東西.我都不認識...
熊小的解釋就像抄滿重點的筆記.幫助很大.
歡迎光臨 TWed2k (http://twed2k.org/) |
Powered by Discuz! 4.1.0 |