1. 程式人生 > >十分簡單的redis使用說明及效能測試

十分簡單的redis使用說明及效能測試

redis相比很多人都知道,是一個記憶體式的key-value資料庫,存取速度極快,使用非常簡單,支援多種語言。本文對其使用進行一個簡要說明,並進行簡單測試。

1.下載與編譯

編譯十分簡單make既可。

2.redis安裝與配置

實際上並不需要安裝。redis編譯後會在src目錄下生成redis-server,它是一個可執行檔案,即啟動redis服務。不過它需要一個配置檔案。配置檔案寫法網上很多了,這裡直接給出一個示例:

  1. daemonize yes

  2. pidfile /tmp/redis/var/redis.pid

  3. port 6379

  4. timeout 300

  5. loglevel debug

  6. logfile /tmp/redis/var/redis.log

  7. databases 16

  8. save 900 1

  9. save 300 10

  10. save 60 10000

  11. rdbcompression yes

  12. dbfilename dump.rdb

  13. dir /tmp/redis/var/

  14. appendonly no

  15. appendfsync always

  16. #glueoutputbuf yes

  17. #shareobjects no

  18. #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中獲取所需資料

程式碼如下: 

  1. redisContext * c = redisConnect((char *)"192.168.150.135",6379);

  2. const char * pData = "this is a test";

  3. redisReply *reply1 = (redisReply *)redisCommand(c,"SET 100 %s",pData);

  4. freeReplyObject(reply1);

  5. redisReply *reply2 = (redisReply *)redisCommand(c,"GET 100");

  6. printf("%s\n",reply2->str);

  7. freeReplyObject(reply2);

是不是非常簡單呢?

不過需要注意的是,redis接受的資料是字串,對於二進位制資料,可以通過base64編碼來解決。具體可參看我的另一篇文章。

4.Java訪問redis

redis可以支援多種語言,當然也可以支援Java。

首先需要下載redis的java包。jedis.jar。這裡提供一個下載地址:redis的Java客戶端jedis

使用如下:

  1. Jedis jedis = new Jedis("192.168.150.135");

  2. jedis.set("100","this is a test");

  3. String data = jedis.get("100");

5.效能測試


測試方法:向redis寫一個1M的資料,分別寫10次,讀10次,計算其耗時。分C++和Java兩個版本進行測試。

C++測試程式碼

  1. #include <stdio.h>

  2. #include "hiredis.h"

  3. #include <string.h>

  4. #include <time.h>

  5. int main(int argc, char **argv)

  6. {

  7. printf("CLOCKS_PER_SEC:%d\n",CLOCKS_PER_SEC);

  8. redisContext *c;

  9. redisReply *reply;

  10. c = redisConnect((char *)"one-60",6379);

  11. char * pData;

  12. reply = (redisReply *)redisCommand(c,"GET 0");

  13. int size = strlen(reply->str);

  14. pData = new char[size+1];

  15. strcpy(pData,reply->str);

  16. freeReplyObject(reply);

  17. clock_t start, finish;

  18. start = clock();

  19. for(int i=0;i<10; i++)

  20. {

  21. reply = (redisReply *)redisCommand(c,"GET %d",i);

  22. freeReplyObject(reply);

  23. }

  24. finish = clock();

  25. double duration = (double)(finish - start) / CLOCKS_PER_SEC*1000;

  26. printf("GET Time used:%f ms.\n",duration);

  27. start = clock();

  28. for(int i=0;i<10; i++)

  29. {

  30. reply = (redisReply *)redisCommand(c,"SET %d %s",i,pData);

  31. freeReplyObject(reply);

  32. }

  33. finish = clock();

  34. duration = (double)(finish - start) / CLOCKS_PER_SEC*1000;

  35. printf("SET Time used:%f ms.\n",duration);

  36. delete []pData;

  37. redisFree(c);

  38. }

測試結果: 

  1. CLOCKS_PER_SEC:1000000

  2. GET Time used:190.000000 ms.

  3. SET Time used:70.000000 ms.

Java測試程式碼

  1. import java.io.BufferedReader;

  2. import java.io.File;

  3. import java.io.FileReader;

  4. import java.util.Date;

  5. import redis.clients.jedis.Jedis;

  6. public class JedisTest {

  7. public static void main(String[] args)

  8. {

  9. Jedis jedis = new Jedis("10.100.211.232");

  10. String f = "/tmp/e2.txt.backup";

  11. try

  12. {

  13. File file = new File(f);

  14. BufferedReader reader = new BufferedReader(new FileReader(file));

  15. String data = reader.readLine();

  16. reader.close();

  17. Date start = new Date();

  18. for(int i=0; i<10; i++)

  19. {

  20. jedis.set(i+"", data);

  21. }

  22. Date end = new Date();

  23. System.out.println("Set used(ms):"+(end.getTime()-start.getTime()));

  24. start = new Date();

  25. for(int i=0; i<10; i++)

  26. {

  27. String v = jedis.get(i+"");

  28. }

  29. end = new Date();

  30. System.out.println("Get used(ms):"+(end.getTime()-start.getTime()));

  31. }catch (Exception e)

  32. {

  33. e.printStackTrace();

  34. }

  35. jedis.disconnect();

  36. }

  37. }

測試結果

  1. Set used(ms):1212

  2. Get used(ms):1437

6.總結


redis效率還是非常高的,讀寫1M資料的資料,耗時都在10ms左右。