memcache与redis有何区别,redis有哪些优势呢?

小艺吃鸡


简介

说到缓存技术,只要有一定经验的开发人员,肯定会想到redis和memcached这两个。并且在BAT里,redis已经逐渐取代了memcached,成为分布式场景广泛使用的缓存方案。接下来,我们就分析下,redis是如何取代memcached,成为开发者的宠儿的。

一、支持的存储类型不同

虽然redis和memcached都是内存型数据库,并且memcached不仅能够存储string类型,还能够存储图片、文件、视频等格式的文件。然而对于更多的使用内存数据库做缓存以及分布式方案的程序开发者来说,memcached提供的string类型存储的应用场景非常有限,而存储图片视频的功能又十分鸡肋(许多公司的用户场景是没这方面需求)。相比之下,redis提供set,hash,list等多种类型的存储结构,非常适合分布式缓存的实现。

二、数据落盘

memcached 数据不可恢复,虽然大多数人使用缓存以及分布式方案都不会要求数据持久化,但是谁也不能保证不出现万一的情况。一旦发生稳定性问题,memcached挂掉后,数据是不可恢复的,而redis除了支持在配置里打开数据落盘(RDB),还能通过aof来找回数据。

三、内存空间与数据量

memcached可以修改最大内存,使用的是LRU算法,而redis目前底层使用了自己的VM,引入了新的特性突破了物理内存的限制。个人认为在这方面依然是redis更加优秀一些。

备注:value值-redis最大可以达到1GB,而memcache只有1MB;

四、使用场景

(1)、会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

(2)、全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。

此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

(3)、队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

(4),排行榜/计数器

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

(5)、发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

(6)、其他

但是如果是对缓存的数据格式有更多的要求,且对安全性也有很高的要求的话,建议还是使用redis,这也是redis目前正在逐渐代替memcached的根本原因。

五、总结

六、快问快答

1、redis常见性能问题和解决方案?

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

2、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰;

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰;

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰;

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰;

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据;

七、经典架构

---------------END----------------

后续的内容同样精彩








IT实战联盟


首先,Memcached和Redis都是著名的、广泛使用的Nosql数据库。

1. Memcached简介

Memcached 免费开源、高性能、分布式内存对象缓存系统,主要用于作为关系数据库缓存,用来加速应用程序的访问,减轻主数据库的压力。Memcached 是一个内存key-value存储,主要存储字符串或者小的对象等数据库调用,API调用或者页面渲染结果的数据。Memcached立足于简单、快速部署可以解决大型数据库缓存的各种问题。

Memcached同时又非常强大,支持包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang, Lua等语言调用。Memcached在业界广泛应用,除了开发者LiveJournal自己外还有Wikipedia、Flickr、Bebo,WordPress.com,Craigslist、 Mixi也在使用。

2. Redis简介

Redis同样是一个免费开源的key-value存储系统。可以用做数据库,缓存和消息代理使用。Redis支持比较多的数据类型,包括:字符串、哈希 表、链表、集合、有序集合。

Redis使用C语言开发,支持绝大多数类Unix系统,在Linux,BSD、Unix,OS X等符合POSIX的系统下无需任何依赖就能使用。官方建议在线上应用的话最好在Linux下部署。在Windows下有非官方微软自己开发和维护的的Redis。

Redis和Memcached对比

1、性能对比

由于Redis广泛使用的版本只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis也升级新版本3.0以上支持多核,但是3.0以上版本除了增加很多功能外,性能还不如老版本。

这是是相关性能测试对比图:

2、内存使用效率对比

使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。

3、Redis支持服务器端的数据操作

Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached 里,你需要将数据拿到客户端来进行类似的修改再set回去。这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的 GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。

4、Redis的持久化和主从架构

Redis虽然内存的存储系统,但是支持内存数据持久化,而且提供两种主要的持久化策略:RDB快照和AOF日志。使得Redis可以保存比较重要的数据不怕断电后数据丢失,同时基于数据持久化的分布式主从架构也提升了Redis的可用性和性能问题。

作为对比,虽然memecached的虽然也支持通过客户端的分布式存储架构。

关于memcached的命中率

缓存的命中率命中:直接从缓存中get读能取到想要的数据。 不命中:缓存中没有想要的数据,还需要到数据库进行一次查询才能读取到想要的数据。

所以命中率的高低会直接影响memcached性能。那么要如何进行优化,提高命中率呢?

优化设置项目:

1、默认单个item最大数据是1MB,超过1MB数据不予存储,常量POWER_BLOCK 1048576 进行控制,它是默认的slab大小

2、要根据实际业务情况预估一些参数大小,适当的调整内存页大小和增长因子。

设定参数:

-f:chunk增长因子,默认1.25。

-n:指定最小chunk的key+suffix+value大小。

Item (no cas) 48,Item(cas) 56。

当指定-C选项时,最小chunk为-n指定大小+48;当没有-C选项时,最小chunk为-n指定大

3、极端情况下,你可以禁止LRU(最近最少使用算法)试试。通过“-M”参数可以禁止LRU。


分享到:


相關文章: