Redis VS Memcached,到底怎么选?

Java技术栈

www.javastack.cn

关注阅读更多优质文章

Memcached vs Redis

近期公司采购软件,评估时,某软件谈到使用了 MemcachedRedis 缓存。在本文中,将研究这两个流行的缓存的异同,方便理解和记忆。

1. Memcached 与 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. 亚毫秒延迟

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

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,这些特性对于解决复杂的场景更有优势」

最近热文:

1、Spring Boot 干掉了 Maven 拥抱 Gradle!

2、一周面试了 30 人,面到我心态爆炸…

3、阿里为什么不用 Zookeeper 做服务发现?

4、写了个全局变量的bug,被同事们打脸!

5、Java 14 祭出神器,Lombok 被干掉了?

6、为什么 Redis 单线程能达到百万+QPS?

7、Spring Boot 2.3 优雅关闭新姿势,真香!

8、Redis 到底是单线程还是多线程?

9、我天!xx.equals(null) 是什么骚操作??

10、Spring Boot 2.3.1 发布, 10 个新特性!

扫码关注Java技术栈公众号阅读更多干货。

点击「阅读原文」获取面试题大全~

展开阅读全文

Redis 服务器管理(集群主从复制及高可用)

08-30
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。 Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。     本课程主要讲解以下内容: 1. Redis的基本使用 2. Redis数据库的数据类型 3. Redis数据库数据管理 4. Redis的主从复制 5. Redis数据库的持久性 6. Redis的高可靠性和集群 7. Redis的优化和性能测试 8. Redis服务器的维护和管理 9. Redis服务器的常见问题排错  
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值