Redis vs Memcached
- 1 概览
- 2 什么是 Memcached
- 3 什么是 Redis
- 4 Memcached 和 Redis 的相似点
- 5 Memcached 和 Redis 的不同
- 6 选择 Memcached 还是 Redis
- 7 参考
1 概览
- 关系型数据库是常见的数据库类型,但是不适合存储大量的数据。因此,引入了 NoSQL。它表示非关系型或非 SQL。Memcached 和 Redis 归类为 NoSQL
- Memcached 和 Redis 最大的区别在于
- Memcached 是开源的,高性能,分布式内存缓存系统,可通过最小化数据加载代价而加速 web 应用
- Redis 是开源的,key-value 存储,用于建设可扩展的 web 应用
2 什么是 Memcached
- Memcached 是开源的,高性能,分布式内存缓存系统。它是持久化数据存储
- Memcached 主要的优势在于它降低了数据库加载代价,因此对于大量数据库加载的网站是非常有效且快速的
- Memcached 有存储命令、检索命令、统计命令
- 存储命令
- set:为一个新的或已有的键设置新值
- add:为一个新键设置值
- replace:替换已有的键的值
- append:为已有键增加一些数据
- 检索命令
- get:获取键中保存的值
- delete:删除已有键
3 什么是 Redis
- Redis 是开源的,内存型数据结构存储,用作数据库、缓存和消息代理
- Redis 代表远程字典服务器(remote dictionary server)。以 key-value 格式存储数据
- 用户在 Redis 命令行界面(command line interfacem, CLI),使用命令和数据库通信
- SET:写数据到 Redis 数据存储
- GET:从 Redis 数据存储读数据
- Redis 简单易用。它归类为 NoSQL 数据库。和像 MySQL,Oracle 的关系型数据库不同,Redis 不使用表存储数据
- Redis 不使用常规的 SQL 命令,例如 select、delete、create、update 等
- Redis 使用数据结构存储数据。主要的数据结构是 string,list,set,sorted set,hash,bitmap 等
- Redis 使用 C 语言编写,是开源的,跨平台的系统
- Redis 主要的优势在于它保存数据在内存中。这使得 Redis 非常快速。它也可以写数据到磁盘。Redis 可用作一个缓存系统或是全面的数据库
- Redis 另外一个优势是它可以和其他数据库一起使用。Redis 可以存储频繁访问的数据,而不访问主要的数据库,并且可以从主要的数据库获取其它的数据
- Redis 遵循 master-slave 架构。它提供性能、可扩展性且易用
4 Memcached 和 Redis 的相似点
- 都归类为 NoSQL
- 都以 key-value 格式存储数据:Redis 更准确的描述是作为数据结构存储
- 都将存储数据到内存(毫秒级延迟)
- 二者都是轻量级,和易失缓存一样快
- Memcached 易失内存型的 key-value 存储
- Redis 不限于此,是一个数据结构服务
- 易用性、支持多种编程语言(Java/Python/PHP/C/C++/C#/JavaScript/NodeJS/Ruby/Go)
- 支持数据分割:允许分布数据到多个节点,以便随着需求增长扩展数据处理能力
5 Memcached 和 Redis 的不同
不同点 | Memcached | Redis |
---|---|---|
描述 | 开源的,高性能,分布式内存缓存系统,可通过最小化数据加载代价而加速 web 应用 | 开源的,key-value 存储,可作为数据库、缓存和消息代理 |
易安装 | N | Y |
高级数据结构 | N(字符串和整型) | Y(string/list/set/sorted set/hash) |
多线程架构 | Y(充分利用多核) | N |
快照 | N | Y(时间快照存储数据到磁盘,用于归档或恢复) |
复制 | N | Y(支持 master-slave 复制) |
事务 | N | Y |
pub/sub | N | Y |
Lua 脚本 | N | Y |
地理空间支持 | N | Y(可查找两个元素之间的距离,或者查找给定范围的所有元素) |
速度 | 读写速度更快 | 读写速度快,但是取决于开发的应用 |
6 选择 Memcached 还是 Redis
6.1 选择 Memcached
- 当缓存相当小的静态数据,比如 HTML 代码段:Memcached 内部的内存管理系统在最简单的应用场景下是更加高效,因为只占用相当小的内存资源用于元数据
- 当数据大小动态变化,Memcached 的内存管理效率快速下降,有时内存会碎片化
- 同时,大数据集经常牵涉到序列化数据,需要更多空间存储
- 如果使用Memcached,当重启时数据会丢失,而且重建缓存代价很好
- Memcached 在伸缩性方面比 Redis 好: Memcached 是多线程,很方便增加计算资源;Redis 大多数是单线程,在不丢失数据的情况下只能通过集群水平增长
- 集群是有效的扩展方案,但是在设置和操作方面很复杂
- Memcached 不支持复制
- Memcached 在处理高流量网站方面更好:可以一次读大量信息,而且响应时间快。
6.2 选择 Redis
- Redis 支持更多数据类型,所以作为缓存可以提供更更好的性能和效率
- 数据回收(data eviction):缓存使用数据回收机制,从内存删除旧数据为新数据分配空间
- Memcached 使用 LRU(least recently used, 最近最少使用)算法,有时随机回收大小类似的数据
- Redis 支持细粒度控制回收,提供 6 种不同的回收策
- Redis 支持 lazy 和 active 的回收,即需要更多空间或主动地(proactively)
- Memcached 值支持 lazy 回收
- Redis 作为数据结构的一些特性
- 丰富的数据类型和使用命令
- 默认持久化到磁盘
- 锁事务(WATCH/MULTI/EXEC)
- 发布订阅(pub/sub)非常快
- 值可达 512MB(Memcached 限制每个键 1MB)
- 支持 Lua 脚本(2.6 开始)
- 内嵌集群(3.0 开始)
- 在各方面非常快
- Redis 丰富的数据类型非常重要。它支持 Redis 提供共享队列(lists),消息机制(pub/sub),存储会话(hash),高评分跟踪(sorted set)
6.3 总结
- Memcached 和 Redis 归类为 NoSQL。它们不使用结构化化查询语言(structed query language)来存储、检索和操作数据
- 不同点在于 Memcached 是开源、高性能分布式内存缓存系统,Redis 是开源、key-value 存储用于构建可扩展 web 应用
- 使用 Memcached 还是 Redis 取决于应用:需要高级数据结构时可使用 Redis;降低数据库加载代价,加速 web 应用可使用 Memcached