Dhr*_*hak 81 memcached caching redis
Redis可以完成Memcached提供的所有内容(LRU缓存,项目到期,现在在版本3.x +中进行集群,目前处于测试阶段)或者使用twemproxy等工具.性能也类似.更重要的是,Redis增加了持久性,因此在服务器重启时您不需要进行缓存加温.
参考比较Redis和Memcache的一些旧答案,其中一些支持Redis作为Memcache的替代(如果已经存在于堆栈中):
尽管如此,在研究Instagram,Pinterest,Twitter等大型网络规模公司的堆栈时,我发现他们将Memcached和Redis用于不同目的,而不是使用Redis进行主要缓存.主缓存仍然是Memcached,Redis用于基于数据结构的逻辑缓存.
截至2014年,为什么memcached仍然值得将其作为附加组件添加到堆栈中,当你已经有一个可以完成memcached可以做的所有事情的Redis组件时?除了现有的Redis之外,建筑师/工程师还有哪些优点还包括memcached?
对于我们的平台,我们已经完全丢弃了Memcached,并将redis用于简单和逻辑缓存要求.高性能,灵活可靠.
一些示例场景:
ant*_*rez 116
我今天看到的主要原因是作为Redis上memcached的一个用例,你应该能够通过简单的 HTML片段缓存(或类似的应用程序)获得更高的内存效率.如果你需要在不同的memcached键中存储对象的不同字段,那么Redis哈希将更有效地记忆,但是当你有大量的key - > simple_string对时,memcached应该能够为你提供更多的项目兆字节.
关于memcached的其他好处:
我相信随着人们转向智能缓存或者他们试图通过Redis数据结构保留缓存数据的结构,Redis作为缓存变得越来越有意义.
memcached和Redis都不会执行真正的LRU驱逐,而只是近似的驱逐.
Memcache逐出是每个大小的类,并取决于其slab分配器的实现细节.例如,如果要添加适合给定大小类的项目,memcached将尝试删除该类中过期/不最近使用的项目,而不是尝试全局尝试了解对象是什么,而不管其是什么大小,这是最好的候选人.
当maxmemory达到极限时,Redis会尝试选择一个好的对象作为驱逐的候选对象,查看所有对象,无论大小类如何,但只能提供近似良好的对象,而不是具有更大空闲的最佳对象时间.
Redis这样做的方法是对几个对象进行采样,选择空闲(未访问)的对象最长时间.自Redis 3.0(目前处于测试阶段)以来,该算法得到了改进,并且在驱逐期间也获得了良好的候选池,因此近似得到了改进.在Redis文档中,您可以找到描述和图表,其中包含有关其工作原理的详细信息.
Redis是一个更复杂的软件,因此Redis中的值以与高级编程语言中的对象更相似的方式存储:它们具有关联的类型,编码,用于内存管理的引用计数.这使得Redis内部结构良好且易于管理,但与仅处理字符串的memcached相比具有开销.
Redis能够以特殊的内存保存方式存储小型聚合数据类型.例如,表示对象的小Redis Hash内部存储的不是哈希表,而是存储为二进制唯一的blob.因此,将每个对象的多个字段设置为哈希比将N个分离的密钥存储到memcached中更有效.
实际上,您可以将对象作为单个JSON(或二进制编码)blob存储到memcached中,但与Redis相反,这将不允许您获取或更新独立字段.
由于Redis数据结构,在缓存失效时使用memcached销毁对象的常用模式,以后再从DB中重新创建它,是使用Redis的一种基本方式.
例如,假设您需要缓存发布到Hacker News中的最新N个新闻,以填充网站的"最新"部分.你用Redis做的是拿一个列表(上限为M项)并插入最新的新闻.如果您使用另一个商店作为数据,并将Redis用作缓存,那么您在发布新项目时将填充两个视图(Redis和DB).没有缓存失效.
但是,应用程序始终具有逻辑,因此如果发现Redis列表为空,例如在启动后,可以从DB重新创建初始视图.
通过使用智能缓存,与memcached相比,可以使用Redis以更有效的方式执行缓存,但并非所有问题都适合此模式.例如,HTML片段缓存可能无法从此技术中受益.
Ita*_*ber 13
习惯很难打破:)
但说真的,有两个主要原因 - 据我所知 - 为什么仍然使用Memcached:
然而: