问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

游戏服务器使用MongoDB作为数据库,还有必要使用Redis缓存吗

发布网友 发布时间:2022-04-24 19:42

我来回答

2个回答

懂视网 时间:2022-04-29 23:52

在node与mongodb的项目中也仍然会存在类似问题,本文参考了mongoose-redis-cache这个插件。

https://github.com/conancat/mongoose-redis-cache

该插件还不太完善,但基本的思路是很简单的,初始化一个redis客户端,然后重写mongoose的exec方法,将exec的参数设置为redis的key,将数据库返回的结果设置为对应的value。

每次操作时优先读取redis。

代码如下:

// Generated by CoffeeScript 1.5.0
var mongooseRedisCache, redis, _;

redis = require("redis");

_ = require("underscore");

mongooseRedisCache = function(mongoose, options, callback) {
 var client, host, pass, port, redisOptions;
 if (options == null) {
 options = {};
 }
 host = options.host || "";
 port = options.port || "";
 pass = options.pass || "";
 redisOptions = options.options || {};
 mongoose.redisClient = client = redis.createClient(port, host, redisOptions);
 if (pass.length > 0) {
 client.auth(pass, function(err) {
 if (callback) {
 return callback(err);
 }
 });
 }

//这里做了改动,原来是execFind,在我当前的Mongoose版本下无法使用 mongoose.Query.prototype._exec = mongoose.Query.prototype.exec; mongoose.Query.prototype.exec = function(callback) { var cb, expires, fields, key, model, query, schemaOptions, self; self = this; model = this.model; query = this._conditions; options = this._optionsForExec(model); fields = _.clone(this._fields); schemaOptions = model.schema.options; expires = schemaOptions.expires || 60; if (!schemaOptions.redisCache && options.lean) { return mongoose.Query.prototype._exec.apply(self, arguments); } key = JSON.stringify(query) + JSON.stringify(options) + JSON.stringify(fields); cb = function(err, result) { var docs; if (err) { return callback(err); } if (!result) { return mongoose.Query.prototype._exec.call(self, function(err, docs) { var str; if (err) { return callback(err); } str = JSON.stringify(docs); client.set(key, str); client.expire(key, expires); return callback(null, docs); }); } else { docs = JSON.parse(result); return callback(null, docs); } }; client.get(key, cb); return this; }; }; module.exports = mongooseRedisCache;

写测试用例如下:

var mongoose = require(‘mongoose‘);

var async = require(‘async‘);
var mongooseRedisCache = require("mongoose-redis-cache");
mongooseRedisCache(mongoose);
var Schema = mongoose.Schema;

mongoose.connect(‘mongodb://localhost/cachetest‘);

var user = new Schema({
 username:{
 type:String,
 index:true
 },
 password:String
});

user.set(‘redisCache‘, true);

var userModel = mongoose.model(‘user‘, user);

var entity = new userModel({
 username:‘fredric‘,
 password:‘sinny‘
});

var users = [];
for(var i = 0; i < 1000; i++){
 users.push({
 username:‘fredric‘ + i,
 password:‘sinny‘ + i
 });
}

function testCache(){

 function datainit(item,cb){
 var entity = new userModel(item);
 entity.save(function(err){
  cb(err);
 });
 }
 
 async.mapSeries(users, datainit, function(err, results){
 
 console.log(‘datainit finished‘);
 
 var timestamp = new Date().valueOf();
 
 var round = [];
 for(var i = 0; i < 2000; i++){
  round.push(i);
 }
 
 //利用缓存
 function test(item,cb){
  query = userModel.find({‘username‘:‘fredric101‘});
  query.lean();
  query.exec(function(err, result){
  cb(err);
  });
 }
 
 
 //不利用缓存
 function test_nocache(item,cb){
  query = userModel.find({}).setOptions({nocache: true});
  query.where("username", "fredric101");
  query.exec(function(err, result){
  cb(err);
  });
 }
 
 async.mapSeries(round, test_nocache, function(err, results){
  console.log(new Date().valueOf() - timestamp);
 });
 }); 
}
testCache();

测试结果还是比较明显的,在我本地笔记本上(安装redis + mongodb),上述测试用例执行:

1、无缓存、无索引:21501ms

2、无缓存、有索引:1966ms

3、有缓存、有索引:281ms

mongodb(mongoose-redis-cache)

标签:

热心网友 时间:2022-04-29 21:00

mongodb和memcached(或redis)并不是竞争关系,更多的是一种协作共存的关系。mongodb本质上还是硬盘数据库,在复杂查询时仍然会有大量的资源消耗,而且在处理复杂逻辑时仍然要不可避免地进行多次查询。这时就需要memcached这样的内存数据库来作为中间层进行缓存和加速。比如在某些复杂页面的场景中,整个页面的内容如果都从mongodb中查询,可能要几十个查询语句,耗时很长。如果需求允许,则可以把整个页面的对象缓存至memcached中,定期更新。这样mongodb和memcached就能很好地协作起来。
游戏服务器使用MongoDB作为数据库,还有必要使用Redis缓存吗

1、redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上。2、redis具备binlog功能,可以将所有操作写入日志,当redis出现故障,可依照binlog进行数据恢复。3、redis支持virtual memory,可以限定内存使用大小,当数据超过阈值,则通过类似lru的算法把内存中的最不常用数据保存到硬盘的页面文件中。4、r...

可以把游戏lol redis吗

使用MongoDB作为数据库,还是有必要使用Redis缓存的。 比如缓存一些top排名等信息。

用了mongodb 还需要使用redis吗

MongoDB不多说,不是一个类型的东西,Redis相对Memcached来说功能和特性上的优势已经很明显了。而对于性能,Redis作者的说法是平均到单个核上的性能,在单条数据不大的情况下Redis更好。为什么这么说呢,理由就是Redis是单线程运行的。因为是单线程运行,所以和Memcached的多线程相比,整体性能肯定会偏低。...

MongoDB 或者 redis 可以替代 memcached 吗

mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据。mongodb和memcached不存在谁替换谁的问题。和memcached更为接近的是redis。它们都是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查...

redis与mongodb有哪些区别

mongodb更吃内存,因为当mongo发现内存不够的时候,是以2的指数级别来申请内存的。所以一般都建议把mongodb单独放。 其实可以说redis更像缓存机制,cookie,也可以设定数据的过期时间,当然也可以永久存储(但是好像稍逊色?)。mongodb是文档式的存储。内存管理机制:Redis数据全部存在内存,定期写入磁盘,...

mongodb和redis区别是什么?

首先,Redis更像是一个内存驱动的“超级缓存”,它主要将数据存储在内存中,操作便捷,类似操作变量,其“缓存”特性明显。数据的增删改查非常直观,适合对速度有极高要求的场景,如实时数据处理和会话存储。相比之下,MongoDB则定位为一个功能更为丰富的“数据库”,它的设计更接近关系型数据库,支持...

mongodb和redis区别是什么?

扩展性和使用场景:MongoDB是分布式数据库系统,具有良好的水平扩展性。它适用于处理大规模数据和高并发场景下的数据存储需求,特别适用于大数据、实时分析和微服务架构等领域。MongoDB适合作为后端数据库存储大量的结构化或非结构化数据。Redis由于其快速的读写性能和内存管理机制,更适合作为缓存层使用。它...

mongodb和redis区别是什么?

就Redis和MongoDB来说,大家一般称之为Redis缓存、MongoDB数据库。这也是有道有理有根据的,Redis主要把数据存储在内存中,其“缓存”的性质远大于其“数据存储“的性质,其中数据的增删改查也只是像变量操作一样简单;MongoDB却是一个“存储数据”的系统,增删改查可以添加很多条件,就像SQL数据库一样...

谈谈redis,memcache,mongodb的区别和具体应用场景

mongoDB 不支持事务 7、数据分析 mongoDB 内置了数据分析的功能(mapreduce),其他不支持 8、应用场景 redis:数据量较小的更性能操作和运算上 memcache:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写 少,对于数据量比较大,可以采用 sharding)MongoDB:主要解决海量数据的访问...

用了redis,还需要使用数据库么

当然需要啊。。。redis里面其实就是一些json。。。实际工作中,在大部分情况下,不用redis或者mongodb可以。。。但没有传统数据库却不行 你首先应该搞清楚,redis本身是为了为了提高数据访问速度。。。而不是用来取代数据库的。。。打领带,是为了让衣服看起来更帅。。。而不是打了领带,就不需要穿衣...

声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
怎么在家自制广东白切鸡? 绍兴白切鸡的酱油碟如何制作 滥用职权罪和徇私枉法罪区别有哪些 玩忽职守罪和徇私枉法罪区别是什么 发霉的斑点怎样去除 后背晒完有黑色的斑点,而且特别的痒,看起来像是发霉了一样,请问这是... 192168811登录入口19216881 1921681881路由器设置网址~冫? 黄岛特色美食推荐_济南摩托车骑行路线推荐 青岛黄岛的美食攻略 青岛黄岛美食店推荐 关系型数据库和非关系型数据库有什么区别,mongdb和redis怎么选择... Redis,SSDB,Memcache和MongoDB的区别 redis,memcache和mongodb的区别 redis,mongodb有什么区别 请问、吃什么样的中药可以把我的大肚子能减下去,要快快的减?? 虚拟视频是什么东西 AE是否可以实现cave(沉浸式虚拟现实)投影 视频制作 大肚腩有什么中药把他消除?. 在omegle上怎样使用9158虚拟视频制作的假视频? 名医药店里的年轻人减大肚子的药方是哪几种中药??? 虚拟视频特效文字用什么软件制作? 吃什么中药可以减小肚子的赘肉 中药减肥方法瘦肚子都有哪些? 怎么减掉大肚子,中草药最好 中药怎么减肚子上的赘肉 模拟动画的仿真视频怎么制作 有什么专门减肚子的中药方吗?一定要合理科学哦! 你好,本人肚子大, VR虚拟现实的视频是怎么做出来的。类似图片这样的,一般的普通视频可以做成下面图片那样吗?!然后带上 吃什么中药减肚子 抖音上虚拟偶像的视频怎么做 如何评价RethinkDB?和MongoDB,Redis有什么区别 爬虫的数据库选型,redis,leveldb,mongodb,mysql 选哪个 新手去建筑工地该怎么做? 建筑工地五大伤害指什么? 扬州最好的翻译公司是哪家? 扬州市译海国际外文翻译有限公司怎么样? 扬州英豪衡器秤业有限公司应该如何翻译成英文,请高手指点。 扬州哪家翻译公司可以做护照翻译? 扬州翻译公司哪家最好 扬州扬外翻译有限公司泰州分公司介绍? 扬州翻译公司哪家最专业? 扬州昊辰科技有限公司的英文翻译 急 全国十佳翻译服务企业排名? 公司地址翻译 中国江苏省扬州市江都区浦江路55号,翻译成英文谢谢! 有一个 地方叫扬州英文翻译 公司地址翻译成英语 故人西辞黄鹤楼 烟花三月下扬州 用英文怎么翻译? 扬州市文昌中路**号翻译成英文 请问如何翻译英文“江苏省扬州市江都区大桥镇扬靖路&quot; 江苏省扬州市广陵区淮海路157号转换成英文怎么写
  • 焦点

最新推荐

猜你喜欢

热门推荐