1.什么是Redis?Redis本质上是一个Key-Value类型的内存数据库,很像memcached,将整个数据库加载到内存中运行,定期通过异步操作将数据库数据刷入硬盘存储。由于是纯内存操作,Redis性能优异,每秒可处理超过100,000次读写操作,是目前已知最快的Key-ValueDB。Redis的优秀不仅仅在于性能。Redis最大的魅力在于它支持保存多种数据结构。另外单个值的最大限制是1GB,不像memcached只能保存1MB的数据,所以Redis可以用来实现很多有用的功能。功能,比如用他的List做一个FIFO双向链表,实现一个轻量级的高性能消息队列服务,用他的Set做一个高性能的标签系统等等。此外,Redis还可以为存储的Key-Value设置过期时间,因此也可以作为memcached的增强版使用。Redis的主要缺点是数据库容量受限于物理内存,无法用于海量数据的高性能读写。因此Redis适合的场景主要局限于小数据量的高性能运算和计算。【与各大厂商对比】完整目录优质PHP架构师教程,只要你会看,你的薪资会更上一层楼(持续更新中)2、Redis相比memcached有哪些优势?(1)memcached的所有值都是简单的字符串,而作为其替代者的redis支持更丰富的数据类型(2)Redis比memcached快很多(3)Redis可以持久化它的数据3、Redis支持哪些数据类型?String、List、Set、SortedSet、hash4、Redis主要消耗哪些物理资源?Redis是一个基于内存的高性能数据库——主要依赖于内存内存。5、Redis的全称是什么?RemoteDictionaryServer6和Redis有哪些数据淘汰策略?noeviction:当达到内存限制并且客户端尝试执行会使用更多内存的命令(主要是写命令,但DEL和一些例外)时返回错误allkeys-lru:尝试回收最少使用的键(LRU),所以新添加的数据有空间存储。volatile-lru:尝试回收最少使用的键(LRU),但仅回收过期集合中的键,以便新添加的数据有存储空间。allkeys-random:回收随机密钥,为新添加的数据腾出空间。volatile-random:回收随机键为新添加的数据腾出空间,但仅限于过期集合中的键。volatile-ttl:回收过期集合中的key,优先回收生存时间(TTL)较短的key,让新加入的数据有空间存储。7、为什么Redis官方不提供Windows版本?因为现在的Linux版本已经相当稳定,用户量也很大,所以没有必要去开发Windows版本,反而会造成兼容性问题。8.字符串类型的值最大可以存储多少容量?512M9。为什么Redis需要将所有数据存储在内存中?Redis为了达到最快的读写速度,将数据全部读入内存,异步写入磁盘。所以redis具有速度快,数据持久化的特点。如果数据不放在内存中,磁盘I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis会越来越流行。如果设置了最大内存使用量,现有数据记录数达到内存限制后无法插入新值。10、Redis集群方案中应该做些什么?有什么计划?(1)twemproxy,大体的概念就是类似于一个代理方法,使用方法和普通的redis没什么区别。在其下设置多个redis实例后,使用时,在需要连接redis的地方连接twemproxy。它会作为代理接收请求并使用一致性哈希算法将请求传输到特定的redis,然后将结果返回给twemproxy。使用方便(相对redis只需要修改连接端口),老项目扩容的首选。问题:twemproxy自身单端口实例的压力,使用consistenthash后,redis节点数变化时,计算值变化时,数据无法自动移动到新节点。(2)codis,目前使用最多的集群方案,基本上和twemproxy效果一样,但是支持当节点数量变化时,可以将旧节点数据恢复到新的hash节点。(3)rediscluster3.0自带的集群,其特点是其分布式算法不是一致性哈希,而是哈希槽的概念,支持节点设置从节点。有关详细信息,请参阅官方文档。(4)在业务代码层实现,启动几个不相关的redis实例,在代码层对key进行hash计算,然后去对应的redis实例操作数据。这种方式对哈希层代码要求比较高,考虑因素包括节点故障后的备选算法方案、数据震荡后脚本自动恢复、实例监控等。11、Redis集群方案在什么情况下会导致整个集群不可用?在一个有A、B、C三个节点的集群中,如果没有复制模型,如果B节点出现故障,整个集群会认为它缺少5501-11000范围内的slot,不可用。12、MySQL里面有2000万条数据,而redis里面只有2000万条数据。如何保证redis中的数据都是热数据?当redis内存数据集的大小上升到一定大小时,就会执行数据淘汰策略。13、Redis适用于哪些场景?(1)会话缓存(SessionCache)使用Redis最常用的场景就是会话缓存(sessioncache)。使用Redis缓存会话相对于其他存储(例如Memcached)的优势在于Redis提供了持久性。当维护一个不严格一致的缓存时,如果用户的所有购物车信息都丢失了,大多数人都会不高兴。现在,他们会吗?幸运的是,随着Redis多年来的改进,很容易找到有关如何正确使用Redis进行会话缓存的文档。甚至著名的商业平台Magento也为Redis提供了一个插件。(2)FullPageCache(FPC)除了基本的sessiontoken,Redis还提供了一个非常简单的FPC平台。回到一致性问题,即使Redis实例重启,用户也不会因为磁盘持久化而看到页面加载速度下降。这是一个很大的改进,类似于PHP的本地FPC。再次以Magento为例,Magento提供了一个插件来使用Redis作为全页缓存后端。另外,对于WordPress用户,Pantheon有一个非常不错的插件wp-redis,可以帮助你以最快的速度加载你访问过的页面。(3)QueueReids在内存存储引擎领域的优势之一是它提供了list和set操作,这使得Redis成为一个很好用的消息队列平台。Redis作为队列的操作类似于本地编程语言(如Python)对列表的push/pop操作。如果您在Google上快速搜索“Redis队列”,您会立即找到大量旨在使用Redis创建非常好的后端工具以满足各种队列需求的开源项目。比如Celery有后台使用Redis作为broker,可以从这里查看。(4)排行榜/计数器Redis可以很好地增加或减少内存中的数字。Sets和SortedSets也让我们执行这些操作变得非常简单。Redis只是提供了这两种数据结构。所以,我们想要从排序的集合中得到前10名的用户——我们称之为“user_scores”,我们只需要这样做:当然,这假设你是根据你的用户的分数进行增量排序。如果你想返回用户和用户的分数,你需要这样执行:ZRANGEuser_scores010WHITSCORESAAgoraGames是一个很好的例子,用Ruby实现,它的排行榜使用Redis存储数据,你可以在这里看到.(5)发布/订阅最后(但并非最不重要)是Redis的发布/订阅功能。发布/订阅确实有很多用例。我见过人们在社交网络连接中使用它,作为基于发布/订阅的脚本的触发器,甚至使用Redis的发布/订阅功能来构建聊天系统!(不是,是真的,你可以去查一下)。14.使用Redis有什么好处?(1)速度快,因为数据存在于内存中,类似于HashMap,HashMap的优点是查找和运算的时间复杂度为O(1)(2)支持丰富的数据类型,支持string、list、set、sortedset,hash(3)支持事务,操作是原子的。所谓原子性就是所有的数据变化要么执行要么根本不执行(4)丰富的特性:可以用于缓存,消息,可以key设置过期时间。到期后会自动删除。15.Memcache和Redis有什么区别?(1)存储方式Memecache将所有数据存储在内存中,断电挂掉,数据不能超过内存大小。Redis的一部分存储在硬盘上,保证了数据的持久化。(2)数据支持类型Memcache支持的数据类型比较简单。Redis具有复杂的数据类型。(3)采用不同的底层模型,与客户端通信的底层实现方式和应用协议不同。Redis直接自己搭建了VM机制,因为一般系统调用系统函数的话,会浪费一定的时间去移动和请求。(4)redis的value大小最大可达1GB,而memcache只有1MB16。Redis是单进程单线程的吗?Redis是单进程和单线程的。Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。17.Redis如何设置密码和验证密码?设置密码:configsetrequirepass123456授权密码:auth12345618说说Redishashslot的概念?Redis集群没有使用一致性哈希,而是引入了哈希槽的概念。Redis集群有16384个哈希槽。每个密钥通过CRC16校验后,它对16384取模以确定放置哪个插槽。集群的每个节点负责部分哈希槽。19、Redis集群的主从复制模型是什么?为了让集群在部分节点失效或大部分节点无法通信时仍然可用,集群采用了主从复制模型,每个节点都会有N-1个副本。20、Redis集群会丢失写操作吗??为什么?Redis不保证数据的强一致性,这意味着在实践中,集群在某些情况下可能会丢失写操作。21、Redis集群是如何复制的?异步复制22.Redis集群的最大节点数是多少?16384.23.Redis集群如何选择数据库?Redis集群目前无法选择数据库,默认为0数据库。24.如何测试Redis的连通性?ping25和Redis中的管道有什么用?即使旧请求未得到响应,请求/响应服务器也可以执行新请求。这使得可以向服务器发送多个命令而无需等待回复,并最终一步读取该回复。这就是流水线,一种已经被广泛使用了几十年的技术。例如,很多POP3协议都实现了对这个功能的支持,大大加快了从服务器下载新邮件的过程。26.如何理解Redis事务?事务是一个独立的操作:事务中的所有命令都被序列化并按顺序执行。交易执行过程中,不会被其他客户端发送的命令请求打断。一个事务是一个原子操作:要么执行事务中的所有命令,要么不执行任何命令。27、Redis事务相关的命令有哪些?如何分别设置MULTI、EXEC、DISCARD、WATCH28、Rediskey的过期时间和永久有效?EXPIRE和PERSIST命令。29、Redis是如何优化内存的?尽可能使用哈希表(hashes)。哈希表(意思是存储在哈希表中的数字很小)占用的内存非常少,所以你应该尽可能地将你的数据模型抽象成一个哈希表。例如,如果你的web系统中有一个用户对象,不要为用户的名字、姓氏、电子邮件和密码设置单独的键,而是将用户的所有信息存储在一个哈希表中。30.Redis回收过程是如何进行的?客户端运行新命令并添加新数据。Redi检查内存使用情况,如果大于maxmemory的限制,就会按照设定的策略进行回收。执行新命令等。所以我们不断地越过内存限制的边界,不断地到达边界,然后不断地回收到边界以下。如果一个命令的结果导致大量内存被使用(比如将非常大的集合的交集保存到一个新的键),用不了多久就会被这个内存使用量超过内存限制。31、Redis使用什么算法进行回收?LRU算法32、Redis如何插入大量数据?Redis2.6启动redis-cli支持一种称为管道模式的新模式,用于执行大量数据插入。33.Redis为什么要分区?分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。不分区,最多只能使用一台机器的内存。分区使得Redis的计算能力可以通过简单地增加计算机来成倍增加,Redis的网络带宽也会随着计算机和网卡的增加而翻倍。34、你知道Redis有哪些分区实现方案吗?Client分区是指客户端已经决定了数据存储在哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。代理分区是指客户端向代理发送请求,由代理决定向哪个节点写入或读取数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis响应返回给客户端。redis和memcached的一个代理实现是Twemproxy查询路由(Queryrouting),意思是客户端随机请求任意一个redis实例,然后Redis将请求转发给正确的Redis节点。RedisCluster实现了一种混合形式的查询路由,但不是直接将请求从一个redis节点转发到另一个,而是借助客户端直接重定向到正确的redis节点。35、Redis分区的缺点是什么?通常不支持涉及多个键的操作。例如,你不能对两个集合进行交集,因为它们可能存储在不同的Redis实例中(实际上,有一种方法可以做到这一点,但你不能直接使用交集命令)。如果同时操作多个键,则无法使用Redis事务。分区使用的粒度是关键,不能使用很长的排序键来存储数据集。使用分区时,数据处理可能会非常复杂,例如要备份,您必须同时从不同的Redis实例和主机收集RDB/AOF文件。在分区时动态向上或向下扩展可能非常复杂。Redis集群可以在运行过程中增加或删除Redis节点,最大程度实现对用户透明的数据再平衡,但其他一些客户端分区或代理分区方式不支持此功能。然而,有一种预分片技术可以更好地解决这个问题。36、如何扩展Redis的持久化数据和缓存?如果使用Redis作为缓存,使用一致性哈希实现动态扩缩容。如果使用Redis作为持久化存储,则必须使用固定的key-to-nodes映射关系,并且节点数量一旦确定就不能更改。否则(即当Redis节点需要动态变化时),必须使用可以在运行时重新平衡数据的系统,目前只有Redis集群可以做到这一点。37、分布式Redis应该在前期做还是后期规模上来了?为什么?由于Redis如此轻量级(单个实例只使用1M内存),为了防止将来扩展,最好的方法是从一开始就启动更多的实例。即使你只有一台服务器,你也可以启动以分布式方式运行的Redis,使用分区,并在同一台服务器上启动多个实例。一开始多设置几个Redis实例,比如32或64个实例,对于大多数用户来说可能很麻烦,但从长远来看是值得的。这样,当你的数据不断增长,需要更多的Redis服务器时,你只需要把Redis实例从一个服务迁移到另一个服务即可(无需考虑重新分区)。添加另一台服务器后,您需要将一半的??Redis实例从第一台机器迁移到第二台。38.什么是Twemproxy?Twemproxy是Twitter维护的一个(缓存)代理系统,它代理了Memcached的ASCII协议和Redis协议。它是一个单线程程序,用C语言编写,运行速度非常快。它是Apache2.0许可证下的开源软件。Twemproxy支持自动分区。如果其中一个代理Redis节点不可用,它会自动排除该节点(这会改变原来的键-实例映射,所以你应该只在使用Redis作为缓存时使用Twemproxy)。Twemproxy本身不存在单点问题,因为你可以启动多个Twemproxy实例,然后让你的客户端连接到任何一个Twemproxy实例。Twemproxy是Redis客户端和服务器之间的中间层。分区函数的处理应该不复杂,应该比较靠谱。39.哪些客户端支持一致性哈希?Redis-rb、Predis等40.Redis与其他键值存储有何不同?Redis拥有更复杂的数据结构,并提供对它们的原子操作,这是一条不同于其他数据库的进化路径。Redis的数据类型是基于基本数据结构的,对程序员是透明的,不需要额外的抽象。Redis运行在内存中,但可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不应该大于硬件内存。内存数据库的另一个优势是,与磁盘上同样复杂的数据结构相比,在内存中操作非常简单,因此Redis可以做很多内部复杂度很高的事情。此外,它们在磁盘格式方面是紧凑的并且是追加生成的,因为它们不需要随机访问。41.Redis的内存占用情况如何?举个例子:100万个键值对(键是0到999999,值是字符串“helloworld”)在我的32位Mac笔记本电脑上占用100MB。同样的数据只需要16MB放在一个key里面,因为keyvalue的开销很大。在Memcached上执行也是类似的结果,但是开销比Redis小一点,因为Redis会记录类型信息引用计数等。当然,当键值对很大时,两者的比例会好很多。64位系统比32位系统需要更多的内存开销,尤其是在键值对很小的情况下,因为指针在64位系统中占用8个字节。但是,当然,64位系统支持更大的内存,所以为了运行大型Redis服务器或多或少需要使用64位系统。42.减少Redis内存占用的方法有哪些?如果你使用的是32位的Redis实例,可以利用好Hash、list、sortedset、set等集合类型的数据,因为通常很多小的Key-Values可以存储在一个更紧凑的方式。43、查看Redis的使用情况和状态信息用什么命令?info44.Redis内存用完了怎么办?如果达到设置的上限,Redis写命令会返回错误信息(但读命令仍然可以正常返回。)或者你可以将Redis作为缓存使用配置淘汰机制。当Redis达到内存限制时,它会刷新掉旧的内容。45.Redis是单线程的。如何提高多核CPU的利用率?您可以在同一台服务器上部署多个Redis实例,并将它们作为不同的服务器使用。在某些时候,无论如何一台服务器是不够的,所以如果你想使用多个CPU,你可以考虑Fragmentation(分片)。46.一个Redis实例最多可以存储多少个key?List、Set、SortedSet最多可以存储多少个元素?理论上,Redis最多可以处理232个键,并在实践中进行了测试。每个实例至少存储2.5亿个密钥。我们正在测试一些更大的值。任何列表、集合和有序集合都可以容纳232个元素。换句话说,Redis的存储限制是系统中可用的内存量。47、Redis常见性能问题及解决方法?(1)Master最好不要做任何持久化的工作,比如RDB内存快照,AOF日志文件(2)如果数据比较重要,一个Slave启动AOF备份数据,策略设置为同步一次persecond(3)对于master-slave为了复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内(4)尽量避免在master上添加从库高压下的库(5)主从复制不要使用图结构,使用单向链表结构更稳定,即:Master<-Slave1<-Slave2<-Slave3...这种结构比较方便解决单点故障问题,实现Slave对Master的更替。如果Master挂掉了,可以马上让Slave1成为Master,其他不变。48、Redis提供了哪几种持久化方式?RDB持久化方法可以在指定的时间间隔存储数据的快照。AOF持久化方式记录每一次对服务器的写操作。当服务器重新启动时,这些命令将被重新执行以恢复原始数据。AOF命令使用redis协议将每次写操作追加保存到文件末尾。Redis还可以在后台重写AOF文件,这样AOF文件的体积就不会太大。如果你只想让你的数据在服务器运行时存在,你也可以不使用任何持久化方法。您还可以同时启用两种持久化方法。这样的话,当redis重启的时候,会先加载AOF文件来恢复原来的数据,因为一般情况下,AOF文件保存的数据集要比RDB文件保存的多。数据集必须完整。最重要的是了解RDB持久化和AOF持久化的区别,我们先从RDB持久化说起。49.如何选择合适的持久化方式?一般来说,如果想达到媲美PostgreSQL的数据安全性,应该同时使用这两种持久化功能。如果你真的很在意你的数据,但仍然可以容忍数据在几分钟内丢失,那么你可以使用RDB持久化。很多用户只使用AOF持久化,但是不推荐这种方式:因为定期生成RDB快照(snapshot)对于数据库备份非常方便,而且RDB恢复数据集的速度也比AOF恢复快,除了另外,使用RDB也可以避免前面提到的AOF程序的bug。50、修改配置是否会在不重启Redis的情况下实时生效?对于正在运行的实例,有许多配置选项可以通过CONFIGSET命令修改,而无需执行任何形式的重启。从Redis2.2开始,可以在不重启Redis的情况下,从AOF切换到RDB的快照持久化等方式。搜索“CONFIGGET*”命令以获取更多信息。但偶尔需要重启,比如将Redis程序升级到新版本,或者需要修改一些CONFIG命令目前不支持的配置参数。更多学习内容,可访问【与各大厂商对比】优质PHP架构师教程目录。只要能读懂,就能保证你的薪水更上一层楼(持续更新中)。以上内容希望对大家有所帮助。很多PHPer总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道从哪里开始改进,我整理了一些这方面的资料,包括但不限于:分布式架构,高可扩展性、高性能、高并发、服务器性能调优、TP6、laravel、YII2、Redis、Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等知识点免费分享给你如果你需要高级干货。有需要的可以点击链接领取高级PHP月薪30k>>>架构师成长之路【免费获取视频和面试资料】
