首页 > 数据库 >缓存选型:Redis or MemCache

缓存选型:Redis or MemCache

时间:2024-01-23 09:14:12浏览次数:42  
标签:存储 缓存 Redis MemCache Memcache 2.1 数据

Redis24篇集合

1 背景

互联网产品为了保证高性能和高可用性,经常会使用缓存来进行架构设计。最常用的就是使用Redis了,也有部分企业会选择使用Memcache。
所以了解 Redis 和 Memcache 的区别、共性以及各自应用场景,有助于我们在做技术选型的时候,有合理的判断依据。

2 Redis 和 Memcache 的区别和共同点

Redis和Memcache都是非常流行的内存数据存储系统,但它们在设计和使用上有一些关键的区别。

2.1 区别

2.1.1 数据结构

Redis支持更丰富的数据类型(即更复杂的应用场景),包括字符串、哈希表、列表、集合、有序集合等,使得它不仅仅是一个简单的键值对存储系统。而Memcache只支持简单的键值对存储,不支持复杂的数据结构。
image

2.1.2 存储方式

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

2.1.3 灾难故障恢复机制

因为可以把缓存中的数据持久化到磁盘上,所以Redis可以对大部分数据进行恢复,比如

  • RDB内存快照:指的是 Redis 内存中的数据在某一刻的状态。就好比如是拍照一样,你把那一刻的数据都定格下来,持久化到磁盘上。打游戏的同学可以想象为游戏存盘。 快照文件我们称之为 RDB 文件,即 Redis DataBase 的缩写。
  • AOF缓存日志:指的是使用日志存储 Redis 服务器的顺序指令序列,AOF 日志记录对内存进行修改的指令记录。

但是需要提醒的是,我们可不建议redis当作数据库用,因为:

  • Redis的定期快照RDB依旧有数据丢失的可能性
  • AOF损耗性能,降低效率,且数据量不能太大

就像Redis官方建议的那样,专业的事情还是交给就专业的,比如持久就是用MySQL、Redis。

2.1.4 性能

Redis的性能通常优于Memcache,因为它支持多种数据结构和高级功能,同时还可以通过多种持久化方式在数据量较大时提高性能。

  1. 高效率的存储类型

在 Redis 缓存中,常用的主要数据类型有五种,如下:

  • 字符串/REDIS_STRING:适用于 缓存、计数、共享Session、IP统计、分布式锁等。
  • 列表/REDIS_LIST: 链表、消息队列、栈、有序的对象列表(如朋友圈的点赞顺序列表、评论顺序列表)。
  • 哈希表/REDIS_HASH: 购物车信息、用户信息、Hash类型的(key, field, value)存储对象等。
  • 集合/REDIS_SET:无序的唯一的键值结构: 好友、关注、粉丝、感兴趣的人集合等。
  • 有序集合/REDIS_ZSET:访问排行榜、点赞排行、粉丝数排行等。
    上面这5种Redis 支持的数据类型,能够满足不同业务场景下的数据结构需求。而对于这几类数据类型的区分和支持,目的无非也是为了效率,具体的业务中使用恰当的数据结构才能保证得到应有的效率。
  1. 单线程和 I/O 多路复用模型,有如下优势
    • 单线程模式,内核持续监听 socket 上的连接及数据请求,一监听就交予Redis线程处理,达到单个线程处理多个I/O 流的效果。
    • epoll 提供了基于事件的回调机制。不同事件调用对应的事件处理器。Redis可以持续性的高效处理事件,性能同步提升。
    • Redis 不阻塞任一客户端发起的请求,所以可以同时和多个客户端连接并处理请求,提升并发执行的能力。

更多内容请参考笔者这篇:Redis系列1:深刻理解高性能Redis的本质

2.1.5 高可用集群模式

Memcache 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 Redis 目前是原生支持 主从、Sentinel(哨兵)、Cluster(集群) 模式的。
image
参考笔者这篇 Redis系列5:深入分析Cluster 集群模式

2.1.6 线程模型对比

Memcache 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型,在Redis 6.0 的时候针对网络数据的读写引入了多线程模型。
image

更多内容参考笔者这篇: 追求性能极致: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,而是随机抽取部分),检查是否过期,如果发现过期了就直接删除。
image
更多内容参考笔者这篇: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,MemCache,Memcache,2.1,数据
From: https://www.cnblogs.com/wzh2010/p/17962435

相关文章

  • 【Azure Redis】PHPRedis遇见SSL Connection Timeout问题
    问题描述PHPRedis客户端遇见使用SSLConnectiontimeout,遇见问题后,切换回去Non-SSL没有出现问题。但是切换回SSL后,还是偶尔遇见Connectiontimeout问题。目前timeout设置时间为5秒,并且为例重用连接,启用了持久化redis.pconnect.pooling_enabled为1.是否有办法来缓解Timeout问题呢?......
  • redis 切面拦截 防重复提交
    /***aop防止并发请求*/@Slf4j@Aspect@ComponentpublicclassLimitRequestAspect{@AutowiredRedisHelperredisHelper;@Around("@annotation(limitRequest)")publicObjectaround(ProceedingJoinPointpoint,LimitRequestlimitRequest)throwsTh......
  • 关于spring.redis.cluster集群部分Master节点故障后 交易中断60秒解决方案
     背景  第一种方案:公司项目做性能测试,redis集群选用cluster集群模式,开始选用3主3从,共3台服务器,每个服务器一主一从。    服务器A  redis8001 8002    服务器B  redis8003 8004     服务器C  redis8005 8006    8001主    ......
  • 无涯教程-CodeIgniter - 页面缓存
    缓存页面将提高页面加载速度。缓存的文件存储在application/cache文件夹中。启用缓存时,需要设置缓存时间,时间过后,将自动被删除。启用缓存可以通过在控制器的任何方法中执行以下行来启用缓存。$this->output->cache($n);其中$n是分钟数,您希望页面在刷新之间保持高速缓存。......
  • Redis分布式锁
    Redis分布式锁今天在做Lottery分布式抽奖项目中,接触到了分布式锁这个概念,普通单机系统中,我们可以使用mutex、cas等方式来确保不同线程之间的同步和互斥,但是显然在分布式系统下,如果想让所有机器在同一时刻只有一个线程可以访问到某个共享资源,那么传统的互斥方法不再可用。这时候就......
  • 记录使用Redis当分布式锁
    在网上看到一次使用redis当分布式锁的文章,我就自己写了个demo前置条件:建议新建一个springboot工程(添加web依赖),然后自行整合mybatisplus、redis,可以参照以下链接:mybatisPlus:https://blog.csdn.net/wang20000102/article/details/132615071redis:https://blog.csdn.net/lwj_07/art......
  • python redis示例
    Redis是一个基于内存的高性能键值对(key-value)存储系统,同时也支持丰富的数据结构,如字符串、哈希表、列表、集合、有序集合等。在Python中,我们通常使用redis-py这个第三方库来连接和操作Redis。以下是一个基本的使用步骤以及各种数据结构操作的示例:1.安装redis-py库pipinstall......
  • redis 安装教程
    一、初始化环境创建redis运行时的用户和组$groupaddredis$useradd-gredisredis-s/sbin/nologin-M初始化数据目录$rm-rf/data/redis$mkdir-pv/data/redis$chown-Rredis:redis/data/redis初始化日志目录$mkdir-pv/data/logs/redis$chown-Rredis:redis/......
  • 面试官:Redis持久化能关吗?怎么关?
    数据持久化是指将数据从内存中,保存到磁盘或其他持久存储介质的过程,这样做的目的是为了保证数据不丢失。而Redis的持久化功能默认是开启的,这样做的目的也是为了保证程序的稳定性(防止缓存雪崩、缓存击穿等问题)和数据不丢失。Redis持久化能关吗?怎么关?Redis持久化默认是开启的,......
  • django使用redis集群、连接池、MySQL连接池
    redis的相关设置CACHES={"default":{"BACKEND":"django_redis.cache.RedisCache","LOCATION":["redis://127.0.0.1:6379/1","redis://127.0.0.1:6380/1",#...],"OPTIONS":{"CLIENT_......