qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          十分簡單的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)  編輯  收藏 所屬分類: 性能測試

          <2014年1月>
          2930311234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 区。| 房产| 台中市| 山西省| 子洲县| 耒阳市| 许昌县| 工布江达县| 四会市| 盐源县| 象州县| 黄浦区| 铜梁县| 东丽区| 神池县| 五峰| 西宁市| 浮山县| 台北县| 扶绥县| 化隆| 黄平县| 上饶县| 满洲里市| 东明县| 齐齐哈尔市| 融水| 江西省| 三江| 平原县| 凤山市| 铜陵市| 马尔康县| 滨海县| 曲松县| 连南| 永吉县| 霞浦县| 长乐市| 宜州市| 巴青县|