Mongodb VS Redis - 性能基准 - 哪个DB应该用于缓存?

时间:2016-10-02 02:59:27

标签: mongodb caching redis mongodb-java

我正在努力完成我们需要用于应用程序的缓存层。我们现在已经入围Redis和Mongodb。我不确定哪一个用作缓存。因此,我考虑对两者进行性能测试,然后根据结果进行比较。

现在,我已经阅读了很多关于每个优点的内容,看起来推荐的方法是将Mongodb作为数据存储层,将Redis作为缓存层放在Web应用程序前面以避免请求击中原点。

我已经分享了以下结果。

但根据我的表现结果,redis的表现与mongodb的表现并不相同。那么我们可以有把握地说mongodb是缓存然后redis的更好选择吗?

请让我知道你们的想法。我也不是Redis或mongodb的专家所以如果我在redis或mongodb做错了什么,请告诉我。

我可以修复并重新测试。

主机配置:

  • Windows 10 Pro
  • Intel Core i5 2520M CPU 2.50Ghz
  • RAM 16GB

enter image description here

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

2 个答案:

答案 0 :(得分:3)

Redis在全球数百个应用程序中用作缓存。这是它的主要用途。我从来没有听说过将MongoDB用作缓存(你可能会发现反例,我的意思是它很不寻常 - 它甚至不作为MongoDB website上的示例用例)。

有很多很好的理由,第一个是Redis从开始设计用作缓存(Expire可从第一个版本获得),并证明了它在这个角色中的可行性生产用例。

支持这一肯定的一些参考文献:

我可以继续列出非常长的名单。

此外,编写相关基准非常困难,对您的问题的评论再次证明了这一点。要使它们相关,您必须编写与您将在生产中使用的确切用例相匹配的基准,并使用类似的硬件和软件配置。写入500k项目然后阅读它们听起来不像是一个生产用例。

答案 1 :(得分:0)

Redis旨在用作缓存解决方案,因为它可以将完整数据保存在主内存(RAM)中。如果您希望持久存储数据,则应使用Mongo DB。

我使用的应用程序之一是使用Mongo db来保存TB的数据,Redis db作为缓存解决方案。

希望这有帮助。