大家好,我是刘义。这是继周一(2019.2-18)发布的《PHP面试常见考试内容之Memcache与Redis(一)》后的第二篇文章。感谢您的支持和阅读。本周(2019.2-18至2-22)文章内容如下,更新时间为每周一、三、五。可以关注本专栏,持续关注。感谢您的支持。1.什么是内存缓存?2、Memcache有什么特点?3、Memcache的内存管理机制是什么?4、Memcache和Memcached有什么区别?5、如何操作Memcache?6、如何使用Memcache进行Session共享?7.什么是Redis?8.如何使用Redis?9、使用Redis需要注意哪些问题?10.补充:Redis和Memcache有什么区别?11.补充:Redis是如何实现持久化的?12.Memcache和Redis共考面试题10和11),第三部分围绕第十二点展开。以下部分文字来自《PHP程序员面试笔试宝典》书籍,如需转载请保留出处:7.Redis是什么?Redis是一个键值存储系统。与Memcached类似,它支持相对更多的值类型进行存储,包括string(字符串)、list(链表)、set(集合)、zset(sortedset,有序集合)和hash(散列类型)。这些数据类型支持push/pop、add/remove、intersection、union、difference等更丰富的操作,而且这些操作是原子的。在此基础上,Redis支持多种方式的排序。和Memcached一样,数据缓存在内存中以保证效率。不同的是Redis周期性的将更新的数据写入磁盘或者写入修改操作到追加的记录文件,并在此基础上实现主从(master-slave)同步。Redis的出现很大程度上弥补了Memcached等key/value存储的不足,在某些场合可以对关系型数据库起到很好的补充作用。它提供了Java、C/C++、C#、PHP、JavaScript、Perl、Object-C、Python、Ruby、Erlang等客户端,使用起来非常方便。Redis支持主从同步。数据可以从主服务器同步到任意数量的从服务器,从服务器可以是关联其他从服务器的主服务器。这使Redis可以执行单级树复制。保存盘可以有意无意地写入数据。由于完全实现了发布/订阅机制,当树从数据库同步到任何地方时,它可以订阅一个频道并接收到主服务器的完整消息发布记录。同步有助于读取操作的可伸缩性和数据冗余。8.如何使用Redis?使用set方法的例子:connect('127.0.0.1',6378);$res=$Redis->set(aaa,"bbbb");变量转储($res);//result:bool(true)?>以下只是对使用方法的总结。具体使用方法请参考例子和PHP写法:1.String类型使用方法2.Hash类型使用方法3.List类型如何使用4.Set类型如何使用5.Sorted类型如何使用settype9、使用Redis需要注意哪些问题?和MySQL一样,Redis在使用过程中也会遇到很多问题。适当的技巧和优化将大大提高Redis的性能,提高服务质量。一些常见的问题总结如下:1.停止使用按键*操作键*操作执行速度会变慢。因为keys命令的时间复杂度是O(n),其中n是要返回的key的个数,可见这个命令的复杂度取决于数据的大小。当数据量比较大的时候,在这个操作执行的过程中,实例中不能执行其他命令,严重影响性能。您可以改用scan命令,它以增量和迭代方式扫描数据库。2、定位Redis变慢的原因使用INFOcommandstats命令可以查看所有命令的统计信息,比如命令执行了多少次,执行命令花费的毫秒数等信息。3、尽量使用散列存储方式。Hash存储方式将大大提高运行效率。4.为键值设置生存时间尽可能利用键超时。一个很好的例子是存储诸如临时身份验证密钥之类的东西。当你去查找授权密钥时——以OAUTH为例——你通常会超时。这样,在设置key的时候,设置成相同的超时时间,Redis会自动帮你清除!不再需要使用KEYS*来遍历所有的键。5.对于非常重要的数据,请使用异常处理机制。如果一定要保证关键数据可以放到Redis实例中,那么请使用异常处理机制。几乎所有的Redis客户端都采用“发送后遗忘”的策略,所以往往需要考虑一个键是否真的放在了Redis数据库中。添加异常处理机制是保证程序健壮性的前提。6.多实例应用只要有可能,将工作负载分散到多个Redis实例上。Redis集群允许根据键范围分离出一些包含主/从模式的键。多实例是保证集群资源最大化利用和集群稳定的重要保障。整理了一篇《Redis是如何实现集群的?》,关注公众号:《六一编程库》,回复:“redis”,我发给你。10、Redis和Memcache有什么区别?(1)数据结构:Memcache只支持keyvalue存储,Redis支持更多的数据类型,如Keyvalue、hash、list、set、zset;(2)多线程:Memcache支持多线程,Redis支持单线程;在CPU利用率方面,Memcache优于Redis;(3)持久化:Memcache不支持持久化,Redis支持持久化;(4)内存利用率:Memcache高,Redis低(使用压缩时高于Memcache);(5)过期策略:Memcache过期后,如果不删除缓存,会导致下次取数据的问题。Redis有专门的线程来清除缓存数据;11、Redis是如何实现持久化的?Redis是一个支持数据持久化的内存数据库。Redis可以设置让Redis周期性的将更新的数据同步到磁盘,保证数据的持久化。Redis支持的持久化策略有两种:RDB和AOF。1.RDB持久化RDB持久化是指:在指定的时间间隔内保存数据快照。Redis默认的持久化方式是RDB。RDB的工作原理是当Redis需要持久化时,Redis会fork一个子进程,子进程将数据写入磁盘上的一个临时RDB文件中。当子进程写完临时文件后,替换原来的RDB,具有copy-on-write的优点。Redis.conf文件中RDB持久化的默认设置是:save30010#300秒内,如果修改超过10个key,会发起快照保存;RDB的优点:由于RDB的持久化方式可以在数据库内部每隔一段时间就进行数据快照,所以RDB非常适合用于容灾。比如设置每小时备份,或者每天全量备份,方便数据溯源和恢复到不同版本。RDB的缺点:(1)持久化只在特定的时间执行一次,容易丢失数据;例如,如果你设置了每30分钟备份一次数据,但是如果Redis服务器出现故障,那么可能会丢失几分钟的数据而不进行备份。(2)当数据很大时,保存时会出现性能问题。2、AOF持久化AOF:首先将命令追加到操作日志的末尾,保存所有历史操作。AOF的工作原理是每条写命令都是通过write函数附加到appendonly.aof中的。当Redis出现故障重启时,会读取AOF文件进行“replay”,恢复到Redis关闭前的状态。Redis.conf对AOF持久化的设置:Redis.confappendonlyyes#启用全持久化appendfsyncalways#每次发生数据修改都会写入AOF文件。appendfsynceverysec#每秒同步一次,该策略是AOF的默认策略。AOF的优点:(1)数据非常完整,故障恢复时数据丢失少;(2)可以处理历史操作。AOF的缺点:(1)备份相同数据集时,AOF的文件大小比RDB大;(2)如果AOF使用fsync策略,AOF的速度可能会比RDB慢。3.选择哪个Redis作为持久化策略比较好?由于Redis同时支持RDB和AOF两种持久化策略,如果考虑数据备份安全性,两者都可以设置。当Redis重启时,会优先使用AOF恢复数据,保证数据丢失最少。如果要两者取其一,可以根据自己的业务来选择:(1)如果对数据丢失要求高,可以选择AOF持久化策略;(2)AOF在Redis上执行的每条命令都会追加到磁盘上,会降低Redis的性能。如果考虑Redis的性能,可以选择RDB持久化策略;(3)考虑数据容灾情况,可以选择RDB持久化策略。这里还有一个Redis相关的常见问题:Redis是如何实现缓存集群的?关注公众号:“六一编程库”,回复:“redis”,我发给你。预测:PHP面试内容的Memcache和Redis(三)本周五(2019.2-22)更新。以上内容节选自本书《PHP程序员面试笔试宝典》,已在天猫、京东、当当网等电商平台销售。更多PHP相关面试知识和试题,请关注公众号获取:六一编程库,对本文有任何问题或建议可以留言。我会不断改进,追求极致,谢谢大家的支持。
