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

redis memcache 性能比较
阅读:2885次&&&时间: 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这是我09年的一篇日志,/blog/8143542,简单介绍了下redis。今天就redis的问题再讨论下:1.到底是否需要redis的持久化能力?这让我们使用的很纠结,因为redis持久化的是数据集的当前快照,于是当你用它来做存储,而不是缓存时,你会很焦虑。当数据集很大的时候,比如32G内存,数据集20G,你愿意dump快照吗?如果这样做,问题就来了,redis的dump是fork一个进程,利用操作系统内存管理的copy-on-write来得到当前内存快照,但如果数据的更新比较频繁,20G内存dump到磁盘的速度又不快,就会导致在dump的时候需要大量的内存来做写时copy,需要的新内存加上原有的20G内存,可能导致操作系统swap,同时因为copy-on-write,主线程在处理请求时也会变慢,redis的整体性能急速下降。所以我们还是保守的把redis当做cache,只有当数据集很小的时候,才用它来做持久存储。2.性能真的没有问题吗?很多人说redis性能比memcached要高,其实看完代码比较差异,redis是单线程,memcac hed是多线程,redis每次请求malloc 你需要的数据大小内存量,memcached每次malloc 1M,memcached只有malloc没有free,redis当删除时会free,对于value本身来讲,redis可以支持结构化的value,memcached则只把value当做一块字节。都是基于epoll,kv都是hashtable,从这些方面来看,我觉得性能上讲两者不会有太大差别。但因为redis的malloc方式,导致一个潜在问题,就是当有很多small object放进去,又被频繁的free后,导致了大量的内存碎片,到一定临界点后,你会发现插入新数据的时候redis的性能急剧下降,原因在malloc函数上要花很长时间,我们在一个项目中就遇到了这个问题,32G内存机器,redis使用了22G左右的内存量,因为清理了大量没用的cache数据后,导致redis响应及其缓慢。因为memcached只有malloc,每次都是以1M为单位,所以没有redis的这个问题。不过memcached在内存用满后,再插入数据时因为需要替换策略也会引起性能下降。&&&(第1/2页)浏览154次&|&&猜你喜欢:热门分享:征服 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支持!
相关链接:
下载次数: 351
浏览 30815
你这模式真心没我们现在用的模式好!说说你现在的,后面那篇我想才是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 ?抽空我也看看~
浏览: 2202995 次
来自: 北京
项目总是报错,不知为什么
楼主这个也出书了?
logicman 写道在调用int i = decompres ...
evaspring 写道 顶楼主 ~RowMapper 实在是 ...
加qq 沟通此问题Redis 性能比 Memcached 好吗?有哪些网站采用 Redis_百度知道
Redis 性能比 Memcached 好吗?有哪些网站采用 Redis
提问者采纳
新浪微博就是用的redis集群,redis可以操作的类型也比较丰富,能够胜任的场景更多。
其他类似问题
为您推荐:
redis的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 redis vs memcached 的文章

 

随机推荐