我正在努力完成我们需要用于应用程序的缓存层。我们现在已经入围Redis和Mongodb。我不确定哪一个用作缓存。因此,我考虑对两者进行性能测试,然后根据结果进行比较。
现在,我已经阅读了很多关于每个优点的内容,看起来推荐的方法是将Mongodb作为数据存储层,将Redis作为缓存层放在Web应用程序前面以避免请求击中原点。
我已经分享了以下结果。
但根据我的表现结果,redis的表现与mongodb的表现并不相同。那么我们可以有把握地说mongodb是缓存然后redis的更好选择吗?
请让我知道你们的想法。我也不是Redis或mongodb的专家所以如果我在redis或mongodb做错了什么,请告诉我。
我可以修复并重新测试。
主机配置:
Redis版本:3.2.1(Windows 64位版本) Mongo版本:3.2.5(Windows 64位版本)
Redis.java
package com.redis.mogo.perftest;
import redis.clients.jedis.Jedis;
public class RedisJava {
public static void main(String args[]) {
Jedis jedis = new Jedis("localhost");
System.out.println("Connection to server sucessfully");
System.out.println("Server is running: "+jedis.ping());
int noOfElements = 500000;
long startime = System.currentTimeMillis();
for (int i=0;i<noOfElements;i++) {
jedis.set(String.valueOf(i), "some fastastic value" +i);
}
System.out.println("Total Time to write" + noOfElements +" is "+ ((System.currentTimeMillis() - startime)/1000));
startime = System.currentTimeMillis();
for (int i=0;i<noOfElements;i++) {
jedis.get(String.valueOf(i));
// System.out.println(jedis.get(String.valueOf(i)));
}
jedis.close();
System.out.println("Total Time to read " + noOfElements +" is "+ ((System.currentTimeMillis() - startime)/1000));
}
}
Mongo.java
package com.redis.mogo.perftest;
import com.mongodb.BasicDBObject;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.Mongo;
public class MongoJava {
public static void main(String args[]) {
Mongo mongo = new Mongo("localhost", 27017);
DB db = mongo.getDB("perftest");
DBCollection collection = db.getCollection("users");
int noOfElements = 500000;
long startime = System.currentTimeMillis();
for (int i=0;i<noOfElements;i++) {
BasicDBObject document = new BasicDBObject();
document.put(String.valueOf(i), "some fastastic value" +i);
collection.insert(document);
}
System.out.println("Total Time to write" + noOfElements +" is "+ ((System.currentTimeMillis() - startime)/1000));
startime = System.currentTimeMillis();
int i=0;
DBCursor cursor = collection.find();
while (cursor.hasNext()) {
String str = (String)cursor.next().get(String.valueOf(i));
//System.out.println(str);
i++;
}
System.out.println("Total Time to read " + noOfElements +" is "+ ((System.currentTimeMillis() - startime)/1000));
collection.drop();
}
}
Redis自定义配置文件:
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "server_log.txt"
syslog-enabled yes
syslog-ident redis
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
maxmemory 10gb
appendonly no
appendfilename "appendonly.aof"
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
lua-time-limit 5000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
答案 0 :(得分:3)
Redis在全球数百个应用程序中用作缓存。这是它的主要用途。我从来没有听说过将MongoDB用作缓存(你可能会发现反例,我的意思是它很不寻常 - 它甚至不作为MongoDB website上的示例用例)。
有很多很好的理由,第一个是Redis从开始设计用作缓存(Expire可从第一个版本获得),并证明了它在这个角色中的可行性生产用例。
支持这一肯定的一些参考文献:
再次来自RedisLabs:
用于有效管理缓存中对象的每个密钥到期机制和多个驱逐策略(LRU,TTL等)的粒度
有关到期事件的可配置通知,以实现卓越的缓存一致性和缓存操作管理
我可以继续列出非常长的名单。
此外,编写相关基准非常困难,对您的问题的评论再次证明了这一点。要使它们相关,您必须编写与您将在生产中使用的确切用例相匹配的基准,并使用类似的硬件和软件配置。写入500k项目然后阅读它们听起来不像是一个生产用例。
答案 1 :(得分:0)
Redis旨在用作缓存解决方案,因为它可以将完整数据保存在主内存(RAM)中。如果您希望持久存储数据,则应使用Mongo DB。
我使用的应用程序之一是使用Mongo db来保存TB的数据,Redis db作为缓存解决方案。
希望这有帮助。