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

当前访客身份:游客 [
让自由的气息溢满心灵
:引用来自“Louis”的评论 引用来自“黑桃”的评论...
:引用来自“黑桃”的评论 引用来自“Louis”的评论...
:引用来自“Louis”的评论 最近也在做一个NoSQL数...
:最近也在做一个NoSQL数据库性能的对比,想问一下...
:文章不错。 suyor,你要测试了才能下定论。
:序列化的时候数组申明不可序列化,是因为数组里面...
:CacheHelper咋写的嘞?
:jedis 这个客户端貌似只能set 字符串啊~~...
:求助: 自动发现:RP向OP发送自动发现请求。以建...
:您好! 我现在想创建OP,应该怎么着手呢?谢谢
今日访问:8
昨日访问:4
本周访问:8
本月访问:69
所有访问:13586
windows下redis和memcached的性能对比测试
发表于4年前( 22:09)&&
阅读(4904)&|&评论()
0人收藏此文章,
在windows下测试了redis和memcached的性能,如下:
jedis get 20000次的执行时间:1265毫秒
jedis set 20000次的执行时间:1313毫秒
jedis 同时启动60个线程的执行时间:21609毫秒
xmemcached get执行20000次的时间:3219毫秒
xmemcached set 20000次的执行时间:3000毫秒
xmemcached 同时启动60个线程的执行时间:75562毫秒
可以看出redis的性能要好于memcached!
redis代码:
public class Demo {
public static void main(String[] args) throws Exception {
Demo demo = new Demo();
demo.test();
public void test() throws Exception {
Jedis jedis = new Jedis(&localhost&);
jedis.set(&key&, &mykey&);
long begin = System.currentTimeMillis();
for(int i=0; i&20000; i++)
jedis.get(&key&);
long end = System.currentTimeMillis();
System.out.println(&jedis get20000次的执行时间:& + (end - begin) + &毫秒&);
begin = System.currentTimeMillis();
for(int i=0; i&20000; i++)
jedis.set(String.valueOf(i), String.valueOf(i));
end = System.currentTimeMillis();
System.out.println(&jedis set 20000次的执行时间:& + (end - begin) + &毫秒&);
begin = System.currentTimeMillis();
Thread t[] = new Thread[60];
for(int j=0; j&t. j++) {
t[j] = new TestThread();
t[j].start();
for(int j=0; j&t. j++) {
t[j].join();
end = System.currentTimeMillis();
System.out.println(&jedis 启动&+ t.length +&个线程的执行时间:& + (end - begin) + &毫秒&);
class TestThread extends Thread {
public void run() {
Jedis jedis = new Jedis(&localhost&);
for(int i=0; i&20000; i++)
jedis.get(String.valueOf(i));
jedis.disconnect();
测试redis的代码时,发现同时启动的线程只能到达63,超过的线程都会失败。
排查很久,发现配置文件中有一句话:it's up to the number of file descriptors the Redis process is able to open.
估计在windows xp下只能到达64,那么还有一个呢?无法得知,查了好久也没有找到和linux下文件描述符想匹配的东西。
xmemcache代码:
public class Demo {
public static void main(String[] args) throws Exception {
Demo demo = new Demo();
demo.test();
public void test() throws Exception
MemcachedClient mc = new XMemcachedClient(&localhost&, 11211);
mc.set(&key&, 2000, &mykey&);
long begin = System.currentTimeMillis();
for(int i=0; i&20000; i++)
mc.get(&key&, 1000);
long end = System.currentTimeMillis();
System.out.println(&memcached get执行20000次的时间:& + (end - begin) + &毫秒&);
begin = System.currentTimeMillis();
for(int i=0; i&20000; i++)
mc.set(String.valueOf(i), 2000 ,String.valueOf(i));
end = System.currentTimeMillis();
System.out.println(&memcached set 20000次的执行时间:& + (end - begin) + &毫秒&);
mc.shutdown();
begin = System.currentTimeMillis();
Thread t[] = new Thread[60];
for(int j=0; j&t. j++) {
t[j] = new TestThread();
t[j].start();
for(int j=0; j&t. j++) {
t[j].join();
end = System.currentTimeMillis();
System.out.println(&memcached 启动&+ t.length +&个线程的执行时间:& + (end - begin) + &毫秒&);
class TestThread extends Thread {
public void run() {
MemcachedClient mc = new XMemcachedClient(&localhost&, 11211);
for(int i=0; i&20000; i++)
mc.get(String.valueOf(i), 1000);
mc.shutdown();
catch (Exception e) {
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读用心创造滤镜
扫码下载App
汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
malloc和free的缺陷:1、频繁调用malloc,free会造成大量内存碎片,无法回收重新利用,造成内存使用率低;2、作为系统调用,其系统开销远远大于一般函数。redis的优缺点:&&参考:& & & & .cn/s/blog_72995dcc01018qkf.html
阅读(7168)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'redis内存管理方式__redis的优缺点__支持tcmalloc,jemalloc,malloc三种内存分配,memcached使用slabs,malloc等内存分配方式,这些内存分配方式的优缺点',
blogAbstract:'& & & & redis并没有自己实现内存池,没有在标准的系统内存分配器上再加上自己的东西。所以系统内存分配器的性能及碎片率会对redis造成一些性能上的影响。\n&\n一、那redis是如何避免内存分配器的性能和碎片的问题的呢?\n在Redis的 zmalloc.c 源码中,我们可以看到如下代码: 48 /* Explicitly override malloc/free etc when using tcmalloc. */\n 49 #if defined(USE_TCMALLOC)\n',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:2,
publishTime:9,
permalink:'blog/static/',
commentCount:1,
mainCommentCount:1,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:true,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}只需一步,快速开始
查看: 924|回复: 5
好友积分1346森币186 精华0主题帖子注册时间最后登录
森动一时, 积分 1346, 距离下一级还需 1654 积分
该用户从未签到& 在线时间2 小时
微信扫描添加森动网微信公众平台
虽然有很多开源工具通过插件或其它方式可以监测这些开源组件提供的内在性能(所谓内在性能就是这些开源组件提供的类STAT命令获取到的数据),但是不管是部署还是扩展都很麻烦,其实花1-2天时间完全可以实现一个这样的工具,并且扩展起来也很方便。
比如mongodb的:
又比如redis的:
下载DEMO代码,在使用前建议你修改如下地方:
1)完善记录日志的地方
2)把配置改为你自己的配置服务
3)完善其它需要监测的开源组件
4)完善网站的分页等功能
最后预祝大家新年快乐!
本帖子中包含更多资源
才可以下载或查看,没有帐号?
好友积分1331森币211 精华0主题帖子注册时间最后登录
森动一时, 积分 1331, 距离下一级还需 1669 积分
该用户从未签到& 在线时间1 小时
论坛办的越来越好
好友积分1171森币151 精华0主题帖子注册时间最后登录
森动一时, 积分 1171, 距离下一级还需 1829 积分
该用户从未签到& 在线时间0 小时
技术小白学习中
好友积分1178森币158 精华0主题帖子注册时间最后登录
森动一时, 积分 1178, 距离下一级还需 1822 积分
该用户从未签到& 在线时间0 小时
看了,不怎么样吧!&&
好友积分1194森币174 精华0主题帖子注册时间最后登录
森动一时, 积分 1194, 距离下一级还需 1806 积分
该用户从未签到& 在线时间0 小时
支持你加团币,团币不好赚啊
好友积分1276森币196 精华0主题帖子注册时间最后登录
森动一时, 积分 1276, 距离下一级还需 1724 积分
该用户从未签到& 在线时间0 小时
有空一起交流一下&&
微信号:sd微信扫描添加森动网微信公众平台
Powered by28341人阅读
作者:刘旭晖 Raymond 转载请注明出处
Memcached和Redis作为两种Inmemory的key-value数据库,在设计和思想方面有着很多共通的地方,功能和应用方面在很多场合下(作为分布式缓存服务器使用等)
也很相&#20284;,在这里把两者放在一起做一下对比的介绍
基本架构和思想
首先简单介绍一下两者的架构和设计思路
Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议&#26684;式要求,客户端Library可以用任何语言实现。
从用户的角度来说,服务器维护了一个键-&#20540;关系的数据表,服务器之间相互独立,互相之间不共享数据也不做任何通讯操作。客户端需要知道所有的服务器,并自行负责管理数据在各个服务器间的分配。
在服务器端,内部的数据存储,使用基于Slab的内存管理方式,有利于减少内存碎片和频繁分配销毁内存所带来的开销。各个Slab按需动态分配一个page的内存(和4Kpage的概念不同,这里默认page为1M),page内部按照不同slab
class的尺寸再划分为内存chunk供服务器存储KV键&#20540;对使用
Memcached的基本应用模型如下图所示
Redis的基本应用模式和上图memcached的基本相&#20284;,不难发现网上到处都是关于redis是否可以完全替代memcached使用的问题
Redis内部的数据结构最终也会落实到key-Value对应的形式,不过从暴露给用户的数据结构来看,要比memcached丰富,除了标准的通常意义的键&#20540;对,Redis还支持List,Set,
Hashes,Sorted Set等数据结构
Memcached的命令或者说通讯协议非常简单,Server所支持的命令基本就是对特定key的添加,删除,替换,原子更新,读取等,具体包括&Set,
Get, Add, Replace, Append, Inc/Dec 等等
Memcached的通讯协议包括文本&#26684;式和二进制&#26684;式,用于满足简单网络客户端工具(如telnet)和对性能要求更高的客户端的不同需求
Redis的命令在KV(String类型)上提供与Memcached类&#20284;的基本操作,在其它数据结构上也支持基本类&#20284;的操作(当然还有这些数据结构所特有的操作,如Set的union,List的pop等)而支持更多的数据结构,在一定程度上也就意味着更加广泛的应用场合
除了多种数据结构的支持,Redis相比Memcached还提供了许多额外的特性,比如Subscribe/publish命令,以支持发布/订阅模式这样的通知机制等等,这些额外的特性同样有助于拓展它的应用场景
Redis的客户端-服务器通讯协议完全采用文本&#26684;式(在将来可能的服务器间通讯会采用二进制&#26684;式)
redis通过Multi / Watch /Exec等命令可以支持事务的概念,原子性的执行一批命令。在2.6以后的版本中由于添加了对Script脚本的支持,而脚本固有的是以transaction事务的方式执行的,并且更加易于使用,所以不排除将来取消Multi等命令接口的可能性
Memcached的应用模式中,除了increment/decrement这样的原子操作命令,不存在对事务的支持
数据备份,有效性,持久化等
memcached不保证存储的数据的有效性,Slab内部基于LRU也会自动淘汰旧数据,客户端不能假设数据在服务器端的当前状态,这应该说是Memcached的Feature设定,用户不必太多关心或者自己管理数据的淘汰更新工作,当然是否适合你的应用,取决于具体的需求,它也可能成为你需要精确自行控制Cache生命周期的一个障碍
Memcached也不做数据的持久化工作,但是有许多基于memcached协议的项目实现了数据的持久化,例如memcacheDB使用BerkeleyDB进行数据存储,但本质上它已经不是一个Cache
Server,而只是一个兼容Memcached的协议key-valueData Store了
Redis可以以master-slave的方式配置服务器,Slave节点对数据进行replica备份,Slave节点也可以充当Read
only的节点分担数据读取的工作
Redis内建支持两种持久化方案,snapshot快照和AOF
增量Log方式。快照顾名思义就是隔一段时间将完整的数据Dump下来存储在文件中。AOF增量Log则是记录对数据的修改操作(实际上记录的就是每个对数据产生修改的命令本身),两种方案可以并存,也各有优缺点,具体参见
以上Redis的数据备份持久化方案等,如果不需要,为了提高性能,也完全可以Disable
性能方面,两者都有一些自己考虑和实现
memcached自身并不主动定期检查和标记哪些数据需要被淘汰,只有当再次读取相关数据时才检查时间戳,或者当内存不够使用需要主动淘汰数据时进一步检查LRU数据
Redis为了减少大量小数据CMD操作的网络通讯时间开销
RTT (Round Trip Time),支持pipeline和script技术
所谓的pipeline就是支持在一次通讯中,发送多个命令给服务器批量执行,带来的代价是服务器端需要更多的内存来缓存查询结果。
Redis内嵌了LUA解析器,可以执行lua
脚本,脚本可以通过eval等命令直接执行,也可以使用script
load等方式上传到服务器端的script cache中重复使用
这两种方式都可以有效地减少网络通讯开销,增加数据吞吐率
对于KV的操作,Memcached和Redis都支持Multiple的Get和Set命令(Memcached的Multiple
Set命令貌&#20284;只在二进制的协议中支持),这同样有利于性能的提升
实际性能方面,网上有很多测试比较,给出的结果各不相同,这无疑和各种测试的测试用例,测试环境,和测试时具体使用的客户端Library实现有关。但是总体看下来,比较靠谱的结论是在kv类操作上,两者的性能接近,Memcached的结构更加简单,理论上应该会略微快一些。
memcached的服务器端互相完全独立,客户端通常通过对键&#20540;应用Hash算法决定数据的分区,为了减少服务器的增减对Hash结果的影响,导致大面积的缓存失效,多数客户端实现了一致性hash算法
Redis计划在服务器端内建对集群的支持,但是目前代码还处于alpha阶段(貌&#20284;已经Design了两三年了?)在此之前,同样可以认为每个Redis服务器实例相互之间是完全独立的,需要依靠客户端处理分区算法和可用服务器列表管理的工作。
Redis官方推荐的用于Sharding的客户端程序库是Twitter的开源项目
Twemproxy, Twemproxy同时支持Memcached和Redis的文本通讯协议。
需要注意的是,Redis的许多命令在集群环境下是不能正确运行的,例如set的交集,以及跨节点的事务操作等等,因为目前的Redis集群设计,根本目标也就是服务器之间互相汇报一下存活状态,以及对数据做荣誉备份平衡负载等而已,本质上对数据的跨节点操作并不提供任何额外支持,所以在数据服务的层面上来说,各个服务器依旧是完全独立的。
这些操作如果一定要实现,当然可以通过客户端代码来实现(效率有多高且不说),类&#20284;的问题memcached集群当然也会遇上,但是原本memcached就不支持复杂的操作和数据类型,许多运算逻辑原本就是由客户端代码或应用程序自己处理的。
MR类批处理应用
提供指定范围的遍历操作,是支持类&#20284;MapReduce这样的批处理应用逻辑的关键之一,但是要在基于hash方式存储的数据结构的基础上提供这样的支持并不容易(或者说要实现高效的范围或遍历操作并不容易)
Redis支持Scan操作用于遍历数据集,这一操作基于其内部数据结构及实现的限制,可以保证在Scan开始时的所有数据都能被获取到,但是不能保证不返回重复的数据,这需要由客户端来检查,或者客户端对此无所谓。Scan操作还支持Match条件用来过滤键&#20540;,虽然存在一定的局限性,例如match条件的比较是在获取数据之后再执行的,效率是一个问题,更明显的问题是不能保证每次scan的iterate过程都能返回同样数量的有效数据。
对于范围操作,Redis的Ordered
Set支持在插入时指定数据的分数(Score)用于排序,而后支持在指定Score范围内的各种操作,虽然由于不支持基于字符串的或自定义的基准的Range操作,这样的范围操作应用起来有很大的局限性(或者说需要满足特定的应用模式),但是还是比没有好了
Memcached核心协议本身不支持任何范围类的操作,也没有对遍历操作的支持,甚至不存在官方合法的列举所有Key的操作,这当然很大程度上源于其设计思想和精简的架构
不过还是有一些兼容memcached协议的服务器实现了范围类操作,具体&#26684;式可以参考
所建议的标准
此外Redis的Hashes数据结构,在一定程度上可以满足获取特定子集数据的应用逻辑需求。
综上来说,如果要实现类&#20284;HBase支持的scan操作,不论是Redis还是memcached都无法做到,但是对于Redis来说,能否用于批处理类应用,不能一概而论,取决于具体的数据的&#26684;式逻辑和使用方式。通过适当的调整应用程序使用数据的方式,还是有可能在一定程度上实现对MR类批处理,或范围查询类应用逻辑的支持的。而对于键&#20540;分布在一个较大的连续空间,数量不确定,同时又无法很好的映射为数&#20540;进而使用ordered
set来处理的这样一些数据结构,应该还是很难高效的分区遍历的
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:617349次
积分:6101
积分:6101
排名:第1861名
原创:90篇
评论:130条
文章:17篇
阅读:32275
(2)(4)(1)(1)(3)(2)(1)(2)(2)(4)(1)(5)(12)(1)(1)(2)(1)(8)(1)(1)(2)(1)(1)(2)(8)(6)(2)(1)(1)(8)(7)memcache、redis、tair性能对比测试报告_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
memcache、redis、tair性能对比测试报告
原&#8203;创&#8203;测&#8203;试
阅读已结束,如果下载本文需要使用
想免费下载本文?
你可能喜欢

我要回帖

更多关于 memcached与redis区别 的文章

 

随机推荐