一、支持的存储类型不同

虽然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 <- Slave1 <- Slave2 <- Slave3…

这样的构造方便办理单点故障问题,实现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(驱逐):禁止驱逐数据;七、经典架构