十分簡(jiǎn)單的redis使用說(shuō)明及性能測(cè)試
redis相比很多人都知道,是一個(gè)內(nèi)存式的key-value數(shù)據(jù)庫(kù),存取速度極快,使用非常簡(jiǎn)單,支持多種語(yǔ)言。本文對(duì)其使用進(jìn)行一個(gè)簡(jiǎn)要說(shuō)明,并進(jìn)行簡(jiǎn)單測(cè)試。
1.下載與編譯
可以從redis官網(wǎng)下載最新的源碼包:http://www.redis.io/
編譯十分簡(jiǎn)單make既可。
2.redis安裝與配置
實(shí)際上并不需要安裝。redis編譯后會(huì)在src目錄下生成redis-server,它是一個(gè)可執(zhí)行文件,即啟動(dòng)redis服務(wù)。不過(guò)它需要一個(gè)配置文件。配置文件寫法網(wǎng)上很多了,這里直接給出一個(gè)示例:
daemonize yes pidfile /tmp/redis/var/redis.pid port 6379 timeout 300 loglevel debug logfile /tmp/redis/var/redis.log databases 16 save 900 1 save 300 10 save 60 10000 rdbcompression yes dbfilename dump.rdb dir /tmp/redis/var/ appendonly no appendfsync always #glueoutputbuf yes #shareobjects no #shareobjectspoolsize 1024 |
將其保存為redis.conf
然后直接運(yùn)行./redis-server redis.conf就可以啟動(dòng)redis服務(wù)了,是不是很方便呢?
3.C/C++訪問(wèn)redis
在redis源碼目錄下有一個(gè)deps目錄,下面有一個(gè)hiredis目錄。redis編譯時(shí)會(huì)自動(dòng)編譯該目錄生成libhiredis.a,通過(guò)引用hiredis.h 和 libhiredis.a就可以訪問(wèn)redis了。具體步驟如下:
1)創(chuàng)建一個(gè)redisContext
2)通過(guò)redisContext執(zhí)行命令
3)從返回redisReply中獲取所需數(shù)據(jù)
代碼如下:
<pre code_snippet_id="151033" snippet_file_name="blog_20140110_2_9509153" name="code" class="cpp">redisContext * c = redisConnect((char *)"192.168.150.135",6379); const char * pData = "this is a test"; <pre code_snippet_id="151033" snippet_file_name="blog_20140110_2_9509153" name="code" class="cpp">redisReply *reply1 = (redisReply *)redisCommand(c,"SET 100 %s",pData); <pre code_snippet_id="151033" snippet_file_name="blog_20140110_2_9509153" name="code" class="cpp"><pre code_snippet_id="151033" snippet_file_name="blog_20140110_2_9509153" name="code" class="cpp"><pre code_snippet_id="151033" snippet_file_name="blog_20140110_2_9509153" name="code" class="cpp">freeReplyObject(reply1);</pre> <pre></pre> <pre></pre> <pre></pre> <pre></pre> <pre></pre> <p></p> <pre></pre> <pre></pre> <br> <pre code_snippet_id="151033" snippet_file_name="blog_20140110_3_730653" name="code" class="cpp"><pre code_snippet_id="151033" snippet_file_name="blog_20140110_3_730653" name="code" class="cpp"><pre code_snippet_id="151033" snippet_file_name="blog_20140110_3_730653" name="code" class="cpp">redisReply *reply2 = (redisReply *)redisCommand(c,"GET 100");</pre> <pre></pre> <pre></pre> printf("%s\n",reply2->str);<br> freeReplyObject(reply2);<br> <pre></pre> <pre></pre> <pre></pre> |
是不是非常簡(jiǎn)單呢?
<p></p> <p>不過(guò)需要注意的是,redis接受的數(shù)據(jù)是字符串,對(duì)于二進(jìn)制數(shù)據(jù),可以通過(guò)base64編碼來(lái)解決。具體可參看我的另一篇文章。</p> <p></p> <h1><a name="t3"></a>4.Java訪問(wèn)redis</h1> <p>redis可以支持多種語(yǔ)言,當(dāng)然也可以支持Java。</p> <p>首先需要下載redis的java包。jedis.jar。這里提供一個(gè)下載地址:<a target="_blank" >redis的Java客戶端jedis</a></p> <p>使用如下:</p> <p></p> <pre code_snippet_id="151033" snippet_file_name="blog_20140110_4_2824204" name="code" class="java">Jedis jedis = new Jedis("192.168.150.135"); jedis.set("100","this is a test"); String data = jedis.get("100"); </pre><br> <br> <p></p> <h1><a name="t4"></a>5.性能測(cè)試</h1> <p>測(cè)試方法:向redis寫一個(gè)1M的數(shù)據(jù),分別寫10次,讀10次,計(jì)算其耗時(shí)。分C++和Java兩個(gè)版本進(jìn)行測(cè)試。<br> </p> <h2><a name="t5"></a>C++測(cè)試代碼</h2> <p></p> <pre code_snippet_id="151033" snippet_file_name="blog_20140110_5_8505805" name="code" class="cpp">#include <stdio.h> #include "hiredis.h" #include <string.h> #include <time.h> int main(int argc, char **argv) { printf("CLOCKS_PER_SEC:%d\n",CLOCKS_PER_SEC); redisContext *c; redisReply *reply; c = redisConnect((char *)"one-60",6379); char * pData; reply = (redisReply *)redisCommand(c,"GET 0"); int size = strlen(reply->str); pData = new char[size+1]; strcpy(pData,reply->str); freeReplyObject(reply); clock_t start, finish; start = clock(); for(int i=0;i<10; i++) { reply = (redisReply *)redisCommand(c,"GET %d",i); freeReplyObject(reply); } finish = clock(); double duration = (double)(finish - start) / CLOCKS_PER_SEC*1000; printf("GET Time used:%f ms.\n",duration); start = clock(); for(int i=0;i<10; i++) { reply = (redisReply *)redisCommand(c,"SET %d %s",i,pData); freeReplyObject(reply); } finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC*1000; printf("SET Time used:%f ms.\n",duration); delete []pData; redisFree(c); } </pre>測(cè)試結(jié)果 <p></p> <p></p> <pre code_snippet_id="151033" snippet_file_name="blog_20140110_6_1363508" name="code" class="plain">CLOCKS_PER_SEC:1000000 GET Time used:190.000000 ms. SET Time used:70.000000 ms. </pre><br> <br> <p></p> <h2><a name="t6"></a>Java測(cè)試代碼<br> </h2> <p></p> <pre code_snippet_id="151033" snippet_file_name="blog_20140110_7_633160" name="code" class="java">import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util.Date; import redis.clients.jedis.Jedis; public class JedisTest { public static void main(String[] args) { Jedis jedis = new Jedis("10.100.211.232"); String f = "/tmp/e2.txt.backup"; try { File file = new File(f); BufferedReader reader = new BufferedReader(new FileReader(file)); String data = reader.readLine(); reader.close(); Date start = new Date(); for(int i=0; i<10; i++) { jedis.set(i+"", data); } Date end = new Date(); System.out.println("Set used(ms):"+(end.getTime()-start.getTime())); start = new Date(); for(int i=0; i<10; i++) { String v = jedis.get(i+""); } end = new Date(); System.out.println("Get used(ms):"+(end.getTime()-start.getTime())); }catch (Exception e) { e.printStackTrace(); } jedis.disconnect(); } }</pre><br> |
測(cè)試結(jié)果
<p></p> <p></p> <pre code_snippet_id="151033" snippet_file_name="blog_20140110_8_8615272" name="code" class="plain">Set used(ms):1212 Get used(ms):1437</pre><br> |
6.總結(jié)
<p></p> <p>redis效率還是非常高的,讀寫1M數(shù)據(jù)的數(shù)據(jù),耗時(shí)都在10ms左右。<br> </p> <p><br> </p> <pre></pre> <pre></pre> </pre></pre></pre></pre></pre></pre> |
posted on 2014-01-16 11:38 順其自然EVO 閱讀(1296) 評(píng)論(0) 編輯 收藏 所屬分類: 性能測(cè)試