Redis常见面试题(一定要吃透!!!很基础)(持续更新)

目录

Redis 基础

什么是 Redis?

Redis 为什么这么快?

Redis 的优点

Redis 有哪些痛点 ?

 为什么要用 Redis?

Redis 除了做缓存,还能做什么?

Redis 常用的数据结构有哪些?

 String 还是 Hash 存储对象数据更好呢?

Redis 基础

什么是 Redis?

        Redis是一种开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。Redis最初由Salvatore Sanfilippo于2009年开发,现在由Redis Labs进行开发和维护。

        Redis支持多种数据结构,包括字符串、哈希、列表、集合和有序集合等。它提供了丰富的命令集,可以对这些数据结构进行读写操作和其他操作,例如排序、范围查找、事务等。Redis还支持发布/订阅模式、Lua脚本执行和集群等功能。

        为了满足不同的业务场景,Redis 内置了多种数据类型实现(比如 String、Hash、Sorted Set、Bitmap)。并且,Redis 还支持事务 、持久化、Lua 脚本、多种开箱即用的集群方案(Redis Sentinel、Redis Cluster)。

        Redis 没有外部依赖,Linux 和 OS X 是 Redis 开发和测试最多的两个操作系统,官方推荐生产环境使用 Linux 部署 Redis。

        Redis最显著的特点是快速和高效。因为它是基于内存的,所以读写速度非常快,可以达到每秒数百万次的操作。此外,Redis还具有持久化功能,可以将数据保存到磁盘上,以防止意外丢失数据。

        由于其高效性和可扩展性,Redis被广泛用于许多应用程序,如高速缓存、会话存储、消息队列等。

Redis 为什么这么快?

Redis 内部做了非常多的性能优化,比较重要的主要有下面 3 点:

  • Redis 基于内存,内存的访问速度是磁盘的上千倍;
  • Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型,主要是单线程事件循环和 IO 多路复用(Redis 线程模式后面会详细介绍到);
  • Redis 内置了多种优化过后的数据结构实现,性能非常高。

Redis 的优点

        Redis具有高性能、可扩展性、多种数据类型支持、事务支持、多种数据持久化方式、可扩展的Lua脚本支持和支持发布/订阅模式等优点,因此被广泛应用于缓存、会话存储、消息队列等场景。

  • 高性能:Redis是一个基于内存的数据存储系统,因此读写速度非常快。Redis还支持多种数据结构,如哈希、列表、集合和有序集合,可以轻松处理各种不同的数据操作需求。

  • 可扩展性:Redis可以通过添加更多的节点来扩展性能和容量,从而支持大规模应用程序。

  • 强大的数据类型支持:Redis支持多种数据类型,如字符串、哈希、列表、集合和有序集合等。这使得Redis可以轻松地处理不同类型的数据操作需求。

  • 事务支持:Redis支持事务,可以将一系列操作组合成一个原子操作,如果出现错误,则会回滚到事务之前的状态。

  • 多种数据持久化方式:Redis支持多种数据持久化方式,包括RDB和AOF,可以将数据保存到磁盘上,以防止意外丢失数据。

  • 可扩展的Lua脚本支持:Redis支持Lua脚本,可以轻松地扩展其功能,同时还可以实现原子操作和复杂的数据操作。

  • 支持发布/订阅模式:Redis支持发布/订阅模式,可以用作消息队列,支持实时数据处理和通知。

Redis 有哪些痛点 ?

在使用的过程中, 主要遇到以下一些痛点问题:

  • 内存成本高

  • 缓存一致性的问题 (如果用Redis+MySQL,需要考虑维护缓存和数据库的一致性)

  • 数据可靠性 (Redis 本质上是一个内存数据库, 用户虽然可以使用 AOF 的 Always 来落盘保证数据可靠性, 但是会带来性能的大幅下降, 因此生产环境很少有使用。另外 不支持 回档, Master 故障后, 异步复制会造成数据的丢失。)

  • 异步复制 (Redis 主备使用异步复制, 这个是异步复制固有的问题。主备使用异步复制, 响应延迟低, 性能高, 但是 Master 故障后, 会造成数据丢失。)

 为什么要用 Redis?

(直接从高性能、高并发说就行了)

高性能

        如果用户访问的数据属于高频数据并且不会经常改变的话,那么我们就可以直接将这些数据存在缓存中。因为这样就保证用户下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。

高并发

        使用Redis缓存之后,的QPS(访问频率) 容易达到10W+(使用Redis集群更高)。

        直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。进而,我们也就提高了系统整体的并发。

Redis 除了做缓存,还能做什么?

  • 分布式锁 : 通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Redisson 来实现分布式锁。
  • 限流 :一般是通过 Redis + Lua 脚本的方式来实现限流。相关阅读:《我司用了 6 年的 Redis 分布式限流器,可以说是非常厉害了!》https://mp.weixin.qq.com/s/kyFAWH3mVNJvurQDt4vchA
  • 消息队列 :Redis 自带的 list 数据结构可以作为一个简单的队列使用。感觉比较类似于 Kafka,有主题和消费组的概念,支持消息持久化以及 ACK 机制。
  • 复杂业务场景 :通过 Redis 以及 Redis 扩展(比如 Redisson)提供的数据结构,我们可以很方便地完成很多复杂的业务场景比如通过 bitmap 统计活跃用户、通过 sorted set 维护排行榜。

Redis 常用的数据结构有哪些?

  • 5 种基础数据结构 :String(字符串)、List(列表)、Set(集合)、Hash(散列)、Zset(有序集合)。
  • 3 种特殊数据结构 :HyperLogLogs(基数统计)、Bitmap (位存储)、Geospatial (地理位置)。

 String 还是 Hash 存储对象数据更好呢?

String!!!(大部分情况)原因如下:

  • String 存储的是序列化后的对象数据,存放的是整个对象。Hash 是对对象的每个字段单独存储,可以获取部分字段的信息,也可以修改或者添加部分字段,节省网络流量。如果对象中某些字段需要经常变动或者经常需要单独查询对象中的个别字段信息,Hash 就非常适合。
  • String 存储相对来说更加节省内存,缓存相同数量的对象数据,String 消耗的内存约是 Hash 的一半。并且,存储具有多层嵌套的对象时也方便很多。如果系统对性能和资源消耗非常敏感的话,String 就非常适合。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值