总结一:
memcache官方定义
Free & open source, high-performance, distributed memory object caching
system, generic in nature, but intended for use in speeding up dynamic web
applications by alleviating database load.
redis官方定义
Redis is an open source, BSD licensed, advanced key-value store. It is often
referred to as a data structure server since keys can contain strings, hashes,
lists, sets and sorted sets.
版权相同
它们都是使用的bsd协议,使用它的项目可以用于商业用户,不必发布二次修改的代码,可以修改源代码。
数据类型
redis数据类型丰富,支持set liset等类型
memcache支持简单数据类型,需要客户端自己处理复杂对象
持久性
redis支持数据落地持久化存储
memcache不支持数据持久存储
分布式存储
redis支持master-slave复制模式
memcache可以使用一致性hash做分布式
value大小不同
memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用
数据一致性不同
redis使用的是单线程模型,保证了数据按顺序提交。
memcache需要使用cas保证数据一致性。CAS(Check and
Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作
cpu利用
redis单线程模型只能使用一个cpu,可以开启多个redis进程
总结二:
1.Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
2.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
4.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
我个人认为最本质的不同是Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存
总结三:
redis和memecache的不同在于:
1、存储方式:
memecache
把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性。
2、数据支持类型:
redis在数据支持上要比memecache多的多。
3、使用底层模型不同:
新版本的redis直接自己构建了VM
机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、运行环境不同:
redis目前官方只支持LINUX
上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上
memcache只能当做缓存,cache
redis的内容是可以落地的,就是说跟mongodb有些类似,然后redis也可以作为缓存,并且可以设置master-slave
1. redis是什么
这个问题的结果影响了我们怎么用redis。如果你认为redis是一个key value store, 那可能会用它来代替mysql;如果认为它是一个可以持久化的cache, 可能只是它保存一些频繁访问的临时数据。redis是remote dictionary server的缩写,在redis在官方网站的的副标题是a persistent key-value database with built-in net interface written in ansi-c for posix systems,这个定义偏向key value store。还有一些看法则认为redis是一个memory database,因为它的高性能都是基于内存操作的基础。另外一些人则认为redis是一个data structure server,因为redis支持复杂的数据特性,比如list, set等。对redis的作用的不同解读决定了你对redis的使用方式。
互联网数据目前基本使用两种方式来存储,关系数据库或者key value。但是这些互联网业务本身并不属于这两种数据类型,比如用户在社会化平台中的关系,它是一个list,如果要用关系数据库存储就需要转换成一种多行记录的形式,这种形式存在很多冗余数据,每一行需要存储一些重复信息。如果用key value存储则修改和删除比较麻烦,需要将全部数据读出再写入。redis在内存中设计了各种数据类型,让业务能够高速原子的访问这些数据结构,并且不需要关心持久存储的问题,从架构上解决了前面两种存储需要走一些弯路的问题。
2. redis不可能比memcache快
很多开发者都认为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)。
3. 单台redis的存放数据必须比物理内存小
redis的数据全部放在内存带来了高速的性能,但是也带来一些不合理之处。比如一个中型网站有100万注册用户,如果这些资料要用redis来存储,内存的容量必须能够容纳这100万用户。但是业务实际情况是100万用户只有5万活跃用户,1周来访问过1次的也只有15万用户,因此全部100万用户的数据都放在内存有不合理之处,ram需要为冷数据买单。
这跟操作系统非常相似,操作系统所有应用访问的数据都在内存,但是如果物理内存容纳不下新的数据,操作系统会智能将部分长期没有访问的数据交换到磁盘,为新的应用留出空间。现代操作系统给应用提供的并不是物理内存,而是虚拟内存(virtual memory)的概念。
基于相同的考虑,redis 2.0也增加了vm特性。让redis数据容量突破了物理内存的限制。并实现了数据冷热分离。
4. redis的vm实现是重复造轮子
redis的vm依照之前的epoll实现思路依旧是自己实现。但是在前面操作系统的介绍提到os也可以自动帮程序实现冷热数据分离,redis只需要os申请一块大内存,os会自动将热数据放入物理内存,冷数据交换到硬盘,另外一个知名的“理解了现代操作系统(3)”的varnish就是这样实现,也取得了非常成功的效果。
作者antirez在解释为什么要自己实现vm中提到几个原因(6)。主要os的vm换入换出是基于page概念,比如os vm1个page是4k, 4k中只要还有一个元素即使只有1个字节被访问,这个页也不会被swap, 换入也同样道理,读到一个字节可能会换入4k无用的内存。而redis自己实现则可以达到控制换入的粒度。另外访问操作系统swap内存区域时block进程,也是导致redis要自己实现vm原因之一。
5. 用get/set方式使用redis
作为一个key value存在,很多开发者自然的使用set/get方式来使用redis,实际上这并不是最优化的使用方法。尤其在未启用vm情况下,redis全部数据需要放入内存,节约内存尤其重要。
假如一个key-value单元需要最小占用512字节,即使只存一个字节也占了512字节。这时候就有一个设计模式,可以把key复用,几个key-value放入一个key中,value再作为一个set存入,这样同样512字节就会存放10-100倍的容量。
这就是为了节约内存,建议使用hashset而不是set/get的方式来使用redis,详细方法见参考文献(7)。
6. 使用aof代替snapshot
redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复重建时间会非常长,这样导致失去aof高可用性本意。另外更重要的是redis是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。
其实aof目的主要是数据可靠性及高可用性,在redis中有另外一种方法来达到目的:replication。由于redis的高性能,复制基本没有延迟。这样达到了防止单点故障及实现了高可用。
小结
要想成功使用一种产品,我们需要深入了解它的特性。redis性能突出,如果能够熟练的驾驭,对国内很多大型应用具有很大帮助。
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....