[轉]redis;mongodb;memcache三者的性能比較

摘要:
不过memcache还可用于缓存其他东西,例如图片、视频等等。Redis可以通过例如expire设定,例如expirename105、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。mongoDB支持master-slave,replicaset,autosharding机制,对客户端屏蔽了故障转移和切分机制。一些memcache和redis的安装和使用就不赘述啦。memcache的测试代码如下:connect;$time_start=microtime_float();//保存数据for{$redis-˃sadd;}$time_end=microtime_float();$run_time=$time_end-$time_start;echo"用时$run_time秒";//关闭连接$redis-˃close();functionmicrotime_float(){list=explode;return;}?php//连接$redis=newRedis();$redis-˃connect;$time_start=microtime_float();//保存数据for($i=0;$i˂100

先说我自己用的情况:

最先用的memcache ,用于键值对关系的服务器端缓存,用于存储一些常用的不是很大,但需要快速反应的数据

然后,在另一个地方,要用到redis,然后就去研究了下redis. 一看,显示自己安装了php扩展,因为有服务器上的redis服务端,自己本地就没有安装,其实用法和memcache基本一样,可能就是几个参数有所不 同。当然 它们缓存的效果也不一样,具体的哪里不一样,一下就是一些资料,和自己的总结

1、 Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。
2、 数据类型--Memcache在添加数据时就要指定数据的字节长度,例如:
set key3 0 0 8
lxsymcto
STORED
而redis不需要,如:redis 127.0.0.1:6379>set key2 "lxsymblog"
OK
redis 127.0.0.1:6379>get key2
"lxsymblog"
3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10
5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从
6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)
7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复

从以下几个维度,对redismemcachemongoDB做了对比,欢迎拍砖

1、性能

都比较高,性能对我们来说应该都不是瓶颈

总体来讲,TPS方面redismemcache差不多,要大于mongodb

2、操作的便利性

memcache数据结构单一

redis丰富一些,数据操作方面,redis更好一些,较少的网络IO次数

mongodb支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富

3、内存空间的大小和数据量的大小

redis2.0版本后增加了自己的VM特性,突破物理内存的限制;可以对key value设置过期时间(类似memcache

memcache可以修改最大可用内存,采用LRU算法

mongoDB适合大数据量的存储,依赖操作系统VM做内存管理,吃内存也比较厉害,服务不要和别的服务在一起

4、可用性(单点问题)

对于单点问题,

redis,依赖客户端来实现分布式读写;主从复制时,每次从节点重新连接主节点都要依赖整个快照,无增量复制,因性能和效率问题,

所以单点问题比较复杂;不支持自动sharding,需要依赖程序设定一致hash机制。

一种替代方案是,不用redis本身的复制机制,采用自己做主动复制(多份存储),或者改成增量复制的方式(需要自己实现),一致性问题和性能的权衡

Memcache本身没有数据冗余机制,也没必要;对于故障预防,采用依赖成熟的hash或者环状的算法,解决单点故障引起的抖动问题。

mongoDB支持master-slave,replicaset(内部采用paxos选举算法,自动故障恢复),auto sharding机制,对客户端屏蔽了故障转移和切分机制。

5可靠性(持久化)

对于数据持久化和数据恢复,

redis支持(快照、AOF):依赖快照进行持久化,aof增强了可靠性的同时,对性能有所影响

memcache不支持,通常用在做缓存,提升性能;

MongoDB1.8版本开始采用binlog方式支持持久化的可靠性

6、数据一致性(事务支持)

Memcache在并发场景下,用cas保证一致性

redis事务支持比较弱,只能保证事务中的每个操作连续执行

mongoDB不支持事务

7、数据分析

mongoDB内置了数据分析的功能(mapreduce),其他不支持

8、应用场景

redis:数据量较小的更性能操作和运算上

memcache:用于在动态系统中减少数据库负载,提升性能;做缓存,提高性能(适合读多写少,对于数据量比较大,可以采用sharding

MongoDB:主要解决海量数据的访问效率问题

最近一直在研究key-value的存储,简单记一下感受。。一些memcache和redis的安装和使用就不赘述啦。只简单说说两种方案的差别。一些 感想和测试结果未必足够能说明问题,有什么不妥请大家指正。因为这两天在学习的过程发现一直在更正自己认识的缺陷,每天都会否定前一天的想法。。好了,费 话少说。

经过对50万个数据存储的研究发现:

每秒单条指令执行量    

memcache 约3万次

redis 约1万次

而且,memcache的一大优点是可以通过一个函数直接设置过期时间,而redis需要两个函数才可以既设置了键值对又设置过期时间,也就是redis在这点上效率变成了原来的一半,即5千次,这对于大部分需求来说,有点太慢了。

memcache的测试代码如下:

<?php

$mem = new Memcache;

$mem->connect("127.0.0.1", 11211);

$time_start = microtime_float();

//保存数据

for($i = 0; $i < 100000; $i ++){

$mem->set("key$i",$i,0,3);

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "用时 $run_time 秒 ";

function microtime_float()

{

list($usec, $sec) = explode(" ", microtime());

return ((float)$usec + (float)$sec);

}

?>

redis的测试代码如下:redis1.php 此代码大概需要10秒左右

<?php

//连接

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$time_start = microtime_float();

//保存数据

for($i = 0; $i < 100000; $i ++){

$redis->sadd("key$i",$i);

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "用时 $run_time 秒 ";

//关闭连接

$redis->close();

function microtime_float()

{

list($usec, $sec) = explode(" ", microtime());

return ((float)$usec + (float)$sec);

}

?>

如果需要在设置键值的同时设置过期时间,大概执行需要20秒左右,测试代码如下:redis2.php

<?php

//连接

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$time_start = microtime_float();

//保存数据

for($i = 0; $i < 100000; $i ++){

$redis->sadd("key$i",$i);

$redis->expire("key$i",3);

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "用时 $run_time 秒 ";

//关闭连接

$redis->close();

function microtime_float()

{

list($usec, $sec) = explode(" ", microtime());

return ((float)$usec + (float)$sec);

}

?>

后来在网上发现redis有一个神奇的功能叫事务,通过multi原子性的将一段代码块依次执行,从而达到一个完整功能模块的执行。不幸的是,通过测 试发现,采用multi方式执行代码时并没有减少请求次数,相反在执行multi指令和exec指令时都要发送请求,从而将运行时间变成了原来的四倍,即 四条指令的运行时间。测试代码如下:redis3.php

<?php

//连接

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$time_start = microtime_float();

//保存数据

for($i = 0; $i < 100000; $i ++){

$redis->multi();

$redis->sadd("key$i",$i);

$redis->expire("key$i",3);

$redis->exec();

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "用时 $run_time 秒 ";

//关闭连接

$redis->close();

function microtime_float()

{

list($usec, $sec) = explode(" ", microtime());

return ((float)$usec + (float)$sec);

}

?>

问题出现了瓶颈,有好多公司需要海量数据处理,每秒5000次远不能满足需求,然后由于redis主从服务器上比memcache有更大的优势, 为了将来数据的着想,不得不使用redis,这时候出现了一种新的方式,即phpredis提供的pipline功能,该功能能够真正的将几条代码封装成 一次请求,从而大大提高了运行速度,50万次的数据执行只有了58秒。测试代码如下:redis4.php

<?php

//连接

$redis = new Redis();

$redis->connect('127.0.0.1', 6379);

$time_start = microtime_float();

//保存数据

for($i = 0; $i < 100000; $i ++){

$pipe=$redis->pipeline();

$pipe->sadd("key$i",$i);

$pipe->expire("key$i",3);

$replies=$pipe->execute();

}

$time_end = microtime_float();

$run_time = $time_end - $time_start;

echo "用时 $run_time 秒 ";

//关闭连接

$redis->close();

function microtime_float()

{

list($usec, $sec) = explode(" ", microtime());

return ((float)$usec + (float)$sec);

}

?>

运用这个操作可以非常完美的将赋值操作和设置过期时间操作打包到一个请求去执行,大大提高了运行效率。

redis安装:http://mwt198668.blog.163.com/blog/static/48803692201132141755962/

memcache安装:http://blog.csdn.net/barrydiu/article/details/3936270

redis设置主从服务器:http://www.jzxue.com/fuwuqi/fuwuqijiqunyuanquan/201104/15-7117.html

memcache设置主从服务器:http://www.cnblogs.com/yuanermen/archive/2011/05/19/2051153.html

本文來自:http://blog.csdn.net/a923544197/article/details/7594814

免责声明:文章转载自《[轉]redis;mongodb;memcache三者的性能比較》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RecycleView GridLayoutManager 分割线Android ViewTreeObserver简介-------------转下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Error:ServiceStack.Redis.RedisResponseException:“invalid password., sPort: 0, LastCommand: ”

ylbtech-Error:ServiceStack.Redis.RedisResponseException:“invalid password., sPort: 0, LastCommand: ” 1.返回顶部 1、 ServiceStack.Redis.RedisResponseException HResult=0x80131500 Message...

Werkzeug教程

http://chaoxz2005.blog.163.com/blog/static/15036542012863405266/ http://www.dajo.com.cn/a/boke/python/2013/1125/146.html 这里我们将会创建一个仿制TinyURL的应用,将URLs存储到一个redis实例。为了这个应用,我们将会使用的库包括...

redis队列的实现

redis中文官网:http://www.redis.cn/ 关于redis队列的实现方式有两种: 1、生产者消费者模式。 2、发布者订阅者模式。 详解: 1、生产者消费者模式。 普通版本: 比如一个队列里面,生产者A push了一个数据进去,消费者B pop 了这个数据,那个这个队列依旧为空。所以是一对一的。 至于是先进先出还是先进后出等,可以依照函数l...

CentOS7安装部署Redis5.0.9并配置开机自启动

(1)下载Redis5.0.9.tar.gz安装包 下载地址:https://download.redis.io/releases/redis-5.0.9.tar.gz wget http://download.redis.io/releases/redis-5.0.9.tar.gz (2)将安装包上传至服务器/data目录下,如没有该目录请先创建 mkd...

redis list结构

一个功能肯定有其应用场景: PUSH和POP操作,其实是队列的基本操作。Redis的list就是一个极其强大的队列系统。我们在哪些地方会用到队列呢?下面,我们说两个例子: a,评论系统 逛过微博的筒子们应该都对评论系统有了解。我们在看完一条微博之后,常常会评论一番,或者看看其他人的吐槽。每条评论的记录都是按照时间顺序排序的。我们读的时候也是这个顺序。这时,...

redis慢查询的简单认识和事务、订阅的认识

  有学习的小伙伴可以一起讨论有问题可以问我,微信 15321502296慢查询 阀值:规定的一个值 阈值:规定的一个范围 就是系统在执行命令前后计算每条命令的执行时间,当超过预设的阀值时,就见这条命令记录下来 slowlog-log-slower-than  微秒 1秒=1000毫秒=1000000微秒 0 记录所有命令 <0不进行记录 slowl...