地球上的大熊, 巧遇上火星的你

Redis的一點經驗分享

@ 2013-1-5 10:56 PM

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內

5 評論

使用經驗分享

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 等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32  @ 2013-1-5 10:57 PM

程式應用經驗分享

有關資料模型 (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…如果有人有興趣…熊再說明吧。(這一段我改了好幾次,還是覺得說得不清楚@@)




待完成…

發佈者 : Vic 等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32  @ 2013-1-6 12:14 AM

阿.........  
資料庫的東西.也得像學校課程一樣.了解系統工作原理.尋找合用物件嗎?
然後一個資料庫.視為一個主程式.資料庫與資料庫交換資訊.
少掉一般程式所需要的繁雜程序(api)?

發佈者 : CTR 等級: 11等級: 11等級: 11等級: 11  @ 2013-1-7 08:02 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可以做很好的配搭…

(怎麼我覺得好似沒有答到你的問題…呵呵)

發佈者 : Vic 等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32等級: 32  @ 2013-1-7 11:34 PM

超過十年沒看程式的東西.SQL PHP等東西.我都不認識...
熊小的解釋就像抄滿重點的筆記.幫助很大.

發佈者 : CTR 等級: 11等級: 11等級: 11等級: 11  @ 2013-1-8 06:42 AM

   


  可打印版本 | 推薦給朋友 | 評分