缓存选型:Redis or MemCache
1 背景
互联网产品为了保证高性能和高可用性,经常会使用缓存来进行架构设计。最常用的就是使用Redis了,也有部分企业会选择使用Memcache。
所以了解 Redis 和 Memcache 的区别、共性以及各自应用场景,有助于我们在做技术选型的时候,有合理的判断依据。
2 Redis 和 Memcache 的区别和共同点
Redis和Memcache都是非常流行的内存数据存储系统,但它们在设计和使用上有一些关键的区别。
2.1 区别
2.1.1 数据结构
Redis支持更丰富的数据类型(即更复杂的应用场景),包括字符串、哈希表、列表、集合、有序集合等,使得它不仅仅是一个简单的键值对存储系统。而Memcache只支持简单的键值对存储,不支持复杂的数据结构。

2.1.2 存储方式
Redis将数据存储在内存中,但也可以将数据持久化到磁盘中,从而保证了数据的可靠性和持久性。而Memcache只将数据存储在内存中,当服务器重启或发生故障时,数据可能会丢失。

2.1.3 灾难故障恢复机制
因为可以把缓存中的数据持久化到磁盘上,所以Redis可以对大部分数据进行恢复,比如
- RDB内存快照:指的是 Redis 内存中的数据在某一刻的状态。就好比如是拍照一样,你把那一刻的数据都定格下来,持久化到磁盘上。打游戏的同学可以想象为游戏存盘。 快照文件我们称之为 RDB 文件,即 Redis DataBase 的缩写。
- AOF缓存日志:指的是使用日志存储 Redis 服务器的顺序指令序列,AOF 日志记录对内存进行修改的指令记录。
但是需要提醒的是,我们可不建议redis当作数据库用,因为:
- Redis的定期快照RDB依旧有数据丢失的可能性
- AOF损耗性能,降低效率,且数据量不能太大
就像Redis官方建议的那样,专业的事情还是交给就专业的,比如持久就是用MySQL、Redis。
2.1.4 性能
Redis的性能通常优于Memcache,因为它支持多种数据结构和高级功能,同时还可以通过多种持久化方式在数据量较大时提高性能。
- 高效率的存储类型
在 Redis 缓存中,常用的主要数据类型有五种,如下:
- 字符串/REDIS_STRING:适用于 缓存、计数、共享Session、IP统计、分布式锁等。
- 列表/REDIS_LIST: 链表、消息队列、栈、有序的对象列表(如朋友圈的点赞顺序列表、评论顺序列表)。
- 哈希表/REDIS_HASH: 购物车信息、用户信息、Hash类型的(key, field, value)存储对象等。
- 集合/REDIS_SET:无序的唯一的键值结构: 好友、关注、粉丝、感兴趣的人集合等。
- 有序集合/REDIS_ZSET:访问排行榜、点赞排行、粉丝数排行等。
上面这5种Redis 支持的数据类型,能够满足不同业务场景下的数据结构需求。而对于这几类数据类型的区分和支持,目的无非也是为了效率,具体的业务中使用恰当的数据结构才能保证得到应有的效率。
- 单线程和 I/O 多路复用模型,有如下优势
- 单线程模式,内核持续监听 socket 上的连接及数据请求,一监听就交予Redis线程处理,达到单个线程处理多个I/O 流的效果。
- epoll 提供了基于事件的回调机制。不同事件调用对应的事件处理器。Redis可以持续性的高效处理事件,性能同步提升。
- Redis 不阻塞任一客户端发起的请求,所以可以同时和多个客户端连接并处理请求,提升并发执行的能力。
更多内容请参考笔者这篇:Redis系列1:深刻理解高性能Redis的本质
2.1.5 高可用集群模式
Memcache 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 Redis 目前是原生支持 主从、Sentinel(哨兵)、Cluster(集群) 模式的。

参考笔者这篇 Redis系列5:深入分析Cluster 集群模式
2.1.6 线程模型对比
Memcache 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型,在Redis 6.0 的时候针对网络数据的读写引入了多线程模型。

更多内容参考笔者这篇: 追求性能极致:Redis6.0的多线程模型
2.1.7 扩展性对比
Redis和Memcache都具有良好的可扩展性,可以通过添加更多的节点来扩展集群。然而,Redis的扩展性更好,因为它支持多种数据结构和高级功能(发布订阅模型、Lua 脚本、事务等),
可以更好地适应不同的应用场景,支持更多的编程语言。并且支持可拔插的Redis Module,咱们上一篇有介绍到。
更多内容参考笔者这几篇:
Redis系列12:Redis 的事务机制
Redis系列:使用 Redis Module 扩展功能
2.1.8 过期删除策略
Redis 支持惰性删除和定期删除,如下图定期删除:
默认每 1 秒运行 10 次,也就是每 100 ms 执行一次,每次随机抽取一些设置了过期时间的 key(这边注意不是检查所有设置过期时间的key,而是随机抽取部分),检查是否过期,如果发现过期了就直接删除。

更多内容参考笔者这篇:Redis系列18:过期数据的删除策略
2.2 共同点
- 两者都是内存数据存储系统,将数据存储在内存中,从而提供快速的读取和写入速度。所以都用做高速缓存使用。性能都很优秀。
- 都有过期策略,都具备惰性删除能力。
- 两者都可以通过集群扩展来提高可扩展性和可靠性。
3 技术选型讨论
从上面的那些梳理可以看出,Redis的性能、功能丰富程度、能力扩展性都有一些优势。但我们还是需要从业务特征来进行选型参考。
比如 ,以下场景中,我们更趋向选择Redis:
3.1 更复杂数据结构
如果需要存储复杂的数据,建议使用Redis,因为它支持哈希(HASH),列表(LIST),集合(SET),有序集合(ZSET)这类复杂的数据结构Memcache是无法满足的。
典型场景如下:计数、分布式锁、消息队列、购物车信息、分析、专注、点赞等
3.2 持久化需求
如果你的缓存数据比较重要,需要有持久化兜底,避免故障时完全覆灭。
那你只能选择Redis,因为Memcache无法满足持久化的需求。
Redis的数据持久化包含:
- RDB内存快照:把某一刻的数据都定格下来,持久化到磁盘上。
- AOF缓存日志:缓存修改指令记录,可以通过指令对数据进行恢复。
3.3 高可用需求
如果有更高的稳定性需求,建议使用Redis,Redis支持主从、哨兵、集群三种高可用模式。特别是Cluster模式:
- 数据复制
- 故障检测
- 主从故障转移
- 读写分离
集群模式的故障转移等能力对业务是透明的,保障业务服务的稳定需求。
3.4 大Key存储需求
Memcache 的value存储,最大为1M。但在实际业务场景中,经常会遇到存储Value很大的对象,我们称之为大Key,这种情况只能使用Redis。
3.5 需要较强的扩展能力
Redis的扩展性更好,因为它支持多种数据结构和高级功能(发布订阅模型、Lua 脚本、事务等),并且支持可拔插的Redis Module。
Redis系列:使用 Redis Module 扩展功能
3.6 Memcache 选型参考
如果你的应用只需要简单的键值对存储,数据量很大,并发量也大。
并且对数据的持久性和可靠性要求不高,那么Memcache可能是更合适的选择,因为它更加轻量级且并发性能也很高。
4 总结
本文做了比较详细的介绍和比较,总的来说Redis基本覆盖Memcache的能力。这也是为什么现在的互联网缓存组件优先选择Redis的原因。
缓存选型:Redis or MemCache的更多相关文章
- 三个缓存数据库Redis、Memcache、MongoDB
>>Memcached Memcached的优点:Memcached可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS(取决于key.value的字节大小以及服务器硬件性能,日常环境 ...
- CYQ.Data 对于分布式缓存Redis、MemCache高可用的改进及性能测试
背景: 随着.NET Core 在 Linux 下的热动,相信动不动就要分布式或集群的应用的需求,会慢慢火起来. 所以这段时间一直在研究和思考分布式集群的问题,同时也在思考把几个框架的思维相对提升到这 ...
- Nginx多进程高并发、低时延、高可靠机制在缓存(redis、memcache)twemproxy代理中的应用
1. 开发背景 现有开源缓存代理中间件有twemproxy.codis等,其中twemproxy为单进程单线程模型,只支持memcache单机版和redis单机版,都不支持集群版功能. 由于twemp ...
- Redis和MemCache静态Map做缓存区别
本地缓存和分布式缓存 本地缓存:使用自带的map或者guava实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着jvm的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不 ...
- 五分钟学后端技术:如何学习Redis、memcache等常用缓存技术
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类 ...
- 选redis还是memcache,源码怎么说
转自: https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961272&idx=1&sn=79ad515b01 ...
- 关于 redis、memcache、mongoDB 的对比
从以下几个维度,对 redis.memcache.mongoDB 做了对比. 1.性能 都比较高,性能对我们来说应该都不是瓶颈. 总体来讲,TPS 方面 redis 和 memcache 差不多,要大 ...
- python之redis和memcache操作
Redis 教程 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理.Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据 ...
- redis、memcache、mongoDB 做了对比
from: http://yang.u85.us/memcache_redis_mongodb.pdf 从以下几个维度,对redis.memcache.mongoDB 做了对比. 1.性能 都比较 ...
- Redis、Memcache和MongoDB的区别(转)
1.性能 都比较高,性能对我们来说应该都不是瓶颈 总体来讲,TPS方面redis和memcache差不多,要大于mongodb 2.操作的便利性 memcache数据结构单一 redis丰富一些,数据 ...
随机推荐
- python tkinter 使用(六)
python tkinter 使用(六) 本文主要讲述tkinter中进度条的使用. 1:确定的进度条 progressbar = tkinter.ttk.Progressbar(root, mode ...
- Codeforces Round 911 (Div. 2) 总结
第一次在赛场上敲莫反,还好最后调出来了! A 题意:你在Minecraft里挖了一些一格的坑(同一列),问你用几桶水可以填满它(可以造无限水). 解法:找大于 \(2\) 的连续段,有的话就是两桶,没 ...
- 轻量对象存储 LighthouseCOS 用户实践征文
产品使用攻略.上云技术实践,有奖征集,多重好礼等您带回家- 存储桶一键挂载轻量应用服务器,简单易用,腾讯云轻量对象存储用户实践征文活动特惠:腾讯云轻量云专场特惠活动. 投稿说明 注册/登录腾讯云账号, ...
- puppeteer的简单使用
引言 对于编写应用程序,尤其是要部署上线投入生产使用的应用,QA是其中重要的一环,在过去的工作经历中,我参与的项目开发,大多是由测试同学主要来把控质量的,我很少编写前端方面的测试代码,对于测试工具的使 ...
- (Dnc系列)借助Dnc.Events.InMemory在三分钟实现一个内存级别的事件驱动处理模型
前言 Dnc.Events是在借鉴领域驱动设计大佬daxnet的博客基础上做的基于内存级别的EDA处理模型,不清楚EDA的童鞋请自行百度. 第一分钟 安装Nuget Dnc.Events.InMemo ...
- php +libcurl+nghttp2 实现高性能微服务架构
1.server端nginx编译时增加参数configure --with-http_v2_module server { listen 80 http2; ...
- MySQL篇:第四章_详解DML语言
DML语言 插入 一.方式一 语法: insert into 表名(字段名,...) values(值1,...); 特点: 1.字段类型和值类型一致或兼容,而且一一对应 2.可以为空的字段,可以不用 ...
- TooKit助力开发者上云
本文分享自华为云社区<华为云Classroom赋能-TooKit助力开发者上云>,作者:华为云PaaS服务小智 . 对于资深程序员而言,IDE是必不可少的,它好比是剑客手中的宝剑,IDE帮 ...
- KubeEdge和Kuiper“双剑合并”,轻松解决边缘流式数据处理
摘要:KubeEdge 是一个开源的边缘计算平台,它在Kubernetes原生的容器编排和调度能力之上,扩展实现了 云边协同.计算下沉.海量边缘设备管理.边缘自治等能力.KubeEdge还将通过插件的 ...
- 想会用synchronized锁,先掌握底层核心原理
摘要:synchronized锁修饰方法和代码块时底层实现上是一样的,但是在修饰方法时,不需要JVM编译出的字节码完成加锁操作,而synchronized在修饰代码块时,是通过编译出来的字节码生成的m ...