面试必问的 Redis:Memcached VS Redis

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 老态龙钟的Memcached 似乎已经无力阻挡 Redis 一统江湖了,但是在面试中,关于两者的比较还是频频出现,因此有必要了解下两者的区别。

前言

 


老态龙钟的Memcached似乎已经无力阻挡 Redis 一统江湖了,但是在面试中,关于两者的比较还是频频出现,因此有必要了解下两者的区别。

 

 

正文

 


数据结构

 

Memcached:主要支持简单的 key-value 数据结构,类似于 Redis 里的 String

 

Redis:总共有9种,常见的5种,高级的4种:

·       String:字符串,最基础的数据类型。

·       List:列表。

·       Hash:哈希对象。

·       Set:集合。

·       Sorted Set:有序集合,Set的基础上加了个分值。

·       HyperLogLog:通常用于基数统计。使用少量固定大小的内存,来统计集合中唯一元素的数量。统计结果不是精确值,而是一个带有0.81%标准差(standard error)的近似值。所以,HyperLogLog适用于一些对于统计结果精确度要求不是特别高的场景,例如网站的UV统计。

·       Georedis 3.2 版本的新特性。可以将用户给定的地理位置信息储存起来,并对这些信息进行操作:获取2个位置的距离、根据给定地理位置坐标获取指定范围内的地理位置集合。

·       Bitmap:位图。

·       Stream:主要用于消息队列,类似于 kafka,可以认为是 pub/sub 的改进版。提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。

 

 

数据存储

 

Memcached:数据全部存在内存中,重启实例会导致数据全部丢失

 

Redis:通常全部存在内存中,同时支持持久化到磁盘上

 

关于Redis 的数据存储(内存管理),网上经常见到一种说法:当物理内存用完时,Redis可以将一些很久没用到的 value 交换到磁盘,同时在内存中清除。这种特性使得Redis 可以保持超过其机器本身内存大小的数据。

 

这个说法用在现在,其实已经不准确了。上述的这个说法是 Redis 里的虚拟内存(Virtual Memory)功能,该功能在 Redis 2.0 被引入,但是在 Redis 2.4 中被默认关闭,并标记为废弃,而在后续版中被完全移除。也就是说,大部分人用的版本根本就没有这个功能了。

 

所以在面试中最好不要提到这个说法,或者需要自行补充说明该功能现在已经不存在了。

 

 

持久化

 

Memcached:不支持

 

RedisAOFRDB、混合持久化

 

 

灾难恢复

 

Memcached:实例挂掉后,数据不可恢复

 

Redis:实例挂掉后可以通过RDBAOF恢复 ,但是还是会有数据丢失问题

 

 

事件处理(事件库)

 

Memcached:使用 Libevent

 

Redis:自己封装了简易事件库 AeEvent

 

 

过期键删除策略

 

常见的有以下三种:

 

定时删除:在设置键的过期时间的同时,创建一个定时器,让定时器在键的过期时间来临时,立即执行对键的删除操作。对内存最友好,对 CPU 时间最不友好。

 

惰性删除:放任键过期不管,但是每次获取键时,都检査键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。对 CPU 时间最优化,对内存最不友好。

 

定期删除:每隔一段时间,默认100ms,程序就对数据库进行一次检査,删除里面的过期键。至于要删除多少过期键,以及要检査多少个数据库,则由算法决定。前两种策略的折中,对 CPU 时间和内存的友好程度较平衡。

 

Memcached:惰性删除

 

Redis:惰性删除+定期删除

 


内存驱逐(淘汰)策略

 

当内存空间已经用满时,服务实例将将根据配置的驱逐策略,进行相应的动作。

 

memcached:主要为 LRU 算法

 

redis:当前总共有以下8种:

·       noeviction:默认策略,不淘汰任何 key,直接返回错误

·       allkeys-lru:在所有的key 中,使用 LRU 算法淘汰部分 key

·       allkeys-lfu:在所有的key 中,使用 LFU 算法淘汰部分 key

·       allkeys-random:在所有的key 中,随机淘汰部分 key

·       volatile-lru:在设置了过期时间的 key 中,使用 LRU 算法淘汰部分key

·       volatile-lfu:在设置了过期时间的 key 中,使用 LFU 算法淘汰部分key

·       volatile-random:在设置了过期时间的 key 中,随机淘汰部分 key

·       volatile-ttl:在设置了过期时间的 key 中,挑选 TTLtime to live,剩余时间)短的 key 淘汰

 

 

性能

 

我自己对高性能这个话题有很强的兴趣,我相信也有不少同学跟我一样,对高并发、高性能有特殊的向往,所以这个话题会多讲两句。

 

首先,影响性能比较的因素有很多,网络带宽、CPU、内存等等,所以其实很多测试并不能完全说明问题,可能在这个条件下 Redis 快,而在另一个条件下是 Memcached 快。

 

所以两者的性能比较其实可以算一个比较开放的话题,在面试中,你只要能够自圆其说,说服面试官,那就是OK的。

 

Redis 作者 antirez 12 年左右在 Stack Overflow 上谈过两者的性能问题,他是这么说的:由于Redis 只使用单核,而 Memcached 可以使用多核,所以在比较上:在处理小数据时,平均每一个核上Redis Memcached 性能更高,而在 100k 左右的大数据时, Memcached 性能要高于 Redis

 

antirez 毕竟是大牛,所以他的这个说法,大部分人都是认同的,所以在面试中这么回答是可以的。

 

antirez 的这个说法是按“CPU 单核维度来比较,但是我们在实际的使用中,肯定是按实例维度来使用,所以接下来我们探讨下对于两者在实例维度的比较。

 

实例维度进行比较时,个人认为由于 Memcached 多线程的特性,在 Redis 6.0 之前,通常情况下 Memcached 性能是要高于 Redis 的,同时实例的CPU 核数越多,Memcached 的性能优势越大。

 

而在Redis 6.0 支持 I/O 多线程后,当 Redis 关闭持久化后,两者在性能上可能会比较接近。

 

 

技术选型、如何选择

 

看完上面的比较,其实不难做出选择,99%的人、场景,或者说 Redis 能支持的场景,使用 Redis 基本不会有问题。

 

而且就最近几年的发展来看,Redis 可谓风光无限,而 Memcached 则是已经逐渐跟不上 Redis 脚步了,这也侧面反映了当前大家的选择都是趋向于使用Redis

 

而关于使用Memcached 的场景,我自己了解到的一些线上真实使用场景都是对于性能有非常高的要求。

 

Redis 6.0 支持的 I/O 阶段多线程目前根据官方说法至少能提升性能1倍,随着 Redis 在性能上的不断优化,可能后续 Memcached 的使用场景会越来越少了。

 

 

最后

 


当你的才华还撑不起你的野心的时候,你就应该静下心来学习,愿你在我这里能有所收获。

 

原创不易,如果你觉得本文写的还不错,对你有帮助,请通过【点赞】让我知道,支持我写出更好的文章。

 

 

推荐阅读


两年Java开发工作经验面试总结

4 Java 经验,阿里网易拼多多面试总结、心得体会

5 Java 经验,字节、美团、快手核心部门面试总结(真题解析)

921天,咸鱼到阿里的修仙之路

复习2个月拿下美团offer,我都做了些啥

如何写一份让 HR 眼前一亮的简历(附模板)

面试阿里,HashMap 这一篇就够了

面试必问的 MySQL,你懂了吗?

面试必问的线程池,你懂了吗?

跳槽,如何选择一家公司

如何准备好一场大厂面试

MySQL 8.0 MVCC 核心原理解析(核心源码)

 

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
NoSQL Redis Sentinel
【怒怼大厂面试官】听说你精通Redis?说说Redis哨兵
面试官:Redis哨兵知道吧?知道的,Sentinel哨兵本质是一个运行在特殊模式下的Redis服务器。面试官:嗯然后呢?它的主要作用是通过检测Redis主从服务器的下线状态,选举出新Redis主服务器,也就是故障转移,来保证Redis的高可用性。
78 4
【怒怼大厂面试官】听说你精通Redis?说说Redis哨兵
|
7天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
128 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
17天前
|
缓存 NoSQL Java
面试官:Redis如何实现延迟任务?
延迟任务是计划任务,用于在未来特定时间执行。常见应用场景包括定时通知、异步处理、缓存管理、计划任务、订单处理、重试机制、提醒和数据采集。Redis虽无内置延迟任务功能,但可通过过期键通知、ZSet或Redisson实现。然而,这种方法精度有限,稳定性较差,适合轻量级需求。Redisson的RDelayedQueue提供更简单的延迟队列实现。
242 9
|
18天前
|
缓存 NoSQL 定位技术
深入探索Redis:面试中必须掌握的关键知识点
深入探索Redis:面试中必须掌握的关键知识点
|
24天前
|
NoSQL Java 测试技术
面试官:如何搭建Redis集群?
**Redis Cluster** 是从 Redis 3.0 开始引入的集群解决方案,它分散数据以减少对单个主节点的依赖,提升读写性能。16384 个槽位分配给节点,客户端通过槽位信息直接路由请求。集群是无代理、去中心化的,多数命令直接由节点处理,保持高性能。通过 `create-cluster` 工具快速搭建集群,但适用于测试环境。在生产环境,需手动配置文件,启动节点,然后使用 `redis-cli --cluster create` 分配槽位和从节点。集群动态添加删除节点、数据重新分片及故障转移涉及复杂操作,包括主从切换和槽位迁移。
32 0
面试官:如何搭建Redis集群?
|
1月前
|
存储 NoSQL 测试技术
JMeter Redis 数据集 vs CSV 数据集性能对比
【2月更文挑战第27天】JMeter Redis 数据集 vs CSV 数据集性能对比
89 1
JMeter Redis 数据集 vs CSV 数据集性能对比
|
1月前
|
运维 负载均衡 NoSQL
【大厂面试官】知道Redis集群和Redis主从有什么区别吗
集群节点之间的故障检测和Redis主从中的哨兵检测很类似,都是通过PING消息来检测的。。。面试官抓抓脑袋,继续看你的简历…得想想考点你不懂的😰。
67 1
|
1月前
|
NoSQL Redis
【怒怼大厂面试官】听说你精通Redis?Redis数据同步懂吗
面试官:不用慌尽管说,错了也没关系。。。来说说Redis数据同步。是这样的,Redis有一个叫命令传播的概念,如果像面试官说的这种场景,再使用上面我提到的AOF缓冲区就有点浪费内存空间了。所以Redis会将主服务器的这条Del删除命令
62 2
【怒怼大厂面试官】听说你精通Redis?Redis数据同步懂吗
|
存储 缓存 移动开发
redis 面试总结
前段时间找工作搜索 golang 面试题时,发现都是比较零散或是基础的题目,覆盖面较小。而自己也在边面试时边总结了一些知识点,为了方便后续回顾,特此整理了一下。
145 0
redis 面试总结
|
存储 NoSQL 数据库

热门文章

最新文章