Memcache和Redis的区别?
介绍
Memcache
Memcache介绍
Memcache是一款开源的、高性能、分布式的对象缓存系统,可应用于各种需要缓存的场景,其主要目的是通过降低对Database的访问来加速web应用程序。它是一个基于内存的“键值对”存储,用于存储数据库调用、API调用或页面引用的直接数据,如字符串、对象等。
Memcache特点
1.简单的key/value存储,服务器不关心数据本身的意义以及结构,只需要是可序列化数据即可。存储项由“键、过期事件、可选的标志及数据”四部分组成。
2.各服务器间彼此无视,不在服务器间进行数据同步
3.O(1)的执行效率
4.清理超级数据:默认情况下,Memcache是一个LRU缓存,同时它按事先预定的时长清理超期的数据,但事实上,memcache不会删除任何已缓存数据,只是在其过期之后不再为客户所见,而且memcache也不会真正按期限清理缓存,而仅是当get命令到达时检查其时长。
Memcache内置内存存储方式
先来一段解释,Slab Allocator相关术语
名词 | 解释 |
---|---|
Page | 分配给Slab的内存空间,默认是1MB,分配给Slab之后根据slab的大小切分成chunk |
chunk | 用于缓存记录的内存空间 |
Slab Class | 特定大小的chunk组 |
Slab Allocator 的基本原理是按照预先规定的大小,将分配的内存分割成特定长度的块(chunk),并把尺寸相同的块分成组,以完全解决内存碎片的问题。但是由于分配得是特定长度的内存,因此无法有效利用分配的内存,比如将100字节的数据缓存到128字节的chunk当中,剩余28字节就浪费了。
简单来说,内存分配为page,page有将内存空间分配给slab,slab分成特定大小的chunk。
Redis
Redis介绍
Redis比Memcache更强大,它是一个高性能的key-value对存储系统,它支持存储的value类型很多,包括string(字符串类型)、list(链表)、hash(哈希)、set(无序集合)、zset(有序集合)。它把整个数据库全加载到内存当中进行操作,通过异步操作定期吧内存数据库中的数据flush到硬盘上保存。因为是纯内存操作,所以reids得性能非常出色,每秒处理10万次以上的读写操作。
Redis特点
1.支持丰富的数据类型
2.支持两种数据持久化方式:Snapshotting(快照)和Append Only file(追加到日志记录文件)。
3.支持主从复制
4.支持海量数据的高效存储和访问
区别
Memcache
Memcache可以利用多核优势,单实例吞吐量极高,可以达到几十万QPS,适用于最大程度扛量。
只支持简单的key=>value数据结构,不像Redis可以支持丰富的数据类型。
无法进行持久化,数据不能备份,只能用于缓存使用,且重启后数据全部丢失
Redis
支持多种数据结构,如string/list/dict/set/zset/hyperloglog。
单线程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
支持持久化操作,可以进行aof以及rdb数据持久化到磁盘,从而进行数据备份或数据恢复等操作,较好的防止数据丢失的手段。
支持通过Replication进行数据复制,通过master-slave机制,可以实时进行数据的同步复制,支持多级复制和增量复制。