十分簡單的redis使用說明及性能測試
redis相比很多人都知道,是一個內存式的key-value數據庫,存取速度極快,使用非常簡單,支持多種語言。本文對其使用進行一個簡要說明,并進行簡單測試。
1.下載與編譯
可以從redis官網下載最新的源碼包:http://www.redis.io/
編譯十分簡單make既可。
2.redis安裝與配置
實際上并不需要安裝。redis編譯后會在src目錄下生成redis-server,它是一個可執行文件,即啟動redis服務。不過它需要一個配置文件。配置文件寫法網上很多了,這里直接給出一個示例:
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
然后直接運行./redis-server redis.conf就可以啟動redis服務了,是不是很方便呢?
3.C/C++訪問redis
在redis源碼目錄下有一個deps目錄,下面有一個hiredis目錄。redis編譯時會自動編譯該目錄生成libhiredis.a,通過引用hiredis.h 和 libhiredis.a就可以訪問redis了。具體步驟如下:
1)創建一個redisContext
2)通過redisContext執行命令
3)從返回redisReply中獲取所需數據
代碼如下:
<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> |
是不是非常簡單呢?
<p></p> <p>不過需要注意的是,redis接受的數據是字符串,對于二進制數據,可以通過base64編碼來解決。具體可參看我的另一篇文章。</p> <p></p> <h1><a name="t3"></a>4.Java訪問redis</h1> <p>redis可以支持多種語言,當然也可以支持Java。</p> <p>首先需要下載redis的java包。jedis.jar。這里提供一個下載地址:<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.性能測試</h1> <p>測試方法:向redis寫一個1M的數據,分別寫10次,讀10次,計算其耗時。分C++和Java兩個版本進行測試。<br> </p> <h2><a name="t5"></a>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>測試結果 <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測試代碼<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> |
測試結果
<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.總結
<p></p> <p>redis效率還是非常高的,讀寫1M數據的數據,耗時都在10ms左右。<br> </p> <p><br> </p> <pre></pre> <pre></pre> </pre></pre></pre></pre></pre></pre> |
posted on 2014-01-16 11:38 順其自然EVO 閱讀(1290) 評論(0) 編輯 收藏 所屬分類: 性能測試