1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制。Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS
2、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
3、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10
4、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从(去中心化存储Dynomite, http://www.oschina.net/p/cassandra ,Cassandra最大的缺点就是新增节点后,数据转移对节点冲击较大)。
5、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)
6、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复
7、Memcache 在并发场景下,用cas保证一致性。redis事务支持比较弱,只能保证事务中的每个操作连续执行,命令的原子性,中间不会被任何操作打断。
8、网络IO模型
Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。
(Memcached网络IO模型)
Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。
问题:
CAS问题。CAS是Memcached中比较方便的一种防止竞争修改资源的方法。CAS实现需要为每个cache key设置一个隐藏的cas token,cas相当value版本号,每次set会token需要递增,因此带来CPU和内存的双重开销,虽然这些开销很小,但是到单机10G+ cache以及QPS上万之后这些开销就会给双方相对带来一些细微性能差别(5)。
9、Libevent。和Memcached不同,Redis并没有选择libevent。Libevent为了迎合通用性造成代码庞大(目前Redis代码还不到libevent的1/3)及牺牲了在特定平台的不少性能。Redis用libevent中两个文件修改实现了自己的epoll event loop(4)。业界不少开发者也建议Redis使用另外一个libevent高性能替代libev,但是作者还是坚持Redis应该小巧并去依赖的思路。一个印象深刻的细节是编译Redis之前并不需要执行./configure。
10、Redis的VM。
Redis的数据全部放在内存带来了高速的性能,但是也带来一些不合理之处。比如一个中型网站有100万注册用户,如果这些资料要用Redis来存储,内存的容量必须能够容纳这100万用户。但是业务实际情况是100万用户只有5万活跃用户,1周来访问过1次的也只有15万用户,因此全部100万用户的数据都放在内存有不合理之处,RAM需要为冷数据买单。基于相同的考虑,Redis 2.0也增加了VM特性。让Redis数据容量突破了物理内存的限制。并实现了数据冷热分离。
注释:作者antirez在解释为什么要自己实现VM中提到几个原因(6)。主要OS的VM换入换出是基于Page概念,比如OS VM1个Page是4K, 4K中只要还有一个元素即使只有1个字节被访问,这个页也不会被SWAP, 换入也同样道理,读到一个字节可能会换入4K无用的内存。而Redis自己实现则可以达到控制换入的粒度。另外访问操作系统SWAP内存区域时block进程,也是导致Redis要自己实现VM原因之一。
11、用get/set方式使用Redis。Value中尽量使用hashset节省内存。
作为一个key value存在,很多开发者自然的使用set/get方式来使用Redis,实际上这并不是最优化的使用方法。尤其在未启用VM情况下,Redis全部数据需要放入内存,节约内存尤其重要。
假如一个key-value单元需要最小占用512字节,即使只存一个字节也占了512字节。这时候就有一个设计模式,可以把key复用,几个key-value放入一个key中,value再作为一个set存入,这样同样512字节就会存放10-100倍的容量。
这就是为了节约内存,建议使用hashset而不是set/get的方式来使用Redis。
12、使用aof代替snapshot
Redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复重建时间会非常长,这样导致失去aof高可用性本意。另外更重要的是Redis是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。
其实aof目的主要是数据可靠性及高可用性,在Redis中有另外一种方法来达到目的:Replication。由于Redis的高性能,复制基本没有延迟。这样达到了防止单点故障及实现了高可用。
Memcached集群/分布式的单点故障,采用
Magent 缓存代理,代理来负责分配存储到哪个节点,备份到哪个节点
关于Redis的一些周边功能
Redis除了作为存储之外还提供了一些其它方面的功能,比如聚合计算、pubsub、scripting等,对于此类功能需要了解其实现原理,清楚地了解到它的局限性后,才能正确的使用,比如pubsub功能,这个实际是没有任何持久化支持的,消费方连接闪断或重连之间过来的消息是会全部丢失的,又比如聚合计算和scripting等功能受Redis单线程模型所限,是不可能达到很高的吞吐量的,需要谨慎使用。
总的来说Redis作者是一位非常勤奋的开发者,可以经常看到作者在尝试着各种不同的新鲜想法和思路,针对这些方面的功能就要求我们需要深入了解后再使用。
总结:
Redis使用最佳方式是全部数据in-memory。Redis更多场景是作为Memcached的替代者来使用。当需要除key/value之外的更多数据类型支持时,使用Redis更合适。当存储的数据不能被剔除时,使用Redis更合适。
网络来源
http://blog.csdn.net/a923544197/article/details/7594814
http://timyang.net/data/redis-misunderstanding/
http://www.infoq.com/cn/articles/tq-why-choose-redis
http://www.javabloger.com/article/memcached-cluster-error-msag.html
分享到:
相关推荐
4. **映射实体类**:对于需要缓存的实体类,我们需要在它们的`@Entity`注解上添加`@Cacheable`和`@Cache`注解: ```java @Entity @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @Cacheable public class ...
memecachedmemecachedmemecachedmemecachedmemecached
2. 设置为正数:cookie存储在硬盘上,即使浏览器关闭后仍可保留,但这同样可能引发安全风险,因为用户信息可能被持久化。 为解决这些问题,我们可以结合cookie和memcached来实现SSO。将cookie的过期时间设置为非...
一些使用技巧,很实用,大家可以看看.如何实用memcached,以及基本使用方法
在Java应用中,我们可以使用Jedis等库与Memcached进行交互。通过将频繁访问的数据存储在缓存中,可以减少对后端Tomcat服务器的请求,提高响应速度。 为了实现故障转移,Nginx可以检测后端服务器的健康状态。例如,...
linux下nginx-tomcat集群及session共享,亲测成功,下载的文件包含了所有需要的jar包及nginx,memcached安装,配置,由于试了很多种方法,下了很多包,有些也需要积分,所以这里下载要些积分留着用,不好意思了,...
综上所述,`Strategies.zip`可能包含的教程或代码示例将指导开发者如何在ASP.NET和ASP.NET MVC项目中利用C#编程,集成CSRedis以连接和利用Redis进行缓存,同时可能还会涉及如何与Memcached协同工作以优化缓存策略。...
首先,我们要理解session共享的基本需求:在一个分布式系统中,用户在任何一台服务器上产生的session信息应该能在其他服务器上访问,以便提供一致性的用户体验。Memcached作为一个高性能、分布式的内存对象缓存系统...
在windows下安装memcached时,下了很多资源,很多都不能用或者不确定当前版本是否与本地php版本相对应。于是就整了份完整资料,给有需要的人。本地php是5.3版本的,所以压缩包里放了memcached 2.2.6版的...
database-transform-tool 为数据监控以及数据同步提供C/S方式的J2SE的swing的图形化界面服务,并为服务提供高性能的同步以及监控服务。 ...2)NoSQL服务[Cassandra|MongoDB|Redis|Memecached] 3)S
1)软件资源列表:《memcached-1.4.15.tar.gz》,《libevent-1.4.14b-stable.tar.gz》。 2)安装操作系统环境:CentOS-6.5,(其它linux操作系统请自行尝试)。 3)安装步骤详解:... ...
大体分为3个阶段的学习: 第一阶段是mvc基础的学习,通过通俗... 大型网站架构:UnitTest、AutoFac、分布式架构(Redis、Memecached等)、CDN与云存储、云计算服务(短信验证、SendCloud邮件云)、RBAC权限控制、页
ssm(Spring+SpringMVC+Mybatis)框架集成apache cxf2.7,并同时集成了memecached(缓存服务器)+mongodb(NoSQL)+定时任务队列(Quartz).
nginxWeb服务器,原始优化...memecached的存取速度快,但tcp连接的时间消耗就成为主要因素. 如果还有现高的要求-->memcached连接池,模仿java的数据库连接池. 这对于PHP运行特点,需要有专门第3方的扩展,PHP本身不行.
/** * Memcached */ 'PERSISTENTID' => 'mlm_cache',//持久链接标示 'MEMCACHED_HOST' => '127.0.0.1', //可数组形式...'MEMECACHED_WEIGHT' => 0,//权重 将类库拷贝到 \ThinkPHP\Library\Think\Cache\Driver 文件夹下
甚至fork memecached似乎也没有得到维护。 因此,我决定改写我自己的客户端。 特征 基本命令,例如得到,设置 单个服务器的池 使用多服务器支持 元命令 二进制支持 SASL支持 流支持(node.js stream ) 文件...
运行平台是指 CentOS、Nginx、PHP、MongoDB、Memecached、MySQL 等技术的整合。这些技术的整合可以构建一个高性能的服务器平台环境。 四、学习目标 * 掌握 MongoDB 的使用和应用 * 掌握 Cache 的使用和应用 * 掌握...
完全可以根据github的要求来配置,我只是没分了~ 官网地址:https://github.com/magro/memcached-session-manager/wiki/SetupAndConfiguration#add-memcached-session-manager-jars-to-tomcat