我正在努力完成我们需要用于我们的应用程序的缓存层。我们现在已经入围了 2 个 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
最佳答案
Redis 在全世界(数十万)个应用程序中用作缓存。这是它的主要用途。我从未听说过 MongoDB 被用作缓存(您可能会找到反例,我只是说它很不寻常——它甚至没有作为 MongoDB website 上的示例用例给出)。
这有很多充分的理由,首先是 Redis 从一开始就被设计为用作缓存(Expire 从第一个版本开始可用),并且已经在许多生产用途中证明了它在这个角色中的可行性例。
一些支持这一断言的引用资料:
来自 RedisLabs再次:
Granular per key expiry mechanisms and multiple eviction policies (LRU, TTL and more) to efficiently manage objects in the cache
Configurable notifications on expiry events for superior cache consistency and cache operations management
我可以继续列出一个非常非常长的列表。
此外,编写相关基准非常困难,对您问题的评论再次证明了这一点。为了使它们相关,您必须编写与您将在生产中使用的确切用例相匹配的基准,具有相似的硬件和软件配置。编写 500k 项然后读取它们听起来不像是生产用例。
关于Mongodb VS Redis - 性能基准 - 哪个数据库应该用于缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39813443/
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我主要使用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
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:
尝试在我的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
当我使用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
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我
我正在尝试使用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_