Memcached 是一种免费开源、高性能、分布式内存对象缓存系统,旨在易于使用和简单性,非常适合用作缓存或会话存储,通过减轻数据库负载来加速动态 Web 应用程序。
Memcached 是内存中键值存储,用于存储来自数据库调用、API 调用或页面渲染结果的小块任意数据(字符串、对象)。
接下来是来自官方的一个例子
Memcached和 redis 都是易使用且性能优异的 nosql 缓存数据库
memcached 和 redis 区别
数据结构
Memcached 是简单的 kv 键值存储,支持任意类型数据,适合简单使用缓存的场景;memcached将数据只是保存成字符串;
redis 支持多种数据类型:字符串、hash、list、set、zset、位图等,灵活应用于各种场景;不同的数据结构存储成不同的数据类型
数据长度
redis 数据键和字符串最大长度为 512MB,但是处于出于性能原因,不建议使用大 kv
memcached 默认最大值 1MB
持久化
memcache 不支持磁盘持久化,是存内存数据,一旦服务出现崩溃、重启,内存中的数据都会丢失,比较适用于允许数据丢失的场景;
redis 支持磁盘持久化,发生崩溃、重启都可以从磁盘重新加载数据,但是 redis 的持久化也不是绝对安全地保证数据的完整性,redis 支持两种RDB 和 aof。rdb通常配置为 n 分钟或者操作数据 n 次就自动保存一份快照,或者手动进行一次快照保存,这样就会存在一定问题,在这 n 分钟或者 n 次时发生问题,数据就造成丢失;aof会记录每个写操作,将写命令追加到 AOF 文件,但是为了性能,更多允许使用异步写入和缓冲机制,。在默认的 everysec 同步策略下,Redis 每秒钟尝试将 AOF 缓冲区的内容同步到磁盘一次,如果此时崩溃,就会造成数据丢失
数据淘汰策略
redis 提供多种淘汰策略,比较常用的 TTL(生存时间),当键到达过期时间时,自动删除该键;LRU 最近最少使用;LFU 不经常使用,redis 跟踪 key 的使用频率,根据使用频率删除不长使用的 key;Random随机等
Memcached 使用 LRU 来管理其缓存。当内存不够时,最近最少使用的数据并将其删除
复制
memcached 原生不支持复制功能;
redis 支持主从复制,提供更高的容错性和高可用性
集群
redis 支持集群功能,可多个节点之间传播数据,以提供容错性和可扩展性;同时支持 redis cluster模式,采取分槽技术,可以将集群进行水平扩展(有机会后续写一下)
memcached 不支持集群,每个服务单独运行,需要客户端自行通过分片技术实现集群和水平扩展
高可用性
redis 支持集群和主从复制功能,一旦 master 出现问题,其他从服务器可以切换成 master 提供服务,恢复的 master 也会转换成从服务器;同时使用 sentinel 工具,监控主从节点的状态,当 master 出现问题,安排合适的 redis 从节点升级为 master
多线程
memcached 采用多线程架构,可以同时处理多个查询,在处理大并发的场景单机性能更显著;
redis 是单线程服务器,单个进程处理查询、写入操作,但是 redis 使用非阻塞 io 和事件驱动 同时管理多个客户端,并且操作的都是内存,单线程同时不存在上下文切换的消耗,性能上还是很 ok 的