★ Redis24篇集合
互联网产品为了保证高性能和高可用性,经常会使用缓存来进行架构设计。最常用的就是使用Redis了,也有部分企业会选择使用Memcache。
所以了解 Redis 和 Memcache 的区别、共性以及各自应用场景,有助于我们在做技术选型的时候,有合理的判断依据。
Redis和Memcache都是非常流行的内存数据存储系统,但它们在设计和使用上有一些关键的区别。
Redis支持更丰富的数据类型(即更复杂的应用场景),包括字符串、哈希表、列表、集合、有序集合等,使得它不仅仅是一个简单的键值对存储系统。而Memcache只支持简单的键值对存储,不支持复杂的数据结构。
Redis将数据存储在内存中,但也可以将数据持久化到磁盘中,从而保证了数据的可靠性和持久性。而Memcache只将数据存储在内存中,当服务器重启或发生故障时,数据可能会丢失。
因为可以把缓存中的数据持久化到磁盘上,所以Redis可以对大部分数据进行恢复,比如
但是需要提醒的是,我们可不建议redis当作数据库用,因为:
就像Redis官方建议的那样,专业的事情还是交给就专业的,比如持久就是用MySQL、Redis。
Redis的性能通常优于Memcache,因为它支持多种数据结构和高级功能,同时还可以通过多种持久化方式在数据量较大时提高性能。
在 Redis 缓存中,常用的主要数据类型有五种,如下:
更多内容请参考笔者这篇:Redis系列1:深刻理解高性能Redis的本质
Memcache 没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 Redis 目前是原生支持 主从、Sentinel(哨兵)、Cluster(集群) 模式的。
参考笔者这篇 Redis系列5:深入分析Cluster 集群模式
Memcache 是多线程,非阻塞 IO 复用的网络模型;Redis 使用单线程的多路 IO 复用模型,在Redis 6.0 的时候针对网络数据的读写引入了多线程模型。
更多内容参考笔者这篇: 追求性能极致:Redis6.0的多线程模型
Redis和Memcache都具有良好的可扩展性,可以通过添加更多的节点来扩展集群。然而,Redis的扩展性更好,因为它支持多种数据结构和高级功能(发布订阅模型、Lua 脚本、事务等),
可以更好地适应不同的应用场景,支持更多的编程语言。并且支持可拔插的Redis Module,咱们上一篇有介绍到。
更多内容参考笔者这几篇:
Redis系列12:Redis 的事务机制
Redis系列:使用 Redis Module 扩展功能
Redis 支持惰性删除和定期删除,如下图定期删除:
默认每 1 秒运行 10 次,也就是每 100 ms 执行一次,每次随机抽取一些设置了过期时间的 key(这边注意不是检查所有设置过期时间的key,而是随机抽取部分),检查是否过期,如果发现过期了就直接删除。
更多内容参考笔者这篇:Redis系列18:过期数据的删除策略
从上面的那些梳理可以看出,Redis的性能、功能丰富程度、能力扩展性都有一些优势。但我们还是需要从业务特征来进行选型参考。
比如 ,以下场景中,我们更趋向选择Redis:
如果需要存储复杂的数据,建议使用Redis,因为它支持哈希(HASH),列表(LIST),集合(SET),有序集合(ZSET)这类复杂的数据结构Memcache是无法满足的。
典型场景如下:计数、分布式锁、消息队列、购物车信息、分析、专注、点赞等
如果你的缓存数据比较重要,需要有持久化兜底,避免故障时完全覆灭。
那你只能选择Redis,因为Memcache无法满足持久化的需求。
Redis的数据持久化包含:
如果有更高的稳定性需求,建议使用Redis,Redis支持主从、哨兵、集群三种高可用模式。特别是Cluster模式:
集群模式的故障转移等能力对业务是透明的,保障业务服务的稳定需求。
Memcache 的value存储,最大为1M。但在实际业务场景中,经常会遇到存储Value很大的对象,我们称之为大Key,这种情况只能使用Redis。
Redis的扩展性更好,因为它支持多种数据结构和高级功能(发布订阅模型、Lua 脚本、事务等),并且支持可拔插的Redis Module。
Redis系列:使用 Redis Module 扩展功能
如果你的应用只需要简单的键值对存储,数据量很大,并发量也大。
并且对数据的持久性和可靠性要求不高,那么Memcache可能是更合适的选择,因为它更加轻量级且并发性能也很高。
本文做了比较详细的介绍和比较,总的来说Redis基本覆盖Memcache的能力。这也是为什么现在的互联网缓存组件优先选择Redis的原因。