Memcached与Redis的比较

评论 0 浏览 0 2020-05-02

1.概述

在本文中,我们将研究两个流行的内存数据库MemcachedRedis的相似之处和不同之处。

2.Memcached和Redis

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

Memcached是一个分布式内存缓存系统,其设计目的是为了便于使用和简化,并且非常适合作为一个缓存或会话存储

Redis是一个内存数据结构存储,提供了丰富的功能。它可以作为缓存、数据库、消息代理和队列使用。

3.安装

3.1.安装Memcached

我们可以通过下载软件包并运行make来安装最新的Memcached服务

$ 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

3.2.安装Redis

同样地,我们可以安装最新的Redis服务

$ 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

4.相似性

4.1.亚毫秒级的延迟

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

4.2.数据分区

同样地,这两种内存数据库都允许在多个节点上分布数据。

4.3.支持的编程语言

同样地,两者都支持所有主要的编程语言,包括Java、Python、JavaScript、C和Ruby。

此外,还有一些Java客户端可用于两种内存数据库。例如,XmemcachedMemcached-java-client可用于Memcached,而JedisLettuceRedisson则可用于Redis。

4.4.缓存清除

Memcached允许使用flush_all命令来清除缓存。同样,Redis允许我们通过使用FLUSHDBFLUSHALL这样的命令来删除缓存中的所有内容

4.5.扩展性

这两种缓存解决方案都提供了高度的可扩展性,以便在需求成倍增长时处理大型数据。

5.差异

5.1.命令行

Memcached允许我们通过使用telnet:连接到服务器,来运行commands

$ telnet 10.2.3.4 5678
Trying 10.2.3.4...
Connected to 10.2.3.4.
$ 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提供的所有命令。

5.2.磁盘I/O转储

Memcached仅通过第三方工具,如libmemcached-toolsmemcached-dd等来处理磁盘转储。

然而,Redis为磁盘转储提供了高度可配置的默认机制,如RDB(Redis数据库文件)或AOF(Append-only文件)。这对归档和恢复很有用。

使用redis-cli,我们可以执行同步的SAVE命令,对内存中的数据进行快照。

$ redis-cli SAVE
OK

在这里,命令将快照存储在一个dump.rdb的二进制文件中,完成后返回状态OK

然而,异步BGSAVE的执行会启动拍摄快照的后台进程:

$ redis-cli BGSAVE
OK

此外,我们可以使用LASTSAVE命令来检查最后一次成功的DB快照的Unix时间。

$ redis-cli LASTSAVE
(integer) 1410853592

5.3.数据结构

Memcached将键值对存储为一个字符串,每个值的大小限制为1MB。然而,Redis也支持其他数据结构,如list、set和hash,并且可以存储最大512MB大小的值

5.4.复制

Memcached支持使用(如repcached)等第三方分支进行复制。

与Memcached不同的是,Redis为我们提供了通过复制主存储来增加集群的功能,以获得更好的可扩展性和高可用性。

首先,我们可以使用REPLICAOF 命令创建 Redis 主服务器的副本。接下来,我们执行 PSYNC 命令从主副本启动复制。

5.5.事务

Memcached不支持事务,尽管它的操作是原子性的。

Redis为transactions提供了开箱即用的支持,以执行命令。

我们可以用MULTI命令开始事务。然后,我们可以使用EXEC命令来执行下面的后续命令。最后,Redis提供了WATCH命令用于事务的有条件执行。

5.6.发布和订阅消息

Memcached不支持开箱即用的发布/订阅消息功能。

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

在设计需要实时通信的应用程序时,如聊天室、社交媒体馈送和服务器互通,这可能是很有用的。

Redis有专门的命令,如PUBLISH,SUBSCRIBE,和UNSUBSCRIBE,分别向通道发布消息,订阅,和取消订阅客户端到指定的通道上。

5.7.地理空间支持

地理空间支持对于我们的应用程序实现基于位置的功能非常有用。与Memcached不同,Redis带有特殊的命令来管理实时地理空间数据

例如,GEODIST命令计算了两个地理空间条目之间的距离。同样地,GEORADIUS @命令返回所提供的半径范围内的所有条目。

此外,我们可以使用Spring Data Redis在Java应用程序中启用Redis的地理空间支持。

5.8.架构

Redis使用单核,在存储小数据集时,如果以核数衡量,显示出比Memcached更好的性能。

Memcached通过利用多个核心实现了多线程架构。因此,对于存储较大的数据集,Memcached可以比Redis表现更好。

Memcached的多线程架构的另一个好处是它的高可扩展性,是通过利用多种计算资源实现的。

Redis可以通过集群进行横向扩展,相对而言,集群的设置和操作更为复杂。另外,我们可以使用JedisLettuce来启用一个使用Java应用程序的Redis集群。

5.9.LUA脚本

与Memcached相比,我们可以针对Redis执行LUA脚本。它提供了EVALSCRIPT LOAD,等命令,对执行LUA脚本很有用。

例如,我们可以执行EVAL命令来评估该脚本。

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

在这里,我们通过评估一个脚本,将键website设置为baeldung的值。

5.10.内存使用情况

在比较String数据结构时,Memcached的内存利用率要比Redis高。

尽管如此,当Redis使用哈希结构时,它提供了比Memcached更高的内存利用率。

6.结语

在这篇文章中,我们探讨了Memcached和Redis。首先,我们看了这两个内存数据库的相似之处。然后,我们看了这两个缓存解决方案所提供的功能的差异。

目前有许多内存缓存解决方案。因此,我们应该考虑缓存引擎的功能,并将其与我们的用例相匹配。

我们当然可以得出结论,Memcached是解决简单缓存问题的一个可靠选择。然而,一般来说,Redis 的性能优于 Memcached,因为它提供了更丰富的功能和适用于复杂用例的各种特性。

最后更新2023-06-14
0 个评论
标签