Memcached与Redis的比较
1.概述
在本文中,我们将研究两个流行的内存数据库Memcached和Redis的相似之处和不同之处。
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客户端可用于两种内存数据库。例如,Xmemcached和Memcached-java-client可用于Memcached,而Jedis、Lettuce和Redisson则可用于Redis。
4.4.缓存清除
Memcached允许使用flush_all命令来清除缓存。同样,Redis允许我们通过使用FLUSHDB和FLUSHALL这样的命令来删除缓存中的所有内容。
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-tools或memcached-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可以通过集群进行横向扩展,相对而言,集群的设置和操作更为复杂。另外,我们可以使用Jedis或Lettuce来启用一个使用Java应用程序的Redis集群。
5.9.LUA脚本
与Memcached相比,我们可以针对Redis执行LUA脚本。它提供了EVAL和SCRIPT 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,因为它提供了更丰富的功能和适用于复杂用例的各种特性。