Redis和memcache有什么区别与不同?如何选择?
问:Redis和memcache都是常用的缓存工具,但他们有哪些不同你知道吗?平常应用中怎么选择呢?
先说结论,我认为他们有以下几方面的不同:
1、Redis和Memcache都是将数据存放在内存中,memcache还可用于缓存其他东西,例如图片、视频等等,但最大只能缓存1M。Redis最大缓存可达512M。
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
3、虚拟内存–Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘。
4、存储数据安全及容灾–memcache挂掉后,数据没了不可恢复;redis可以定期保存到磁盘(持久化),数据丢失后可以通过aof恢复。
5、Redis支持数据的备份,即master-slave模式的数据备份。
6、Redis是单线程的的IO复用模型,对于单存只有IO操作来说,单线程可以将速度优势发挥到最大,但对于一些计算功能单线程模型会影响整体的吞吐量。memcache是多线程的,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,多线程可以发挥多核优势,但加锁带来了性能损耗。
以上就是他们的不同,然后我来简单的介绍一下两种缓存方式。
Redis 介绍
Redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、 list(链表)、set(集合)和zset(有序集合)。
这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,Redis支持各种不同方式的排序。
与memcached一样,为了保证效率,数据都是缓存在内存中。但redis还会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 工作方式分析
1.多样的数据模型
2.持久化
3.主从同步
-
Redis通常将数据存储于内存中,或被配置为使用虚拟内存。
-
Redis主要通过两种方式可以实现数据持久化:使用RDB快照的方式,将内存中的数据不断写入磁盘;或使用类似MySQL的AOF日志方式,记录每次更新的日志。
前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。 -
Redis支持将数据同步到多台从数据库上,这种特性对提高读取性能非常有益。
Redis如何实现分布式可拓展性?
3.0以后的版本:相较于Memcached只能采用客户端实现分布式存储,Redis则在服务器端构建分布式存储。
Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,各个节点地位一致,具有线性可伸缩的功能。
如图给出Redis Cluster的分布式存储架构,其中节点与节点之间通过二进制协议进行通信,节点与客户端之间通过ascii协议进行通信。
在数据的放置策略上,Redis Cluster将整个 key的数值域分成16384个哈希槽,每个节点上可以存储一个或多个哈希槽,也就是说当前Redis Cluster支持的最大节点数就是16384。
Memcache介绍
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
Memcached工作方式分析
许多Web应用都将数据保存到 RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、 网站显示延迟等重大影响。
Memcached是高性能的分布式内存缓存服务器,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web等应用的速度、 提高可扩展性。
Memcached的特点:
1.协议简单
2.基于libevent的事件处理
3.内置内存存储方式
4.memcached不互相通信的分布式
如何实现分布式可拓展性?
Memcached的分布式不是在服务器端实现的,而是在客户端应用中实现的,即通过内置算法制定目标数据的节点。
总结
1、存储方式:
memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小1M。不支持数据持久化操作。
Redis有部份存在硬盘上,这样能保证数据的持久性,支持数据的持久化(有RDB快照和AOF日志两种持久化方式)。
在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。
当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘。Redis只会缓存所有的key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,将一些valueswap到磁盘。
2、数据支持类型:
redis在数据支持上要比memecache多的多。与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多。
最为常用的数据类型主要由五种:String、Hash、List、Set和Sorted Set。Redis内部使用一个redisObject对象来表示所有的key和value。
3、使用底层模型不同:
新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、运行环境不同:
Redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统环境上的优化,而memcache还可以安装运行在windows上。
如何选择?
应该说Memcached和Redis都能很好的满足解决我们的问题,它们性能都很高。
总的来说,可以把Redis理解为是对Memcached的拓展,是更加重量级的实现,提供了更多更强大的功能。具体来说主要考虑以下几个方面:
1.性能上:
性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比 Memcached性能更高。
而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。
2.内存空间上:
MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。
Memcached单个key-value大小有限,一个value最大只支持1MB,而Redis最大支持512MB
3.操作便利上:
MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。
4.可靠性上:
MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。
Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。
Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高
5.应用场景:
Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如网站大量查询用户信息、好友信息、文章信息等)。
Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
新版本(3.0)的Redis是指集群分布式,也就是说集群本身均衡客户端请求,各个节点可以交流,可拓展行、可维护性更强大。
个人总结一下,有持久化需求或者对数据结构和处理有高级要求的应用,选择redis,其他简单的key/value存储,选择memcache。
本专栏主要整理记录后端程序员面试过程中常见的基础知识点,包括数据结构,操作系统,计算机网络,数据库和各种中间件等。同时会整理大厂面经和面试技巧等文章。