十分簡單的redis使用說明及效能測試
redis相比很多人都知道,是一個記憶體式的key-value資料庫,存取速度極快,使用非常簡單,支援多種語言。本文對其使用進行一個簡要說明,並進行簡單測試。
1.下載與編譯
編譯十分簡單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中獲取所需資料
程式碼如下:
-
redisContext * c = redisConnect((char *)"192.168.150.135",6379);
-
const char * pData = "this is a test";
-
redisReply *reply1 = (redisReply *)redisCommand(c,"SET 100 %s",pData);
-
freeReplyObject(reply1);
-
redisReply *reply2 = (redisReply *)redisCommand(c,"GET 100");
-
printf("%s\n",reply2->str);
-
freeReplyObject(reply2);
是不是非常簡單呢?
不過需要注意的是,redis接受的資料是字串,對於二進位制資料,可以通過base64編碼來解決。具體可參看我的另一篇文章。
4.Java訪問redis
redis可以支援多種語言,當然也可以支援Java。
首先需要下載redis的java包。jedis.jar。這裡提供一個下載地址:redis的Java客戶端jedis
使用如下:
-
Jedis jedis = new Jedis("192.168.150.135");
-
jedis.set("100","this is a test");
-
String data = jedis.get("100");
5.效能測試
測試方法:向redis寫一個1M的資料,分別寫10次,讀10次,計算其耗時。分C++和Java兩個版本進行測試。
C++測試程式碼
-
#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);
-
}
測試結果:
-
CLOCKS_PER_SEC:1000000
-
GET Time used:190.000000 ms.
-
SET Time used:70.000000 ms.
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();
-
}
-
}
測試結果
-
Set used(ms):1212
-
Get used(ms):1437
6.總結
redis效率還是非常高的,讀寫1M資料的資料,耗時都在10ms左右。