# 对比 MemCached 和 Redis 区别

# MemCached vs Redis

  1. MemCahced 与 Redis

    通常,我们会考虑在处理大量数据时使用 缓存提高性能

    MemCached 是一个分布式内存缓存系统,设计简单易用,非常适合用作缓存或会话存储。Redis 是一个内存中的 数据结构 存储,它提供了一系列丰富的特性。它作为缓存,数据库,消息代理和队列非常有用

# 2,安装

# 2.1 安装 MemCached

下载最新版的 MemCached 包并执行 make 进行安装

$ wget http://memcached.org/latest
$ tar -zxvf memcached-1.6.3.tar.gz
$ cd memcached-1.6.3
$ ./configure && make && make test && sudo make install

# 2.2 安装 Redis

相似的,安装最新版的 Redis Server

$ wget http://download.redis.io/releases/redis-5.0.8.tar.gz
$ tar xzf redis-5.0.8.tar.gz
$ cd redis-5.0.8
$ make

# 3,求同

# 3.1 亚毫秒延迟

MemCached 和 Redis 都通过将数据保存在内存中来提供 亚毫秒级 的响应时间

# 3.2 数据分区

类似的,两个内存数据库都允许跨多个节点分发数据

# 3.3 编程语言支持

同样,两者都支持所有主要的编程语言,包括 java,python,javascript,c 和 ruby。另外,内存中的两个数据库都有一些 java 客户机。例如:MemCached 有 Xmemcached 和 Memcached-java-client,Redis 有 Jedis, Lettuce, 和 Redisson。

# 3.4 缓存清除

MemCached 允许使用 flush_all 命令清理缓存,相似的 Redis 允许我们从缓存中删除所有内容通过使用命令:FLUSHDB and FLUSHALL

# 3.5 可伸缩性

这两种缓存解决方案都提供了在需求呈指数增长时处理 大数据 的高可伸缩性

# 4,存异

# 4.1 命令行模式

MemCached 可以通过 Telnet 连接到服务器并执行命令:

$ telnet 192.168.8.123 6605
Trying 192.168.8.123
Connected to 192.168.8.123
$ stats
STAT pid 14868
STAT uptime 175931
STAT time 1220540125
// ...

与 MemCached 不同,Redis 有一个专用的命令行界面,Redis cli,允许我们执行命令:

$ redis-cli COMMAND
1) 1) "save"
     2) (integer) 1
     3) 1) "admin"
        2) "noscript"
     // ...
2) 1) "multi"
   2) (integer) 1
   3) 1) "noscript"
      2) "fast"
   // ...
3) 1) "geodist"
   2) (integer) -4
   3) 1) "readonly"
   // ...
 
// ...

在这里,我们执行了 COMMAND 命令,列出 Redis 提供的所有命令。

# 4.2 磁盘 i/o 转储

MemCached 使用第三方工具处理磁盘转储,如 libmemcached tools 或者像 memcached dd.

但是,Redis 为磁盘转储提供了高度可配置的默认机制,如 RDB (Redis 数据库 文件) 或 AOF (仅附加文件)。这对于存档和恢复非常有用

使用 redis cli,我们可以执行同步的 SAVE 获取内存中数据库快照的命令:

$ redis-cli SAVE OK

在这里,命令将快照存储在 转储.rdb 二进制文件,完成后返回状态确定

但是,异步 BGSAVE 的执行将启动产生快照的后台过程:

$ redis-cli BGSAVE
OK

此外,我们可以使用 LASTSAVE 命令检查上次成功的数据库快照的 Unix 时间

$ redis-cli LASTSAVE
(integer) 1410853592

# 4.3 数据结构

MemCached 将 键 - 值 对 存储为字符串,每个值的大小限制为 1MB。不过 [Redis 也支持其他数据结构,像 list, set 和 hash 一样,可以存储高达 512MB 的大小]

# 4.4 复制

MemCached 支持使用第三方 如 repcached 进行复制

与 MemCached 不同,redis 通过复制主存储为我们提供了成倍增加集群的功能,以获得更好的可伸缩性和高可用性。首先,我们可以使用 REPLICAOF 创建 Redis 主服务器的副本。接下来,我们在复制上执行 PSYNC 命令以主机启动复制。

# 4.5 事务

MemCached 不支持事务,尽管其操作是原子的。

Redis 为执行命令提供了开箱即用的事务支持。

我们可以使用 MULTI 命令启动事务。然后使用 EXEC 用于执行后续的命令,最后,Redis 提供了 WATCH 命令用于有条件地执行事务。

# 4.6 发布和订阅消息

MemCached 不提供开箱即用的 发布 / 订阅 机制。

另一方面 Redis,使用 pub/sub 消息队列提供订阅消息的功能。

这在设计需要实时通信的应用程序 (如聊天室,社交媒体订阅源和服务器内部通信) 时非常有用。

Redis 附带了诸如 [PUBLISH],[SUBSCRIBE] 和 [UNSUBSCRIBE] 这样的专用的命令,分别用于将消息发布到频道,订阅和取消订阅客户端到指定频道。

# 4.7 地理空间支持

地理空间支持对于实现应用程序的基于位置的功能非常有用。不用于 MemCached,Redis 带有特殊的 [用于管理实施地理空简数据的命令]

举个例子,GEODIST 命令计算两个地理空间条目之间的距离。同样的,GEORADIUS 命令返回提供半径内的所有条目,另外,我们可以使用 Spring Data Redis 在 Java 应用程序中启用 Redis 地理空间支持

# 4.8 架构

Redis 使用单核,在存储小数据集方面表现出比 MemCached 更好的性能。

[MemCached 通过使用多个内核] 实现多线程体系结构。因此,对于存储更大的数据集,MemCached 的性能更优于 Redis。

MemCached 的多线程体系结构的另一个好处是它通过利用多个计算资源实现的高可伸缩性。

Redis 可以通过集群进行横向扩展,设置和操作相对复杂。当然了,我们可以使用 Java 应用程序通过 Jedis 或者 Lettuce 启用 Redis 集群。

# 4.9 LUA Scripting

与 MemCached 不同,我们可以对 Redis 执行 [LUA Scripts]。它提供了类似于 [EVAL] 和 [SCRIPT LOAD] 的命令,这些命令对于 LUA 脚本的执行非常有用。

例如,我们可以执行 EVAL 命令来计算脚本:

$ redis-cli eval "return redis.call('set',KEYS[1],'welldone')" 1 website
OK

在这里,我们可以使用 EVAL 设置 key = website 的值为 welldone

# 4.10 内存利用率

比较字符串数据结构时,MemCached 的内存利用率高于 Redis

尽管如此,当 Redis 使用散列结构时,它提供了比 MemCached 更高的内存利用率

# 5,写在最后

在本文中,我们探讨了 MemCached 和 Redis。首先,我们研究了两个内存数据库的相似性,然后,我们研究了这两种缓存解决方案所提供功能的差异。

目前有许多内存缓存解决方案可用。因此,我们应该考虑缓存引擎的特性,并将它们与我们实际的用例相匹配。

我们可以肯定的得出结论,MemCached 是解决简单缓存问题的可靠选择。然而,一般来说,[Redis 通过提供更丰富的功能和各种各样的特性而优于 MemCached,这些特性对于解决复杂的场景更有优势]