36 Redis高性能缓存数据库面试题
作者:开心洋洋
1.什么是Redis?简述其优点和缺点?
Redis的全称是:Remote Dictionary.Server。这是一个Key-Value类型的内存数据库,类似于
memcached。所有数据库都加载到内存中进行操作,并通过异步操作定期刷新数据库数据。保存到您的硬盘。
由于是纯内存操作,Redis 的性能非常出色,每秒可以处理 10 万次以上的读写操作。它是已知执行速度最快的键值数据库。
Redis 的优势不仅仅在于性能。 Redis最大的魅力在于它支持存储多种数据结构。另外,一个值的最大限制是1GB,不像memcached只能存储1MB的数据,因此Redis可以用来实现很多有用的功能。
例如,使用List创建双向链接的FIFO列表来实现轻量级高性能消息队列服务,使用Set创建高性能标签系统等。
另外,Redis 可以为存储的 Key-Value 设置过期时间,因此它也可以用作 memcached 的增强版。 Redis的主要缺点是数据库容量受物理内存限制,无法用于读写大量数据。因此,Redis的理想场景主要局限于高性能操作和较小数据计算。
2。 Redis与memcached相比有哪些优势?
- memcached 中的所有值都是简单的字符串,而 redis 作为替代品,支持更丰富的数据类型
- redis 比 redis 快 memcached 比 memcached 快
- redis 可以持久化数据
3. Redis支持哪些数据类型?
字符串、列表、集合、排序集、哈希
4。 Redis一般消耗哪些物理资源?
记忆。
5。 Redis的数据删除策略是怎样的?
- noeviction:当达到内存限制并且客户端尝试执行会导致使用更多内存的命令时,会生成错误。
- allkeys-lru:尝试回收最少使用的键(LRU),为新添加的数据腾出空间。
- 易失性-lru:尝试回收最少使用的键(LRU),但仅回收过期集合中的键,因此有空间容纳新添加的数据。
- allkeys-random:回收随机密钥,为新添加的数据腾出空间。
- 易失性随机:回收随机密钥以为新添加的数据腾出空间,但仅限于过期集中的密钥。
- 易失性-ttl:回收过期集合中的密钥,并优先考虑生存时间 (TTL) 较短的密钥,以便有空间存储新添加的数据。
6。为什么Redis官方不提供Windows版本?
由于目前Linux版本相当稳定,用户也较多,所以没有必要开发windows版本,这样会带来兼容性等问题。
7。字符串类型值最多可以存储多少容量?
512M
8。为什么Redis需要将所有数据放在内存中?
Redis 将所有数据读取到内存中以实现最快的读写速度,并将数据异步写入磁盘。
因此,redis具有速度快、数据持久化的特点。如果数据不放在内存中,磁盘I/O速度会影响redis的性能。
现在,随着内存越来越便宜,redis会变得更加流行。如果设置了最大使用内存,则数据量达到内存限制后就无法输入新值。
9。 Redis集群解决方案可以做什么?计划是什么?
- codis
- 当今最常用的集群解决方案,它其实和twemproxy效果一样,只不过支持在节点数量变化时将旧节点数据恢复到新的hash节点上。
- redis cluster3.0是一个配备的集群。特点之一是分布式算法不是一致性哈希,而是哈希槽的概念,并且支持从节点设置节点。详细信息请参见官方文档。
- 在业务代码层实现,创建了几个不相关的redis实例。在代码层,对key进行hash计算,然后对应的redis实例对数据进行操作。这种方法对哈希层代码的要求比较高。考虑因素包括节点故障后的替代算法解决方案、数据冲击后的自动脚本恢复、实例监控等。
10。 Redis集群方案什么情况下会导致整个集群不可用?
在A、B、C三个节点的集群中,如果没有复制模型,如果B节点故障,整个集群会认为5501-11000范围内没有槽位,不可用。
11。 MySQL中有2000万条数据,但是redis中只存储了2000万条数据。如何保证redis中的数据是热数据?
Redis 当内存数据集大小增加到一定大小时,就会执行数据淘汰策略。
其实,除了面试时检查Redis之外,很多公司都在关注高并发、高可用技术,尤其是一线互联网公司。面试需要分布式、
JVM、spring源码分析、微服务等知识点。考试题。文章最后分享一线互联网公司的最新技术知识(彩蛋)
12。 Redis 的理想场景是什么?
(一)会话缓存(Session Cache)
使用Redis最常见的场景之一就是会话缓存(session cache)。与其他存储(例如 Memcached)相比,使用 Redis 进行会话缓存的优点是: Redis 提供持久性。在维护不需要一致性的缓存时,大多数人都不愿意丢失所有用户的购物车信息。现在,他们还会这样吗?
幸运的是,随着Redis多年来的不断改进,如何正确使用Redis来存储会话文档很容易理解。甚至著名的商业平台Magento也提供了Redis的插件。
(2)全页缓存(FPC)
除了基本的会话令牌之外,Redis 还提供了一个非常简单的 FPC 平台。回到一致性问题,即使Redis实例重新启动,用户也不会看到由于磁盘持久化而导致的页面加载速度的下降。这是一个很大的改进,类似于PHP的本地FPC。
再次以Magento为例,Magento提供了一个插件来使用Redis作为全页缓存后端。
另外,对于WordPress用户来说,Pantheon有一个优秀的wp-redis插件,它可以帮助你快速加载你搜索过的页面。
(3)队列
Redis在内存存储引擎领域的一大优势就是提供了列表和集合操作,这使得Redis可以作为一个很好的消息队列平台。Redis作为队列使用的操作类似于本地编程语言(例如Python)中的列表push/pop操作。
如果您在 Google 上快速搜索“Redis 队列”,您会立即找到大量开源项目。该项目的目标是利用Redis创建一个优秀的后端工具来满足各种排队需求。例如,Celery 有一个使用 Redis 作为代理的后端。你可以从这里看到它。
(4)排序/计数器
Redis很好地实现了内存中数字的增减操作。 Sets 和 SortedSets 也使得执行这些操作变得非常容易。 Redis只提供这两种数据结构。
因此,我们希望从排序集中获取前 10 位用户 - 让我们称之为“user_scores”,我们只需要这样做:
当然,这假设您按升序排序。根据您的用户分数。如果你想返回用户和用户分数,你应该这样做:
ZRANGE user_scores 0 10WITHSCORESAgora Games 就是一个很好的例子,用 Ruby 实现,排名使用 Redis 来存储数据。你可以在这里看到它。
(5) 发布/订阅
最后(但同样重要的)是Redis 的发布/订阅功能。发布/订阅确实有很多用例。我见过人们在社交网络连接中使用它,作为基于发布/订阅的脚本的触发器,甚至使用 Redis 的发布/订阅功能构建聊天系统!
13。 Redis 支持哪些 Java 客户端?官方推荐哪一款?
Redisson、Jedis、Lettuce等,官方推荐使用Redisson。
14。 Redis和Redisson是什么关系?
15。 Jedis和Redisson各有什么优缺点?
Jedis是Redis用Java实现的客户端。 API对Redis命令提供了比较完善的支持;
Redisson 实现了分布式且可扩展的 Java 数据结构。与Jedis相比,它们的功能更简单。不支持字符串操作,也不支持排序、事务、管道、分区等Redis功能。Redisson的目标是提高用户关注点与Redis的分离,让用户可以更加专注于处理业务逻辑。
16。谈谈Redis哈希槽的概念?
Redis集群没有使用一致性哈希,而是引入了哈希槽的概念。一个Redis集群有16384个哈希槽。每个密钥均已通过 CRC16 进行检查,并以 16384 为模来确定放置哪个槽。每个节点负责哈希槽的一部分。
17。 Redis集群主从复制模型是什么?
为了让集群在部分节点故障或者大部分节点无法通信时仍然可用,集群采用主从复制模型,每个节点都会有N-1个副本。
18。 Redis Cluster 写操作会消失吗?为什么?
Redis 不保证数据的强一致性,这意味着实际集群在某些情况下可能会丢失写操作。
19。 Redis集群是如何复制的?
异步复制
20。 Redis集群的最大节点数是多少?
16384
21。 Redis集群如何选择数据库?
Redis集群目前无法选择数据库,默认为数据库0。
22。 Redis中管道有什么用?
请求/响应服务器即使旧请求没有得到响应也可以处理新请求,因此它可以向服务器发送多个命令而无需等待回复,最后一步读取回复。
这就是流水线技术,一种已经广泛使用了几十年的技术。例如,许多 POP3 协议都实现了对此功能的支持,这加快了从服务器下载新电子邮件的过程。
23。如何理解Redis事务?
事务是单独的隔离操作:事务中的所有命令将被序列化并按顺序执行。事务执行过程中,不会被其他客户端发送的命令请求打断。事务是一个原子操作:执行事务中的所有命令,或者不执行任何命令。
24。与Redis事务相关的命令有哪些?
多重、执行、丢弃、观察
25。如何设置Redis密钥的过期时间和永久有效?
EXPIRE 和 PERSIST 命令
26。 Redis是如何进行内存优化的?
尽可能使用哈希。哈希表(即存储在小型哈希表中的数字)使用的内存非常少,因此您应该尽可能将数据模型抽象为哈希表。
例如,如果您在 Web 系统中有一个用户对象,请不要为用户名、姓名、电子邮件和密码设置单独的键。相反,您需要将所有用户信息存储在哈希表中。
27。 Redis 回收过程如何进行?
客户端执行新命令并添加新数据。 Redi 检查内存使用情况。如果超过最大内存限制,将根据飞机政策进行回收。执行新命令等。
因此,我们不断地达到内存限制,然后不断地循环回到该限制以下,从而不断超出内存限制。
如果该命令的结果导致使用大量内存(例如,将一个大集合的交集保存到一个新键中),那么很快就会超出此内存限制。内存使用情况
28。锁定机制
29。互斥机制的关键
30。看门狗自动伸缩机构
31.可重入锁定机构
32。松开锁定机构
33。上述Redis分布式密钥的缺点
34。你用过Redis分布式密钥吗?它是如何完成的?
先使用setnx抢到钥匙。捕获后,使用expire为key添加过期时间,防止key被遗忘。
如果setnx后执行到期前进程突然崩溃或者需要重启维护怎么办?
set指令的参数非常复杂。这样应该就可以同时将setnx和expire合并成一条指令了!
35。你用过Redis作为异步队列吗?你如何使用它?有什么缺点?
一般使用列表结构作为队列,rpush产生消息,lpop消费消息。如果没有来自 lpop 的消息,请休眠一段时间,然后重试。
缺点:
- 当消费者离线时,产生的消息将会丢失,所以应该使用专业的消息队列,例如rabbitmq。
- 可以生产一次并多次使用吗?
- 使用pub/sub主题订阅模式,可以实现1:N消息队列。
36.什么是缓存穿透?如何避免呢?什么是雪崩缓存?如何避免呢?
缓存穿透
基于密钥的公共缓存系统缓存请求。如果对应的值不存在,那么必须在后端系统(比如DB)中查找。一些错误的请求会故意请求不存在的密钥。如果请求量很大,会给后端系统带来很大的压力。这称为缓存穿透。
如何避免?
1:查询结果为空时也会缓存。缓存时间设置得短一点,不然输入key对应的数据后缓存就会被清空。
2:过滤不应该存在的按钮。您可以将所有可能的按钮放入一个大位图中,并在询问时通过位图进行过滤。
缓存雪崩
当缓存服务器重启或者某个时间很多缓存失效时,这会给后端系统带来很大的压力。导致系统崩溃。
如何避免?
1:缓存过期后,通过加锁或排队的方式控制读数据库和写缓存的线程数量。例如,只允许一个线程查询数据并为特定键写入缓存,而另一个线程则等待。
2:创建二级缓存,A1为原始缓存,A2为复制缓存,当A1过期后,可以访问A2,A1缓存过期时间设置为短期,A2设置为长期-term
3:不同的按钮,不同的Expiration Time设置使缓存失效时间尽可能长
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。