Redis与memcached的区别
Redis与Memcached都是基于内存的数据存储系统。Memcached是高性能分布式内存缓存服务,本质上是一个内存key-value数据库。Redis则是一个开源的key-value存储系统。
与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。
区别:
-
Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;
-
Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
-
虚拟内存:Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
-
线程量:由于Redis只使用单核(redis单线程性,1cpu1进程,1cpu可多核,1核1线程),而Memcached可以使用多核。memcache是单进程多线程的网络处理模型,低层是采用的libevent事件库来处理高并发的;支持的数据类型比较单一(简单的key-value类型数据),而且可以进行的操作也比较少;而且不支持备份、持久化、复制等特性;
-
数据量:Redis在存储小数据时比Memcached性能更高,但在100k以上的数据中,Memcached性能要高于Redis,//但无论使用哪个,每秒处理请求的次数都不会成为瓶颈
-
内存使用率:对于key-value这样简单的数据储存,memcache的内存使用率更高。如果采用hash结构,redis的内存使用率会更高。//redis在数据支持上要比memecache多的多。当然,这些都依赖于具体的应用场景
-
过期策略:memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;
-
分布式:设定memcache集群,利用magent做一主多从;redis可以做一主多从。也可以一主一从;
-
存储数据安全:memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);
-
灾难恢复–memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;
-
Redis支持数据的备份,即master-slave模式的数据备份;
-
应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。
使用场景:
1、如果有持久方面的需求或对数据类型和处理有要求的应该选择redis。
2、如果简单的key/value 存储应该选择memcached。
Memcached与Redis内存回收差异
memcached不会主动进行内存的回收操作,只有在get请求数据时才会判断数据是否已经失效,如果已经失效则会删除数据;
在内存不够时会使用LRU算法进行内存的回收,这个期间可能会造成有些未失效的数据被删掉,造成数据的丢失;
redis的内存回收利用了对象的定期删除 + 惰性删除两种;同时结合了max_memory选项,在内存不够时根据LRU删除数据;
memcache 和 memcached 的区别分析
Memcache是一个自由和开放源代码、高性能、分配的内存对象缓存系统。用于加速动态web应用程序,减轻数据库负载。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个Hash表,Memcached自管理这些Hash表。
Memcached是简单而强大的。它简单的设计促进迅速部署,易于发展所面临的问题,解决了很多大型数据缓存。它的API可供最流行的语言。
Memcache是该系统的项目名称,Memcached是该系统的主程序文件(字母d可以理解为daemon),以守护程序方式运行于一个或多个服务器中,随时接受客户端的连接操作,使用共享内存存取数据。
此外
PHP有两个memcache客户端:php memcache和php memcached。
memcache 是一个原生版本,完全是在 PHP 框架内开发的,支持 OO(面向对象) 和非 OO 两套接口并存,而 memcached 是建立在 libmemcached 的基础上的,只支持 OO 接口。这就意味着在安装 memcache 扩展的时候不要求安装其他的东西,但是在安装 memcached 的时候会要求安装 libmemcached。libmemcached 是 memcache 的 C 客户端,它具有低内存,线程安全等优点。据说新浪微博之前就全面将 PHP 的 memcache 替换成 PHP 的 memcached,在高并发下,稳定性果断提高。
php memcached是基于原生的c的libmemcached的扩展,更加完善,建议替换为php memcached。
Redis是如何保证高性能的
redis低层是使用的C语言编写的,而且数据是基于内存,并且使用了I/O多路复用的事件处理模型,是单进程单线程的服务。
Redis有安全认证功能,但是memcache就没有了。
redis的安全认证:即设置密码,两种方式:一是通过配置文件,一是在redis客户端命令直接设定
redis设置auth认证保护
Memcached应用场景
Memcached集群,server端之间并不会进行相互的通信,通信完全由你的客户端来完成,你只需在客户端规定好你的key值,然后 set进行,此时会有一个散列算法,来决定你key会存放在哪台server上。
分布式是在客户端实现的;整个的数据是放在一个大的hash表中的;key可以设置过期时间,删除策略为惰性删除,当内存空间不够时按照LRLU(最近最少使用)的原则删除数据。
Memcached没有安全认证功能,一个普通的telnet客户端就可以连接server。
常常用于页面的静态化;
Memcached主要使用于存储实时性和安全性要求不是很高的数据;由于Memcache不能提供持久化功能,一定不能将其作为主库使用;