Redis 性能比 memcached redis 场景好吗?有哪些网站采用 Redis

redis memcache 性能比较
阅读:2943次&&&时间: 12:41:11&&
redis和memcache非常像的,都是key,value的方式,将数据存放内存中。最近在学习redis,在网上看了一些这方面的资料,有三种观点:
1,redis读写内存比memcache快
2,memcache读写内存比redis快
3,memcache读写内存比redis快,但是redis整体性能优于memcache
所以我做了一下测试。关于redis和memcache的安装,请参考linux redis 安装配置, 以及redis php扩展
linux memcache 安装
1,redis的测试文件
1.&?php&& 2.function get_data (){&& 3.&& mysql_connect(&localhost&, &root&, &&) or die(&Could not connect: & . mysql_error());&& 4.&& mysql_select_db(&ugc&);&& 5.& 6.&& $result = mysql_query(&SELECT task_id FROM ugc_tasks&);&& 7.&& $return = array();&& 8.&& while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {&& 9.&&&&& $return[] = $&& 10.&& }&& 11.& 12.&& mysql_free_result($result);&& 13.&& return $&& 14.}&& 15.& 16.$redis = new redis();&& 17.$redis-&connect('127.0.0.1', 6379);&& 18.& 19.if ($redis-&exists('test')) {&& 20.&& $value = $redis-&get(&test&);&& 21.}else{&& 22.&& $value = get_data();&& 23.&& $redis-&set('test',json_encode($value));&& 24.}&& 25.& 26.print_r(json_decode($value));&& 27.?&& &?phpfunction get_data (){&& mysql_connect(&localhost&, &root&, &&) or die(&Could not connect: & . mysql_error());&& mysql_select_db(&ugc&);
&& $result = mysql_query(&SELECT task_id FROM ugc_tasks&);&& $return = array();&& while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {&&&&& $return[] = $&& }
&& mysql_free_result($result);&& return $}
$redis = new redis();$redis-&connect('127.0.0.1', 6379);
if ($redis-&exists('test')) {&& $value = $redis-&get(&test&);}else{&& $value = get_data();&& $redis-&set('test',json_encode($value));}
print_r(json_decode($value));?&2,redis的测试结果
第一次root@ubuntu:/home/zhangying/download/webbench-1.5# webbench -c 10000 -t 30 http://localhost/php-redis/test_redis.phpWebbench - Simple Web Benchmark 1.5Copyright (c) Radim Kolar , GPL Open Source Software.
Benchmarking: GET http://localhost/php-redis/test_redis.php10000 clients, running 30 sec.
Speed=48324 pages/min,
bytes/sec.Requests: 22599 susceed, 1563 failed.
telnet 127.0.0.1 6379 telnet登录一下,把test对应的值清除掉,保重测试的公平性del test
第二次root@ubuntu:/home/zhangying/download/webbench-1.5# webbench -c 10000 -t 30 http://localhost/php-redis/test_redis.phpWebbench - Simple Web Benchmark 1.5Copyright (c) Radim Kolar , GPL Open Source Software.
Benchmarking: GET http://localhost/php-redis/test_redis.php10000 clients, running 30 sec.
Speed=53570 pages/min,
bytes/sec.Requests: 23106 susceed, 3679 failed.
telnet 127.0.0.1 6379del test
第三次root@ubuntu:/home/zhangying/download/webbench-1.5# webbench -c 10000 -t 30 http://localhost/php-redis/test_redis.phpWebbench - Simple Web Benchmark 1.5Copyright (c) Radim Kolar , GPL Open Source Software.
Benchmarking: GET http://localhost/php-redis/test_redis.php10000 clients, running 30 sec.
Speed=49450 pages/min,
bytes/sec.Requests: 22301 susceed, 2424 failed.
telnet 127.0.0.1 6379del test
3,memcache测试文件
1.&?php&& 2.function get_data (){&& 3.&& mysql_connect(&localhost&, &root&, &&) or die(&Could not connect: & . mysql_error());&& 4.&& mysql_select_db(&ugc&);&& 5.& 6.&& $result = mysql_query(&SELECT task_id FROM ugc_tasks&);&& 7.&& $return = array();&& 8.&& while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {&& 9.&&&&&& $return[] = $&& 10.&& }&& 11.& 12.&& mysql_free_result($result);&& 13.&& return $&& 14.}&& 15.& 16.$mem = new M&& 17.$mem-&connect(&127.0.0.1&,11211) or die (&Could not connect&);&& 18.$value = $mem-&get('test1');&& 19.if (emptyempty($value)) {&& 20.&& $value = json_encode(get_data());&& 21.&& $mem-&set('test1',$value,0, 600);&& 22.}&& 23.& 24.print_r(json_decode($value));&& 25.?&& &?phpfunction get_data (){&& mysql_connect(&localhost&, &root&, &&) or die(&Could not connect: & . mysql_error());&& mysql_select_db(&ugc&);
&& $result = mysql_query(&SELECT task_id FROM ugc_tasks&);&& $return = array();&& while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {&&&&&& $return[] = $&& }
&& mysql_free_result($result);&& return $}
$mem = new M$mem-&connect(&127.0.0.1&,11211) or die (&Could not connect&);$value = $mem-&get('test1');if (empty($value)) {&& $value = json_encode(get_data());&& $mem-&set('test1',$value,0, 600);}
print_r(json_decode($value));?&4,memcache测试结果
root@ubuntu:/home/zhangying/download/webbench-1.5# webbench -c 10000 -t 30 http://localhost/php-redis/test_memcache.phpWebbench - Simple Web Benchmark 1.5Copyright (c) Radim Kolar , GPL Open Source Software.
Benchmarking: GET http://localhost/php-redis/test_memcache.php10000 clients, running 30 sec.
Speed=61632 pages/min,
bytes/sec.Requests: 29205 susceed, 1611 failed.
telnet 127.0.0.1 11211 telnet登录一下,把test1对应的值清除掉,保重测试的公平性delete test1
root@ubuntu:/home/zhangying/download/webbench-1.5# webbench -c 10000 -t 30 http://localhost/php-redis/test_memcache.phpWebbench - Simple Web Benchmark 1.5Copyright (c) Radim Kolar , GPL Open Source Software.
Benchmarking: GET http://localhost/php-redis/test_memcache.php10000 clients, running 30 sec.
Speed=64160 pages/min,
bytes/sec.Requests: 29426 susceed, 2654 failed.
telnet 127.0.0.1 11211delete test1
root@ubuntu:/home/zhangying/download/webbench-1.5# webbench -c 10000 -t 30 http://localhost/php-redis/test_memcache.phpWebbench - Simple Web Benchmark 1.5Copyright (c) Radim Kolar , GPL Open Source Software.
Benchmarking: GET http://localhost/php-redis/test_memcache.php10000 clients, running 30 sec.
Speed=65190 pages/min,
bytes/sec.Requests: 29348 susceed, 3247 failed.
telnet 127.0.0.1 11211delete test1
从上面比较结果,可以看出,memcache比redis快的。redis对key,value的管理,更灵活。有很多人把redis归于nosql的范围,细细想,还真是那么一回事。redis还可以把内在中的数据,放到磁盘中,这一点上,redis更像memcachedb。关于使用哪一种,看个人喜好而定了。
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
[商业源码]&
Copyright &
All Rights Reserved征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET) - Snowolf的意境空间! - ITeye技术网站
博客分类:
不得不说,用哈希操作来存对象,有点自讨苦吃!
不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?!
或许,是我的理解不对,没有真正的理解哈希表。
相关链接:
接上一篇,扩充User属性:
public class User implements Serializable {
private static final long serialVersionUID = -5203410L;
private String postC
我期望的是:
redis 127.0.0.1:6379& hmget .uid.u123456 address mobile postCode1) "\xe4\xb8\x8a\xe6\xb5\xb7"2) ""3) "100859"
几乎就是一个对象了!
但是,接下来的代码实现,让我彻底崩溃了!
二、代码实现
1.保存——HMSET
public void save(final User user) {
redisTemplate.execute(new RedisCallback&Object&() {
public Object doInRedis(RedisConnection connection)
throws DataAccessException {
byte[] key = redisTemplate.getStringSerializer().serialize(
".uid." + user.getUid());
BoundHashOperations&Serializable, byte[], byte[]& boundHashOperations = redisTemplate
.boundHashOps(key);
boundHashOperations.put(redisTemplate.getStringSerializer()
.serialize("mobile"), redisTemplate
.getStringSerializer().serialize(user.getMobile()));
boundHashOperations.put(redisTemplate.getStringSerializer()
.serialize("address"), redisTemplate
.getStringSerializer().serialize(user.getAddress()));
boundHashOperations.put(redisTemplate.getStringSerializer()
.serialize("postCode"), redisTemplate
.getStringSerializer().serialize(user.getPostCode()));
connection.hMSet(key, boundHashOperations.entries());
这里用到:
BoundHashOperations&Serializable, byte[], byte[]& boundHashOperations = redisTemplate.boundHashOps(key);
boundHashOperations.put(redisTemplate.getStringSerializer().serialize("mobile"), redisTemplate.getStringSerializer().serialize(user.getMobile()));
看着就有点肿。。。Map封装完以后,用HMSET命令:
connection.hMSet(key, boundHashOperations.entries());
这时候就完成了哈希表的保存操作,可以在控制台看到相应的数据了。
redis 127.0.0.1:6379& hmget .uid.u123456 address mobile postCode1) "\xe4\xb8\x8a\xe6\xb5\xb7"2) ""3) "100859"
2.获取——HMGET
这一刻,我彻底崩溃了!取出来的值是个List,还得根据取得顺序,逐个反序列化,得到内容。
public User read(final String uid) {
return redisTemplate.execute(new RedisCallback&User&() {
public User doInRedis(RedisConnection connection)
throws DataAccessException {
byte[] key = redisTemplate.getStringSerializer().serialize(
".uid." + uid);
if (connection.exists(key)) {
List&byte[]& value = connection.hMGet(
redisTemplate.getStringSerializer().serialize(
"address"),
redisTemplate.getStringSerializer().serialize(
"mobile"), redisTemplate
.getStringSerializer()
.serialize("postCode"));
User user = new User();
String address = redisTemplate.getStringSerializer()
.deserialize(value.get(0));
user.setAddress(address);
String mobile = redisTemplate.getStringSerializer()
.deserialize(value.get(1));
user.setMobile(mobile);
String postCode = redisTemplate.getStringSerializer()
.deserialize(value.get(2));
user.setPostCode(postCode);
user.setUid(uid);
这个实现,跟Redis的命令几乎一模一样,指定Key,指定field,获取其值。
List&byte[]& value = connection.hMGet(key,redisTemplate.getStringSerializer().serialize("address"),
redisTemplate.getStringSerializer().serialize("mobile"),
redisTemplate.getStringSerializer().serialize("postCode"));
我绝对相信,要么是我用的过于肤浅,低估了Spring的封装能力。或者,我该直接Json!等等,这不是MongoDB干的事情吗?!
PS:这两篇博客里操作的数据类型,只能是String类型,还没搞定除此以外任何类型。吾将上下而求索~~~
上述操作也许你吐了,接下来的代码,就再吐一次吧!
封装对象的时候,一定要记得次序。。。。这绝对不是一个优质代码的实现风格!
User user = new User();
String address = redisTemplate.getStringSerializer().deserialize(value.get(0));
user.setAddress(address);
String mobile = redisTemplate.getStringSerializer().deserialize(value.get(1));
user.setMobile(mobile);
String postCode = redisTemplate.getStringSerializer().deserialize(value.get(2));
user.setPostCode(postCode);
好吧!苦逼的事情,就此结束。目标Json支持!
相关链接:
下载次数: 358
浏览 32248
你这模式真心没我们现在用的模式好!说说你现在的,后面那篇我想才是Spring想要真正去使用的
命中注定1314 写道楼主,经过试验发现不能对Hash类型做删除操作,执行了没有效果。我那段没有开放的代码,被你测试了?!还是可以做删除那些,api没弄对, 今天封装了个简单的通用的CRUD类。
楼主,经过试验发现不能对Hash类型做删除操作,执行了没有效果。我那段没有开放的代码,被你测试了?!
dts228 写道Hi,我今天也瞅了下,发现spring自己封装了个ValueOperations来操作redis,比你这个要方便的呢。可以使用tmpl.opsForValue(),tmpl.opsForList()等来获取不通的op操作对象或者集合,,确实方便哈。o ?抽空我也看看~今天看了看,确实方便,未能深入研究。感谢提点!
Hi,我今天也瞅了下,发现spring自己封装了个ValueOperations来操作redis,比你这个要方便的呢。可以使用tmpl.opsForValue(),tmpl.opsForList()等来获取不通的op操作对象或者集合,,确实方便哈。o ?抽空我也看看~
浏览: 2269036 次
来自: 北京
项目总是报错,不知为什么
楼主这个也出书了?
logicman 写道在调用int i = decompres ...
evaspring 写道 顶楼主 ~RowMapper 实在是 ...
加qq 沟通此问题Redis 性能比 Memcached 好吗?有哪些网站采用 Redis_百度知道
Redis 性能比 Memcached 好吗?有哪些网站采用 Redis
我有更好的答案
其他类似问题
为您推荐:
redis的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁成人网站YouPorn使用Redis之经验谈 - 博客 - 伯乐在线
& 成人网站YouPorn使用Redis之经验谈
【译者注】,因此对其性能的改进是非常关键的。之前翻译过的一篇>也谈到了成人网站通过巧妙利用RTMP协议、epoll机制和Python语言性能提高性能的一些实践,这一篇则重点关注采用Redis作为后端数据存储来提高网站开发运营效率的案例。两篇文章都是伯乐在线的某编辑同学在HN上看到后推荐给我的,不得不说,编辑同学果然是火眼金睛,想必他对于成人网站也有很深的研究造诣。我预计下次他会找到一些关于如何hack成人网站VIP账号的文章,为广大读者造福,也请广大读者多多支持编辑同学的工作。
以下是译文:
RedisToGo 的贾斯汀(Justin)最近对Manwin集团(YouPorn和Pornhub之类的成人网站背后的公司)的 IT 总监埃里克(Eric Pickup)做了一次采访。在采访中,埃里克讲述他们向 Redis 的迁移过程,为什么要做这样的迁移,以及迁移后的成效。对 Redis 感兴趣的朋友,可看看他的《》(Youtube)视频。下面是 Justin 对 Eric 的访谈。
贾斯汀:您能否谈谈你们为什么要过渡到Redis?
埃里克:基本上是这样的:大约两年前我们收购了这个网站(YouPorn)。当时它是用Perl编写的,这也是我被招进来的原因之一。虽然我曾经用Perl干过活,但是我们很快就认定了用它维护这个网站不可行。Perl的开发人员不足,尤其是能力强的高级开发人员更少。所以,如果我们继续用Perl维护它,它只能成为一个停滞不前的网站,而这显然是我们不想做的事情。
很快,我们决定要重构网站并开始调研不同的技术。其实我们的第一反应是PHP,但我们不想太早把自己局限住,所以我们也调研了基于Java的解决方案。在对我们内部实验过的技术进行了大量研究分析之后,我们决定坚持用PHP。
以前,我们也实验过Redis、Varnish和其他一些技术。有些我们内部的网站已经开始使用Redis,主要是用来做缓存解决方案。但我们还想知道,我们是否可以把它作为一个真正的数据存储平台来使用。
我们做了一些早期的测试,并把性能作为主要的决策因素,因为这在当时是(现在也还是)我们的一个大问题。我们对Redis的总体性能感到非常震撼,在经过一些讨论后,我们决定要使用Redis作为网站的主数据库。
此前该网站使用传统的LAMP架构编写而成。它用到了Linux,Perl,MySQL和Memcached。过渡过程显然是有一些难度的。实施过程有个折中:我们在架构中保留了MySQL,而且事后对此我真的很高兴我们这样做了。我们的网站并没有直接去读取MySQL数据库,但我们可以用它来做类似于填充新的列表或散列之类的事情,以及我们没有预见到的一些功能。我们更多地是用MySQL来实现现有的数据查询,Redis则用于网站。
我们开始用它做开发之后不久,我们很快认为我们做出了正确的决定。然后在开发了一个月左右的时间后,我们准备重新审视我们的决定,但很快就觉得没问题。这真的是一个很适合我们应用案例的技术。
贾斯汀:为什么这样说呢?在评估它是否是一个很好的决定的问题上,你们主要看哪些因素?
埃里克:很明显,易于开发是一个重大的因素,尤其是当你像这样重构整个项目的时候。幸运的是,Redis的数据结构和我们在做的工作匹配得很好。
YouPorn从根本上来说,主要是视频和对象的列表,无论是评论、喜欢、最受好评的影片,或观看次数最多的视频。这些都是列表和对象,显然很容易映射到哈希表里。我们也使用其他的一些数据类型,但我不得不说,我们使用的90%左右都会落到有序集合或哈希的结构里。
贾斯汀:决定使用Redis后,需要多久才能真正进行实施并使之生效?
埃里克:说实话,在当时我们还在提升团队能力。就像我说的,这是一个全新的项目,所以在起始阶段主要只有我和另外一个人。
我得说,在大约四个星期之内,我们就做出了网站原型的相当一部分。我们做好了首页,所有的主要页面,以及大部分的视频页面。你还可以查看评论 – 尽管那时候你还不可以增加评论 – 很多事只是两个人在短短的四个星期完成。这个时间表还包括了学习新的框架(那时候用了Symphony),所以说我们启动和运转都是很快的。
贾斯汀:您正在使用的Redis实例有多少个?
埃里克:我没有具体的数字,但应该不到10个。
贾斯汀:这真是令人印象深刻。你们怎么做到只用这么少的?
埃里克:随着时间的推移,我们不断新增功能,Redis实例数也是不断增加的,但一般来说,我们用Redis做了很多的缓存工作。我们第一次推出网站的时候,我们没有做缓存。我们只是依靠Redis本身。
随着时间的推移,我们发现以我们的标准来看服务器运行负担过重,所以我们开始添加某些级别的缓存。我们在网站上布署了第二个Redis节点,它用很短的缓存时间来处理最流行的页面视图。
你还必须明白,我们也使用了Varnish,它位于Web服务器的前端,所以网页本身也有相当数量的缓存,所以我们不会通过Redis来缓存每个页面。
贾斯汀:你去做架构上的决策的时候,你能否谈谈你是如何决定在哪里使用Redis的,在实施过程中有没有修正你的决策呢?
埃里克:我想说Redis是我们知道自己会使用的热门技术之一。它和Varnish都是我们早期就决定要用的。我们对它们的测试结果相当不错,就像我说的,我们公司之前就用过它们,所以它们对我们来说并不是未知的东西。
要说我们有什么修正的话,最大的变化是增加了Redis二级缓存层。这降低了服务器上每秒的查询数,并让我们的网络更安全了。
贾斯汀:你觉得实施后最大的好处是什么?
埃里克:我首先要说的是Redis带来了强大的快速创建新功能的能力。其实我的意思是,不只是Redis,而是完整的开发框架带来的,但我们已经写了一个基于Redis的基本库之上的很不错的库,这使我们能够迅速的把新功能融合到一起。这绝对是我们所见过的最大的好处。
(编译补充:,YouPorn 的技术人员 Eric Pickup 在 Google 群组宣告他们网站改用 Redis DB 后。扛住了每天1亿PV浏览量,每秒30万请求,已经坚持 2 周。)
贾斯汀:进行这种迁移的一些障碍或困难是什么?有没有什么定制化的东西,你必须弄清楚然后自己来做的吗?
埃里克:这我得想想。实现缓存层花了一些时间。就像我说的,当时服务器负担很重,而我们并不想为了这个问题投入越来越多的服务器,所以构建一个解决方案花了一些时间。
其他花时间的就是需要自己去琢磨一些问题。现在,大多数使用Linux系统搭建的网站都使用MySQL作为数据存储。 MySQL的确拥有巨大的优势,它有大量的文档。如果你碰到一个问题,没准儿有人在此之前已经解决过了,你会找到一堆网站上都提供了相应的信息和建议。 Redis根本就还没有这样的社区。如果你想看看其他已经设置好的人写的东西,比如他们学到了什么,他们使用哪些设置,他们的经验是什么,会发现这样的信息很少。因为只有很少的提示和技巧,所以学习曲线上需要克服的困难就更多了。
相比MySQL,Redis的文档少得多,所以寻找寻求问题的解决办法或其他简单的事情,比如设置到磁盘的复制,需要多一点的时间。不过,由于Redis越来越受欢迎,文档和社区正在开始形成。
贾斯汀:你有任何提示或技巧想和我们的观众分享吗?
埃里克:我最想说的是最有价值的经验中最重要的一些,可是我懂的也不多。我不是系统管理员,而最重要的很多基本都是系统管理一类的东西。我想说很容易错过的一招是,当你设置到磁盘的复制时,如果你的磁盘是主从的集群,你要确保每个实例之间有足够的时间差,这样你就不会碰上所有实例都正好同时决定写磁盘的局面。
这很容易被忽视。我们起始时的服务器都运行正常,但后来,当我们添加更多的服务器的时候,我们保持了默认设置,而后来不得不去修复。这是人们可以从中受益很多的经验之一。我是软件开发人员,我会说最真实的经验教训是在系统管理层面。可我没有足够的信息来真正深入探讨这些问题。
贾斯汀:太好了。感谢您给我们这么棒的访谈,希望Manwin集团一切顺利!
埃里克:感谢您对我的采访。
关于作者:
可能感兴趣的话题
想知道他是具体是怎么实现的。根据redis的特性,我不知道他具体要怎么做。我能想到的是他只是使用了redis,而并不是替换原有的db存储吧。
最新评论(期待您也参与评论)
关于伯乐在线博客
在这个信息爆炸的时代,人们已然被大量、快速并且简短的信息所包围。然而,我们相信:过多“快餐”式的阅读只会令人“虚胖”,缺乏实质的内涵。伯乐在线博客团队正试图以我们微薄的力量,把优秀的原创/译文分享给读者,做一个小而精的精选博客,为“快餐”添加一些“营养”元素。
新浪微博:
微信号:Jobbole
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选博客文章
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2015 伯乐在线
赞助云主机Redis 性能比 Memcached 好吗?有哪些网站采用 Redis?使用 Memcached 的出色网站有哪些?
按投票排序
关于Redis和Memcached的比较,可能没有多少人能比Redis作者本人能说得更好。Redis作者的说法是,平均到单个核上的性能,在单条数据不大的情况下,Redis会更好。因为Redis是单线程的,只能使用一个核。而Memcached是多线程的,所以对一个实例来说,性能上肯定是Memcached占优势。因为Redis的单线程,导致所有IO也是串行化的,当单条数据太大,IO等待会费掉时间,而不是程序本身性能或者复杂度。因为Redis有更复杂的数据类型,所以很多操作必然会比Memcached的get set操作更耗时。请看文章《Memcached真的过时了吗?》中Redis作者本人的说法
转载 timyang[后端技术] 很多开发者都认为Redis不可能比Memcached快,Memcached完全基于内存,而Redis具有持久化保存特性,即使是异步的,Redis也不可能比Memcached快。但是测试结果基本是Redis占绝对优势。一直在思考这个原因,目前想到的原因有这几方面。Libevent。和Memcached不同,Redis并没有选择libevent。Libevent为了迎合通用性造成代码庞大(目前Redis代码还不到libevent的1/3)及牺牲了在特定平台的不少性能。Redis用libevent中两个文件修改实现了自己的epoll event loop(4)。业界不少开发者也建议Redis使用另外一个libevent高性能替代libev,但是作者还是坚持Redis应该小巧并去依赖的思路。一个印象深刻的细节是编译Redis之前并不需要执行./configure。CAS问题。CAS是Memcached中比较方便的一种防止竞争修改资源的方法。CAS实现需要为每个cache key设置一个隐藏的cas token,cas相当value版本号,每次set会token需要递增,因此带来CPU和内存的双重开销,虽然这些开销很小,但是到单机10G+ cache以及QPS上万之后这些开销就会给双方相对带来一些细微性能差别(5)。
这是事实,上面的回答已经说出了真实的原因。ITeye(JavaEye)和CSDN现在都用到了Redis,采用memcached比较出色的网站有ITeye(JavaEye)以后会考虑更多的尝试Redis,不过Redis现在客户端质量不行,所以还要等。我们用memcached非常好,唯一不爽的地方是万一服务器掉电重启以后的缓存预热过程比较长,导致网站负载过高。Redis的持久化存储可以解决这个问题。
1.首先,memcached和redis都基于内存,memcached偏向cache,redis更多扮演数据库的角色,支持更丰富的数据类型,单从性能上比,不太具有可比性,不会有数量级的差异. 两者也可并存,在数据库(redis)前端布置cache(memcached)也是一种节省资源的方式;2. 用redis的网站很多,这里有一个列表 3. 使用memcached出色的网站是google,facebook,一些公司,几千台的memcached集群很常见.4. 如果有想法想用redis代替memcached集群,不建议,一致性哈希的实现有待成熟,还不能像memcached集群那样动态扩容,数据规划不得不加倍小心;5. 如果想使用redis的持久化,那么设计的时候,要注意redis失效的可能,毕竟还不是成熟的产品,宕机后的加载恢复也可能漫长. btw:选择一个产品,性能往往不是关键的要素,除非你这个产品成为了整个系统的瓶颈。
Memcached是全内存Cache,仅此功能,数据持久化等相关都需要自己制作。可以看作是麻烦,也可以看作是自由。Redis上面已经说了,更多扮演的是数据库的功能,自带数据持久化。这也是我认为最直接的它和Redis的区别。性能可能不是区分这两者的最主要原因,更多的时候选择使用Memcached而不是其他,只是因为它做的工作少,可扩展性强,个人感觉。
小站点,业务大部分基于传统关系数据库的,cache辅助提高速度的话,建议memcache,其原则是简单,好用,无学习成本。中型站点,可能部分业务会遇到数据库瓶颈,那么redis除了cache之外,本身强大的数据结构,可以代替部分数据库功能,所以可以考虑代替memcache大型展现,如中型站点,可以考虑迁移部分业务到redis服务,但是如果涉及到大规模分布式部署,那么由于redis的分布式与memcache其实不一样,更多可能根据架构来考虑选择了。
redis比mc更耗内存,如果只是简单的key value并且没有持久化cache需求,可以考虑采用mc。大部分情况下redis可以替换mc

我要回帖

更多关于 redis和memcached 的文章

 

随机推荐