Redis面试专题

2023-05-10 15:21:00 浏览数 (2)

什么是 Redis?Remote Dictionary Server。

Redis 是一款高性能的NOSQL系列的非关系型数据库。它以键值对的形式存储数据,所以它也被称为数据结构服务器。

主要特性:

1. 速度快:Redis的速度极快,每秒可以执行约110000次的读写操作。

2. 支持丰富的数据类型:字符串、哈希、列表、集合、有序集合、位图、hyperloglog、geo等。

3. 持久化:Redis支持两种持久化方式:RDB(默认)和AOF。可以将内存中的数据持久化到磁盘中。

4. 高可用:Redis支持主从复制,可以提高Redis的可用性。一个master可以有多个slave。

5. 轻量:Redis是一个轻量级的数据库,不需要复杂的安装步骤,很容易部署。

6. 丰富的特性:Redis还支持发布订阅、事务、Lua脚本、LRU淘汰、查询监视等功能。

Redis的主要用例场景:

1. 缓存系统:Redis的速度很快,经常被用来构建缓存系统。

2. 会话缓存:Redis可以用来保存用户的会话信息。

3. 消息队列:Redis的list类型可以实现消息队列的功能。

4. 计数器:Redis的incr命令可以很容易实现计数器。

5. 社交网络:可以用来记录用户的好友列表,粉丝列表等。

总之,Redis是一个速度极快、功能丰富、轻量级的NOSQL数据库,用来构建高性能的缓存系统或其他会有很好的效果。

Redis 相比 memcached 有哪些优势?

Redis 和 Memcached 都是热门的缓存系统,但是之间还是有一些比较重要的区别:

1. 数据类型 richer

   Redis 支持更丰富的数据类型,如字符串、哈希、列表、集合、有序集合、帮助、地理空间等,而 Memcached 只支持简单的键值对。

2. 持久化

   Redis 支持RDB和AOF两种持久化方式,可以将内存中的数据持久化到磁盘中。而Memcached 数据存在内存中,重启会丢失。3. 集群

   Redis 支持主从复制和分片,可以更容易的实现高可用性和扩展性。而Memcached 不支持主从复制,不容易实现高可用集群。4. 丰富的特性

   Redis 还支持发布订阅、事务、LUA脚本、LRU淘汰等更丰富的特性。而Memcached比较简单。

5. 键空间通知

   Redis 支持键空间通知,可以订阅某个键,当这个键被修改或删除时,会收到通知。Memcached 不支持这一特性。所以总体来说,

Redis 相比 Memcached 有如下优势:

1. 支持更丰富的数据类型和操作

2. 支持持久化

3. 支持高可用集群

4. 有更丰富的特性如发布订阅、事务、LUA脚本等

5. 支持键空间通知但是,Redis 的复杂性也更高,并且对内存的利用率更高,所以在某些场景下,

Memcached 也有其优势,如:

1. 更简单,更容易部署和维护

2. 可以缓存更多的数据,因为不需要其他内存来支持Redis的复杂数据结构和特性所以,对于缓存较简单的key-value场景,Memcached还是很有优势的。但如果需要缓存复杂的结构化数据,Redis的功能更丰富。

两者可以根据具体业务场景来选用。

Redis 支持哪几种数据类型?

9种

Redis排行榜的设计与实现 (qq.com)

Redis 有哪几种数据淘汰策略?

1. 无淘汰策略:这是 Redis 的默认策略,即不会移除任何键。这种策略下,内存使用量可能会超出你为 Redis 指定的内存限制,然后Redis会选择阻塞客户端命令,而不是删除数据。

2. volatile-lru:以LRU算法移除设置了过期时间的键。这种策略通常不会造成数据的丢失,仅当内存不足以执行操作时,才会使用该策略。

3. allkeys-lru:以LRU算法移除任何键。这种策略会更积极地试图防止内存不足,但是同时也更有可能导致数据的丢失。

4. volatile-random:随机移除设置了过期时间的键。这种策略仅当内存不足以执行操作时才会使用。

5. allkeys-random:随机移除任何键。这种策略会更积极地试图防止内存不足,但是同时也更有可能导致数据的丢失。

6. volatile-ttl:移除即将过期的设置了过期时间的键。这种策略试图通过删除马上要过期的键来腾出内存,仅当内存不足以执行操作时才会使用该策略。

所以,总结来说,Redis 主要支持以下几种数据淘汰策略:

1. 无淘汰策略:默认,不移除任何键

2. volatile-lru:以LRU算法移除设置了过期时间的键

3. allkeys-lru:以LRU算法移除任何键

4. volatile-random:随机移除设置了过期时间的键

5. allkeys-random:随机移除任何键

6. volatile-ttl:移除即将过期的设置了过期时间的键

这些策略之间存在时间空间上的权衡,可以根据实际业务场景选择最合适的策略。

一个字符串类型的值能存储最大容量是多少?

Redis字符串类型的值实际上是一个SDS(简单动态字符串),它是Redis内部的数据结构,具有以下特性:

1. 最大长度为512MB

2. 二进制安全,可以包含任何二进制数据

3. 长度可变,SDS会根据字符串值的增长动态调整内部缓冲区

4. 空间利用率高,存储短字符串值时内存消耗很小

5. 字符串值是不可变的,在长度不变的情况下Redis只会在内部创建一个SDS,所有引用这个SDS的客户端和命令都共享这个SDS

Redis 集群方案什么情况下会导致整个集群不可用?

Redis 集群方案在以下几种情况下可能会导致整个集群不可用:

1. 主节点宕机且没有足够的从节点接替成为主节点。这会导致写操作不可用,进而整个集群不可用。

2. 大部分数据节点宕机。这会导致大部分数据不可访问,使集群不可用。

3. 网络分区。如果网络分区导致大部分节点无法通信,那么集群也会不可用。

4. 客户端重定向失败。如果客户端无法连接到正确的节点,导致请求不能正确处理,这也会使集群不可用。

主从复制情况下:

1. 如果主节点宕机且没有从节点立即接替,那么写操作将不可用,导致集群不可用。

2. 如果主节点和大部分从节点都宕机,那么大部分数据将不可访问,导致集群不可用。

哨兵模式情况下:

1. 如果主节点宕机,且由于某些原因哨兵节点没有正确执行主节点切换,那么写操作将不可用,导致集群不可用。

2. 如果主节点、从节点和哨兵节点大部分都宕机,那么数据将不可访问,导致集群不可用。

集群情况下:

1. 如果大部分主节点宕机,那么集群将分片重分布不均衡,导致大部分数据不可访问,使集群不可用。

2. 如果网络分区导致大部分节点无法通信,那么客户端请求无法正确处理,使集群不可用。

3. 如果客户端无法连接到正确的节点,那么客户端请求无法被处理,使集群不可用。

所以总之,在主从复制、哨兵模式和集群情况下,当大部分数据节点或主节点不可用,网络分区或客户端重定向失败都可能导致Redis集群整体不可用。这也是Redis集群需考虑的一些可能的风险点。

MySQL 里有 2000w 数据,Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?

1. 设置过期时间:在Redis中设置较短的过期时间,例如1小时。过期的数据会被自动删除,所以Redis中的数据都是最近被访问过的热点数据。

2. LRU算法:Redis支持LRU(最近最少使用)算法来淘汰数据。我们可以将maxmemory-policy设置为allkeys-lru或volatile-lru,这会驱除最近最少使用的数据,保证Redis中的数据都是热点数据。

3. 定期删除冷数据:我们可以定期扫描Redis的数据,找到一定时间内没有被访问的数据,认为它是冷数据并将其删除。这需要我们自己维护一个时间戳来完成。

4. 使用HyperLogLog做基数统计:我们可以仅将热点数据的唯一ID存入Redis,使用HyperLogLog来统计其基数。当基数突然增加时,表示有大量请求访问,我们可以将相关数据提前加载到Redis中。

5. 使用Redis Bloom Filter:我们也可以用Redis的Bloom Filter来判断一个数据是否存在。当查询失败或存在率下降时,表示数据被频繁访问,我们将相关数据加载到Redis中。

6. 分层存储:我们可以采用Redis MySQL 的分层存储架构。将最热的数据存入Redis,其次热的数据存入MySQL内存表、硬盘表中。当访问MySQL内存表和硬盘表中的数据达到一定频率时,我们将其迁移到Redis中,保证Redis中都是最热的数据。

所以总结来说,保证Redis中数据都是热点数据的主要方法是:

1. 设置较短过期时间,定期删除冷数据

2. 使用LRU算法淘汰冷数据

3. 定期扫描查找冷数据并删除

4. 使用HyperLogLog和Bloom Filter统计热点数据

5. 分层存储,根据访问频率迁移数据到Redis

通过这些方法,我们可以有效地保证Redis中存放的都是热点数据和最频繁被访问的数据。

redis使用场景以及对应的数据结构

1. 缓存:对应字符串(String)、哈希(Hash)、列表(List)、集合(Set)等数据结构。可以缓存热点数据、元数据等。

2. 会话缓存:对应字符串(String)、哈希(Hash)、列表(List)等数据结构。可以保存用户会话信息。

3. 消息队列:对应列表(List)数据结构。可以实现消息队列的功能。

4. 计数器:对应字符串(String)的数据结构,使用 INCR 命令进行增减计数。

5. 社交网络:对应列表(List)、集合(Set)、有序集合(Sorted Set)等数据结构。可以存储好友列表,粉丝列表等社交数据。

6. 地理位置:对应有序集合(Sorted Set)与地理位置(GEO)的数据结构。可以存储地理位置相关的数据。

7. 发布/订阅:对应发布/订阅(Pub/Sub)功能。可以实现消息发布和订阅。

8. 蓝绿部署:可以使用Redis的主从复制功能实现蓝绿部署,如通过改变主节点指向完成发布。

具体对应的数据结构和示例如下:

1. 缓存:String、Hash、List、Set

2. 会话缓存:String、Hash、List

3. 消息队列:List

4. 计数器:String,使用 INCR 命令

5. 社交网络:List(好友列表)、Set(粉丝列表)、ZSet(关注列表)

6. 地理位置:ZSet、GEO

7. 发布/订阅:Pub/Sub

8. 蓝绿部署:主从复制

所以总结来说,Redis可以用于缓存、会话缓存、消息队列、计数器、社交网络等多种场景。主要的数据结构有:字符串、哈希、列表、集合、有序集合、geo、发布订阅。 Redis是一个多用途的数据库,可以通过这些数据结构实现丰富的功能。

0 人点赞