转载

原来你们是这种key-value存储

上周 毛老师 ,在内部分享为我们扫盲了一下Memcached和Redis的支持,讲了很多东西,我一般比较懒不愿意去记东西喜欢把总结成blog,当我忘记的时候可以回头看看。好的废话就说这么多。先看Memcached和Redis的介绍:

Memcached

memcached 是一套 分布式 的高速缓存系统,由 LiveJournal 的Brad Fitzpatrick开发,但目前被许多网站使用。这是一套 开放源代码 软件 ,以 BSD license 授权发布。

memcached缺乏 认证 以及 安全 管制,这代表应该将memcached服务器放置在 防火墙 后。

memcached的 API 使用三十二比特的 循环冗余校验 (CRC-32)计算 键值 后,将数据分散在不同的机器上。当表格满了以后,接下来新增的数据会以 LRU 机制替换掉。由于memcached通常只是当作缓存系统使用,所以使用memcached的应用程序在写回较慢的系统时(像是后端的 数据库 )需要额外的代码更新memcached内的数据。

Redis

Redis 是一个 开源 、支持网络、基于内存、键值对存储数据库,使用 ANSI C 编写。从 2015 年 6 月开始,Redis 的开发由 Redis Labs 赞助,在 2013 年 5 月至 2015 年 6 月期间,其开发由 Pivotal 赞助。 [1] 在2013年5月之前,其开发由 VMware 赞助。 [2] [3] 根据月度排行网站DB-Engines.com的数据显示,Redis是最流行的键值对存储数据库。 [4]

传统MySQL+ Memcached架构遇到的问题

实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:

  1. MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。
  2. Memcached与MySQL数据库数据一致性问题。
  3. Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。
  4. 跨机房cache同步问题。

Redis与Memcached的比较

网络IO模型:

Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。

原来你们是这种key-value存储

(Memcached网络IO模型)

Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的

内存管理方面:

Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除

Redis使用现场申请内存的方式来存储数据,并且很少使用free-list等方式来优化内存分配,会在一定程度上存在内存碎片,Redis跟据存储命令参数,会把带过期时间的数据单独存放在一起,并把它们称为临时数据,非临时数据是永远不会被剔除的,即便物理内存不够,导致swap也不会剔除任何非临时数据(但会尝试剔除部分临时数据),这点上Redis更适合作为存储而不是cache。

数据一致性问题:

Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。 Redis没有提供cas 命令,并不能保证这点,不过Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断。

存储方式及其它方面:

Memcached基本只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能

Redis除key/value之外,还支持list,set,sorted set,hash等众多数据结构,提供了KEYS

进行枚举操作,但不能在线上使用,如果需要枚举线上数据,Redis提供了工具可以直接扫描其dump文件,枚举出所有数据,Redis还同时提供了持久化和复制等功能。

总结:

  1. Redis使用最佳方式是全部数据in-memory。
  2. Redis更多场景是作为Memcached的替代者来使用。
  3. 当需要除key/value之外的更多数据类型支持时,使用Redis更合适。
  4. 当存储的数据不能被剔除时,使用Redis更合适。

知己知彼,百战不殆。要想很好的在开发中将Memcached与Redis很好的使用好我们就需要深入了解他们的实现原理更多参考阅读:

Memcached

Redis

Redis内存使用优化与存储

Memcached数据被踢(evictions>0)现象分析

如果你还有更好的资料欢迎留言 谢谢

原来你们是这种key-value存储

原文  https://xiequan.info/原来你们是这种key-value存储/
正文到此结束
Loading...