1、Redis 不仅 仅 支 持 简 单 的 k/v 类型 的 数 据 ,同时 还 提 供 list,set,zset,hash等数 据 结 构 的 存 储 。而 memcache 只支 持 简 单 数 据 类 型 ,需要 客 户 端 自 己 处 理 复杂对 象
2、 Redis 支持 数 据 的 持 久 化 , 可 以 将 内 存 中 的 数 据 保 持 在 磁 盘 中 , 重 启 的 时 候 可以再 次 加 载 进 行 使 用 ( PS:持 久 化 在 rdb、 aof)。
3、由 于 Memcache 没有 持 久 化 机 制 , 因 此 宕 机 所 有 缓 存 数 据 失 效 。 Redis 配置为持 久 化 , 宕 机 重 启 后 , 将 自 动 加 载 宕 机 时 刻 的 数 据 到 缓 存 系 统 中 。 具 有 更 好 的灾备 机 制 。
4、Memcache 可以 使 用 Magent 在客 户 端 进 行 一 致 性 hash 做分 布 式 。Redis 支持在 服 务 器 端 做 分 布 式( PS:Twemproxy/Codis/Redis-cluster 多种 分 布 式 实 现 方式)
5、Memcached 的简 单 限 制 就 是 键 ( key)和 Value 的限 制 。最大 键 长 为 250 个字符 。 可 以 接 受 的 储 存 数 据 不 能 超 过 1MB(可 修 改 配 置 文 件 变 大 ) , 因 为 这 是 典型 slab 的最 大 值 , 不 适 合 虚 拟 机 使 用 。 而 Redis 的 Key 长度 支 持 到 512k。
6、 Redis 使用 的 是 单 线 程 模 型 , 保 证 了 数 据 按 顺 序 提 交 。 Memcache 需要 使 用cas 保证 数 据 一 致 性 。 CAS( Check and Set)是 一 个 确 保 并 发 一 致 性 的 机 制 , 属于 “ 乐观 锁 ” 范畴 ; 原 理 很 简 单 : 拿 版 本 号 , 操 作 , 对 比 版 本 号 , 如 果 一 致 就 操
作, 不 一 致 就 放 弃 任 何 操 作 。 由 于 Redis 只使 用 单 核 , 而 Memcached 可以 使 用 多 核 , 所 以 平 均 每一个 核 上 Redis 在存 储 小 数 据 时 比 Memcached 性能 更 高 。而在 100k 以上 的 数据中 , Memcached 性能 要 高 于 Redis 。
7、 memcache 内存 管 理 : 使 用 Slab Allocation。原 理 相 当 简 单 , 预 先 分 配 一 系列大 小 固 定 的 组 ,然后 根 据 数 据 大 小 选 择 最 合 适 的 块 存 储 。避免 了 内 存 碎 片 。( 缺点: 不 能 变 长 , 浪 费 了 一 定 空 间 ) memcached 默认 情 况 下 下 一 个 slab 的最 大 值为前 一 个 的 1.25 倍。
8、redis 内存 管 理 : Redis 通过 定 义 一 个 数 组 来 记 录 所 有 的 内 存 分 配 情 况 , Redis采用 的 是 包 装 的 malloc/free, 相较 于 Memcached 的内 存 管理 方 法 来 说 , 要简单很 多 。由于 malloc 首先 以 链 表 的 方 式 搜 索 已 管 理 的 内 存 中 可 用 的 空 间 分 配 ,导致内 存 碎 片 比 较 多