草庐IT

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

coder 2023-07-18 原文

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

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

我已经在下面分享了结果。

但是根据我的性能结果,redis 的性能与 mongodb 相差无几。那么我们可以肯定地说 mongodb 是比 redis 更好的缓存选择吗?

请告诉我你们的想法。此外,我不是 Redis 或 mongodb 方面的专家,所以如果我在 redis 或 mongodb 中做错了什么,请告诉我。

我可以修复并重做测试。

主机配置:

  • Windows 10 专业版
  • 英特尔酷睿 i5 2520M CPU 2.50Ghz
  • 内存 16GB

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

最佳答案

Redis 在全世界(数十万)个应用程序中用作缓存。这是它的主要用途。我从未听说过 MongoDB 被用作缓存(您可能会找到反例,我只是说它很不寻常——它甚至没有作为 MongoDB website 上的示例用例给出)。

这有很多充分的理由,首先是 Redis 从一开始就被设计为用作缓存(Expire 从第一个版本开始可用),并且已经在许多生产用途中证明了它在这个角色中的可行性例。

一些支持这一断言的引用资料:

我可以继续列出一个非常非常长的列表。

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

关于Mongodb VS Redis - 性能基准 - 哪个数据库应该用于缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39813443/

有关Mongodb VS Redis - 性能基准 - 哪个数据库应该用于缓存?的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  7. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  8. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  9. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐