zoukankan      html  css  js  c++  java
  • redis、memcache和mongodb各自的优缺点是什么

    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
      -> 会返回一个空集合
  • 相关阅读:
    第一阶段冲刺(6)--每日立会--个人工作总结
    第一阶段冲刺--每日立会(5)--个人工作总结
    第一阶段冲刺--每日立会(4)--个人工作总结
    第十一周学习记录表
    第一阶段冲刺--每日立会(3)个人工作总结
    第一阶段冲刺--每日立会(2)--个人工作总结
    第一阶段冲刺--每日立会(1)--个人工作总结
    第十周学习记录表
    第九周学习进度表
    输入法
  • 原文地址:https://www.cnblogs.com/liliuguang/p/9592970.html
Copyright © 2011-2022 走看看