前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis面试专题

Redis面试专题

原创
作者头像
疯狂的KK
发布2023-05-10 15:21:00
2470
发布2023-05-10 15:21:00
举报
文章被收录于专栏:Java项目实战Java项目实战

什么是 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是一个多用途的数据库,可以通过这些数据结构实现丰富的功能。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档