写点什么

Redis 与 Memcache 对比

发布于: 2 小时前

文章相关视频:

C++架构师学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师


Linux网络服务器模型,redis,memcached,nginx对比

epoll的网络模型,从redis,memcached到nginx

文章简介:

1、 Redis 和 Memcache 都是将数据存放在内存中,都是内存数据库。不过 memcache 还可用于缓存其他东西,例如图片、视频等等。

2、Redis 不仅仅支持简单的 k/v 类型的数据,同时还提供 list,set,hash 等数据结构的存储。

3、虚拟内存–Redis 当物理内存用完时,可以将一些很久没用到的 value 交换到磁盘

4、过期策略–memcache 在 set 时就指定,例如 set key1 0 0 8,即永不过期。Redis 可以通过例如 expire 设定,例如 expire name 10

5、分布式–设定 memcache 集群,利用 magent 做一主多从;redis 可以做一主多从。都可以一主一从

6、存储数据安全–memcache 挂掉后,数据没了;redis 可以定期保存到磁盘(持久化)

7、灾难恢复–memcache 挂掉后,数据不可恢复; redis 数据丢失后可以通过 aof 恢复

8、Redis 支持数据的备份,即 master-slave 模式的数据备份。

关于 redis 和 memcache 的不同,下面罗列了一些相关说法,供记录:

redis 和 memecache 的不同在于[2]:

1、存储方式:

memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小 redis 有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化(笔者注:有快照和 AOF 日志两种持久化方式,在实际应用的时候,要特别注意配置文件快照参数,要不就很有可能服务器频繁满载做 dump)。

2、数据支持类型:

redis 在数据支持上要比 memecache 多的多。

3、使用底层模型不同:

新版本的 redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4、运行环境不同:

redis 目前官方只支持 LINUX 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上

个人总结一下,有持久化需求或者对数据结构和处理有高级要求的应用,选择 redis,其他简单的 key/value 存储,选择 memcache。

下面重点分析 Memcached 和 Redis 两种方案:

Memcached 介绍

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态 Web 应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度,现在已被 LiveJournal、hatena、Facebook、Vox、LiveJournal 等公司所使用。

Memcached 工作方式分析

许多 Web 应用都将数据保存到 RDBMS 中,应用服务器从中读取数据并在浏览器中显示。 但随着数据量的增大、访问的集中,就会出现 RDBMS 的负担加重、数据库响应恶化、 网站显示延迟等重大影响。Memcached 是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态 Web 等应用的速度、 提高可扩展性。下图展示了 memcache 与数据库端协同工作情况:

其中的过程是这样的:

1.检查用户请求的数据是缓存中是否有存在,如果有存在的话,只需要直接把请求的数据返回,无需查询数据库。

2.如果请求的数据在缓存中找不到,这时候再去查询数据库。返回请求数据的同时,把数据存储到缓存中一份。

3.保持缓存的“新鲜性”,每当数据发生变化的时候(比如,数据有被修改,或被删除的情况下),要同步的更新缓存信息,确保用户不会在缓存取到旧的数据。

Memcached 作为高速运行的分布式缓存服务器,具有以下的特点:

1.协议简单

2.基于 libevent 的事件处理

3.内置内存存储方式

4.memcached 不互相通信的分布式

如何实现分布式可拓展性?

Memcached 的分布式不是在服务器端实现的,而是在客户端应用中实现的,即通过内置算法制定目标数据的节点,如下图所示:

Redis 介绍

Redis 是一个 key-value 存储系统。和 Memcached 类似,它支持存储的 value 类型相对更多,包括 string(字符串)、 list(链表)、set(集合)和 zset(有序集合)。这些数据类型都支持 push/pop、add/remove 及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis 支持各种不同方式的排序。与 memcached 一样,为了保证效率,数据都是缓存在内存中。区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了 master-slave(主从)同步,当前 Redis 的应用已经非常广泛,国内像新浪、淘宝,国外像 Flickr、Github 等均在使用 Redis 的缓存服务。

Redis 工作方式分析

Redis 作为一个高性能的 key-value 数据库具有以下特征:

1.多样的数据模型

2.持久化

3.主从同步 Redis 支持丰富的数据类型,最为常用的数据类型主要由五种:String、Hash、List、Set 和 Sorted Set。Redis 通常将数据存储于内存中,或被配置为使用虚拟内存。Redis 有一个很重要的特点就是它可以实现持久化数据,通过两种方式可以实现数据持久化:使用 RDB 快照的方式,将内存中的数据不断写入磁盘;或使用类似 MySQL 的 AOF 日志方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。 Redis 支持将数据同步到多台从数据库上,这种特性对提高读取性能非常有益。

Redis 如何实现分布式可拓展性?

2.8 以前的版本:与 Memcached 一致,可以在客户端实现,也可以使用代理,twitter 已开发出用于 Redis 和 Memcached 的代理 Twemproxy 。

3.0 以后的版本:相较于 Memcached 只能采用客户端实现分布式存储,Redis 则在服务器端构建分布式存储。Redis Cluster 是一个实现了分布式且允许单点故障的 Redis 高级版本,它没有中心节点,各个节点地位一致,具有线性可伸缩的功能。如图给出 Redis Cluster 的分布式存储架构,其中节点与节点之间通过二进制协议进行通信,节点与客户端之间通过 ascii 协议进行通信。在数据的放置策略上,Redis Cluster 将整个 key 的数值域分成 16384 个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前 Redis Cluster 支持的最大节点数就是 16384。

综合结论

应该说 Memcached 和 Redis 都能很好的满足解决我们的问题,它们性能都很高,总的来说,可以把 Redis 理解为是对 Memcached 的拓展,是更加重量级的实现,提供了更多更强大的功能。具体来说:

1.性能上: 性能上都很出色,具体到细节,由于 Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis 在存储小数据时比 Memcached 性能更高。而在 100k 以上的数据中,Memcached 性能要高于 Redis,虽然 Redis 最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。

2.内存空间和数据量大小: MemCached 可以修改最大内存,采用 LRU 算法。Redis 增加了 VM 的特性,突破了物理内存的限制。

3.操作便利上: MemCached 数据结构单一,仅用来缓存数据,而 Redis 支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络 IO 次数和数据体积。

4.可靠性上: MemCached 不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis 支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。

5.应用场景: Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。 Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。

需要慎重考虑的部分

1.Memcached 单个 key-value 大小有限,一个 value 最大只支持 1MB,而 Redis 最大支持 512MB 2.Memcached 只是个内存缓存,对可靠性无要求;而 Redis 更倾向于内存数据库,因此对对可靠性方面要求比较高

3.从本质上讲,Memcached 只是一个单一 key-value 内存 Cache;而 Redis 则是一个数据结构内存数据库,支持五种数据类型,因此 Redis 除单纯缓存作用外,还可以处理一些简单的逻辑运算,Redis 不仅可以缓存,而且还可以作为数据库用

4.新版本(3.0)的 Redis 是指集群分布式,也就是说集群本身均衡客户端请求,各个节点可以交流,可拓展行、可维护性更强大。

C/C++Linux 后台服务器开发高级架构师学习视频 点击 C++架构师学习视频 获取,内容知识点包括 Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux 内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK 等等。免费学学习地址:C/C++Linux服务器开发高级架构师/Linux后台架构师


用户头像

Linux服务器开发qun720209036,欢迎来交流 2020.11.26 加入

专注C/C++ Linux后台服务器开发。

评论

发布
暂无评论
Redis与Memcache对比