OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

redis、memcache和mongodb各自的优缺点是什么,怎么选择呢?


分享到
分类 心得体会   关键字 提问   发布 ourjs  1511671164400
注意 转载须保留原文链接,译文链接,作者译者等信息。  

redis、memcahce 比较相似,但与 mongodb 完全不同,几乎没有可比性。

总的来说 redis/memcache 是基于内存的,讲究的是性能,多用作缓存层,比如说存放session。而 mongodb 是面向文档的,存储的是类似JSON的非结构化数据,查询起来非常方便,开发效率高,比较类似传统SQL关系型数据库。

普遍认为redis性能明显好于MemoryCache。所以这里主要比较 Redis 和 Mongodb。

体积

Redis是一个基于内存的键值数据库,它由C语言实现的,以单线程异步的方式工作,与Nginx/ NodeJS工作原理近似。所以文件非常小。编绎出来的主文件还不到 2Mb,在 Linux 服务器上初始只需要占用1Mb左右的内存。

Mongodb安装包则要大的多,跟mySQL差不多,都是百兆级的。

持久化

Redis是先读写内存再异步同步到磁盘,但持久化数据是需要时间的,如果每条记录都触发持久化,则性能优势则体现不出来,这里可能会产生一个问题,就是在数据改动不够多时,数据还没有持久化就重启了系统,这部分数据是有可能丢失的。

这里可以在设置文件中设置与入规则:

save 900 1
save 300 10
save 60 10000

以上规则表明,如果在1秒内发生邮900次数据改动,则开始写入到硬盘。如果10秒发生300次改动,则就持久化。

当你也可以设置成 save 1 1  每次改动都保存到硬盘,但是性能会下降。

MongoDB则不存在内存数据有可能丢失的问题,因为MongoDB每次改动都会写入数据库文件。

数据表

Redis没有严格意义上的表,习惯上一般采用 schema:key 形式做为键值,其中

schema:  可理解为传统数据库中的表名
key:     可理解为表中的主键


比如将 user:1 中的name设置为kris

HSET user:1 name kris

Mongodb则可将collection当作表

var col = db.collection('createIndexExample1');
col.find({}).toArray(function(err, items) {

});

数据写入

Redis 可以通过 hash set数据类型支持,JSON对象的写入,不过是二维的,有深层次JSON对象时,需要先序列化成string [JS代码]

client.hmset(user:1, { username: 'lee', age: '21' }, function(err) {
  console.log(err)
})

 实际上执行的则是

hmset user:1 user_name lee age 21

MongoDB支持复杂结构JSON文件的写入 [JS代码]

var col = db.collection('createIndexExample1');
  col.insert([{a:1, node: {b:1}}], {w:1}, function(err, result) {
  }
});

数据查询

MongoDB支持对JSON对象的任何层次和数据进行查询,使用起来非常方便:[JS代码]

col.find({ a:1 }).toArray(function(err, items) 

});

Redis 出于性能考虑,不能按照 hash object的值来搜索hash对象。

需要借助一系列的复杂操作才能进行数据查询,这一点比较接近数据库的底层。

比如我们有三条学生记录,存放着ID,名字和姓名 [redis 指令]

# 添加 3 个用户和信息

hmset user:1 user_name lee age 21
hmset user:2 user_name david age 25
hmset user:3 user_name chris age 25

如果想要按name和age查询,则要创建相关的数据集合(set)来作为索引

# 维护age索引
sadd age:21 1
sadd age:25 2 3
# 维护name索引
sadd name:lee 1
sadd name:david 2
sadd name:chris 3

然后,求数据集交集(sinter),实现多条件查询,比如我们要名字是lee,年龄是25岁的学生 

# 查找  age = 25 和 name = lee 的用户
sinter age:25 name:lee
  -> 会返回一个空集合

社区评论 ( Beta版 )
  • #0 虞夹乞 1511770500193

    通俗易懂 赞!!

  • #1 常行论 1511775243384

    柔柔弱弱若若若若若若若若若若若若若若若

  • #2 易风区 1511830785360

    Mongo也有可能丢失数据的,也是存储在内存再序列化的

  • #3 赖宁叮 1511861250076

    好棒,加油,

  • #4 车壮丑 1511864891373

  • #5 刘由网 1511873527547

    其实我比较在意的是传统企业或政府部门中涉及到的使用人数少,但是计算复杂的程序怎么提高性能!

  • #6 梅尼友 1511931771390

    表示到现在还没搞懂MongoDB的亮点和实际用途

  • #7 乐石丑 1511932292937

    为了解决IT界新手工作中遇到的问题,同时为了使各位IT界大神的劳动成果在帮助别人的同时,能够使自己的劳动成果获得相应的报酬,我们开发了一个新的平台,类似于,博客园、CSDN.您可以在这个平台发表一些技术相关的文章和相关文章的demo,并且标上该demo的下载价格,在有人下载了你这个demo后,你会得到相应的收益,欢迎指点。网址:wisdomdd.cn
    QQ:215373080

OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. 阿里涉嫌抄袭创业公司产品:在今天这个故事里,阿里巴巴就是四十大盗
  2. 垄断"开源硬件"树莓派芯片的供应商博通要收购高通了
  3. 从 Node 到 Go:一个粗略的比较—GO平均性能比JavaScript快十几倍
  4. GitHub2017年度开发者报告 JavaScript依然遥遥领先Python突飞猛进
  5. 40行JavaScript代码实现的3D旋转魔方动画效果
  6. NodeJS动态传参特性:不定个数参数的省略,默认值与解构
  7. Node.JS与USB接口通信:检测U盘/移动硬盘插拔事件和发送接数据
  8. 招聘前端工程师
  9. 【干货】扫描识别控件Dynamic Web TWAIN在线示例汇总
  10. Node.JS读取中文TXT编码文件显示乱码问题解决方案
  11. AirJD-简单好用的免费建站工具

 相关阅读 - 心得体会
  1. 命令行的艺术:linux bash命令大全详解
  2. 开源项目 RethinkDB 关闭,创始人总结失败教训
  3. JavaScript中该如何安排后台任务
  4. Markdown 语法简介和使用说明-详细版
  5. JavaScript正在变成Web界的C++
  6. 请停止将JavaScript类型化(建议不要使用class实现类继承)
  7. 几款开源的图形化Redis客户端管理软件
  8. 我为什么不再用Compass写CSS(缺点分析)
  9. CSS Sprite小图片自动合并工具(NodeJS,Python,Java,Ruby)
  10. 即将推出的CSS4 Level 4 Selectors(第4级选择器)

 关键字 - 提问
  1. redis、memcache和mongodb各自的优缺点是什么,怎么选择呢?
  2. 在node.js响应流中设置多个Set-Cookie header属性
  3. 用jQuery为跳转链接锚点添加平滑滚动动画效果(如回到顶部按钮)
  4. websvr 静态文件访问问题
  5. websvr 登录session问题
  6. websvr的Template匹配路径问题
  7. ourjs文章缓存问题
  8. 关于ourjs的counts问题
  9. 关于websvr问题
  10. 出几道JS的题:{} + [] = ?

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号