php面试问题memcache和redis的区别
传统MySQL+ Memcached架构遇到的问题
其实MySQL适合海量数据存储。许多公司使用这种架构通过Memcached将热数据加载到缓存中,以加快访问速度。但是,随着业务数据和访问量的不断增加,我们遇到了很多问题:
1.MySQL需要不断反汇编,Memcached也需要不断扩展。扩展和维护工作占用了大量的开发时间。
2.2之间的数据一致性。Memcached和MySQL数据库。
3.Memcached数据命中率低或者宕机,大量访问直接渗透到DB,MySQL无法支持。
4.跨机房缓存同步问题。
NoSQL鲜花盛开,如何选择?
近年来,行业中出现了多种NoSQL产品,如何正确使用这些产品,发挥其优势,是我们需要深入研究和思考的问题。
问题,归根到底,最重要的是了解这些产品的定位,了解每个产品的权衡,从而在实际应用中扬长避短。一般来说,这些NoSQL主要用来解决。
解决以下问题
1.数据存储量小,读写访问速度快。这类产品通过所有数据in-mom的方式保证高速访问,同时提供数据落地的功能,这其实是Redis最重要的应用场景。
2.海量数据存储,分布式系统支持,数据一致性保证,方便添加/删除集群节点。
3.这方面最有代表性的观点是迪纳摩和比格表在两篇论文中阐述的观点。前者是完全集中式的设计,通过八卦在节点之间传递集群信息,保证数据的最终一致性。后者是集中式方案设计,通过分布式锁服务保证强一致性。先将数据写入内存和重做日志,然后定期将compat合并到磁盘,将随机写入优化为顺序写入,提高写入性能。
4.模式自由、自动分片等。比如一些常见的文档数据库支持无模式,直接以json格式存储数据,支持自动分片等功能,比如mongodb。
面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。
Redis适合场景,如何正确使用?
正如前面所分析的,Redis最适合所有的数据存储场景。Redis虽然也提供持久化功能,但实际上更多的是一个磁盘——
backed的作用和传统意义上的持久有很大的不同,所以你可能会有疑问。看起来Redis更像是Memcached的加强版,那么什么时候用呢?
Memcached,什么时候用Redis?
如果单纯比较Redis和Memcached的区别,大多数人会得到以下看法:
1 Redis不仅支持简单的k/v数据,还提供了list、set、zset、hash等数据结构的存储。
2 Redis支持数据备份,即主从模式的数据备份。
3 Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时可以再次加载使用。
抛开这些,我们可以深入到Redis的内部结构去观察更本质的区别,了解Redis的设计。
存在
在Redis中,并不是所有的数据都存储在内存中。这是和Memcached相比最大的区别。Redis将只缓存所有
关键信息,如果Redis发现内存使用量超过一定阈值,就会触发交换操作,Redis会根据“swappability =”触发交换操作
年龄*日志(内存大小)”计量器
找出哪些键对应于需要交换到磁盘值。则对应于这些键的值被保存到磁盘并在存储器中被清除。这个特性允许Redis
保留超过自身机器内存大小的数据。当然,机器本身的内存必须能装下所有的按键。毕竟,这些数据不会被交换。同时,因为Redis会存储内存
当swap中的数据放入磁盘时,提供服务的主线程和执行swap操作的子线程会* * *享用这部分内存,所以如果需要swap的数据被更新,Redis会对此进行阻塞。
在子线程完成交换操作之前,不能修改操作。
Redis-specific记忆模型使用前后的比较:
虚拟机关闭:300k密钥,4096字节值:1.3G已用
VM on: 300k密钥,4096字节值:使用了73M
VM off: 1百万个键,256个字节值:430.12M已用
VM on:100万个键,256个字节值:160.09M已用
VM on:100万个键,值尽可能大,仍然:160.09M已用
当...的时候
当从Redis中读取数据时,如果读取的键对应的值不在内存中,Redis需要从交换文件中加载相应的数据,然后返回给请求者。
这里有一个I/O线程池问题。缺省情况下,Redis会阻塞,也就是说,在加载完所有交换文件之前,它不会做出响应。这种策略在少数客户中实施。
更适合批量操作。但如果将Redis应用于大型网站应用,显然无法满足大并发的情况。Redis运行我们设置的I/O线程。
池的大小,需要从交换文件加载相应数据的读请求并发操作,阻塞时间减少。
如果想在海量数据的环境下用好Redis,相信了解Redis的内存设计和分块是必不可少的。
补充知识点:
memcached和redis的比较
1网络的IO模型
Memcached是一个多线程、非阻塞的IO复用网络模型,分为一个监控主线程和一个工作子线程。监控线程监控网络连接,并在接受请求后描述连接。
字管道被传递给工作线程来读写IO。网络层使用libevent封装的事件库。多线程模型可以起到多核的作用,但是引入了缓存。
一致性和锁问题,例如Memcached最常用的stats。
命令,所有实际的Memcached操作都需要锁定这个全局变量并对其进行计数,这带来了性能损失。
(Memcached网络IO模型)
Redis采用单线程IO复用模型封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select。
对于只有IO的操作,单线程可以最大化速度优势,但是Redis也提供了一些简单的计算功能,比如排序和聚合。对于这些操作,单线程模型是真实的。
会严重影响整体吞吐量,CPU计算时整个IO调度被阻塞。
2.内存管理
Memcached使用预先分配的内存池,使用大小不同的slab和Chunk来管理内存,Item根据大小选择合适的Chunk存储。
节省池的方法可以节省申请/释放内存的成本,减少内存碎片的产生,但是也会带来一定程度的空间浪费,而且在内存还有大量空间的时候,也可以使用新的数据
可以淘汰,原因请参考Timyang的文章:/memcached/)。Memcached
有很多客户端软件实现,包括C/C++、PHP、Java、Python、Ruby、Perl、Erlang、
Lua等等。目前Memcached应用广泛,除了LiveJournal,Wikipedia,Flickr,Twitter,Youtube和
WordPress等。
在窗口系统下,Memcached的安装非常方便,只需从上面给出的地址下载可执行软件,然后运行Memcached . exe–d即可。
安装以完成安装。在Linux等系统下,首先需要安装libevent,然后从,make &中获取源代码;& amp制造
安装就好。默认情况下,Memcached的服务器启动程序安装在/usr/local/bin目录中。当启动Memcached时,我们可以
以便配置不同的启动参数。
1.1内存缓存配置
Memcached服务器启动时需要配置关键参数。我们来看看启动时需要设置哪些关键参数以及它们的作用。
1)-p & lt;num & gtMemcached的TCP监听端口默认配置为11211;
2)-U & lt;num & gtMemcached的UDP监听端口默认配置为11211;当它为0时,关闭UDP侦听;
3)-s & lt;文件& gtMemcached侦听的UNIX套接字路径;
4)-a & lt;面具& gt默认情况下,用于访问UNIX套接字的八进制掩码配置为0700;
5)-l & lt;addr & gt被监控服务器的IP地址,默认为所有网卡;
6)-d为Memcached服务器启动一个守护进程;
7)-r最大核心文件大小;
8)-u & lt;用户名& gt运行Memcached的用户,如果当前是root,则需要使用该参数指定用户;
9)-m & lt;num & gt分配给Memcached的内存量,以MB为单位。
10)-M指示Memcached在内存用完时返回错误,而不是使用LRU算法删除数据记录;
11)-c & lt;num & gt最大并发连接数,默认配置为1024;
12)-v -vv -vvv设置服务器打印的消息的详细级别,其中-v只打印错误和警告信息,-vv在-v的基础上还打印来自客户端的命令和对应,-vvv在-vv的基础上还打印内存状态转换信息;
13)-f & lt;因子& gt用于设置块大小的增量因子;
14)-n & lt;字节& gt最小块大小,默认配置是48字节;
15)-t & lt;num & gt默认情况下,Memcached服务器使用的线程数是4;
16)-L尽量使用大内存页面;
17)-R每个事件的最大请求数,默认配置为20。
18)-C禁用CAS,CAS模式会带来8字节的冗余;
2.Redis简介
Redis是一个开源的键值存储系统。与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:word。
字符串、哈希表、链表、集合、有序集以及基于这些数据类型的相关操作。Redis是用C语言开发的,广泛应用于Linux、BSD和Solaris。
POSIX系统可以在没有任何外部依赖的情况下使用。Redis支持多种客户端语言,比如C、C#、C++、Object-C、PHP,
Python,Java,Perl,Lua,Erlang等。让可用的客户端访问Redis服务器。目前Redis已经被广泛使用,如国内的新浪、一淘等。
包,国外像Flickr,Github都在用Redis的缓存服务。
Redis安装非常方便,只需从http://redis.io/download,获取源代码然后制作&;& amp制造
安装就好。缺省情况下,Redis的服务器启动程序和客户机程序安装在/usr/local/bin目录中。当启动Redis服务器时,我们
您需要为它指定一个配置文件。默认情况下,配置文件位于Redis的源目录中,文件名为redis.conf。