首页 > 数据库 >Redis面试题

Redis面试题

时间:2024-10-24 17:19:32浏览次数:9  
标签:面试题 缓存 单线程 Redis 场景 多线程 数据

1.Redis的简介

  • 高速内存数据库:Redis是一个存储在内存中的数据库,这意味着它的读写速度非常快,非常适合做缓存;
  • 多种数据结构:字符串、哈希散列、列表、集合;
  • 持久化选择:可以选择将数据定期存储到磁盘中,防止重启时数据丢失;
  • 事务支持:可以将一组操作看成一个整体一起执行,确保了操作的完整性;
  • 复制与集群:支持复制数据和集群部署,提高了数据的可用性和可扩展性;
  • 发布/订阅:支持消息传递模式,适合用于构建实事应用;
  • Lua脚本:支持编写Lua脚本,可在服务器上执行复杂操作;
  • 自动检测恢复:具自动检测故障并恢复的能力,增强了系统的可靠性。

 2.Redis和Mencache的共同点和区别?

共同点:

  • 都是基于内存存储,都可作缓存;
  • 都有过期策略
  • 性能都高

区别:

  1. Redis支持数据类型丰富;Memcache只支持简单类型key,value的数据类型;
  2. Redis支持持久化;Memcache不支持
  3. Redis原生支持集群部署;Memcache不支持
  4. Redis支持发布/订阅,事务等;Memcache没有

3.为什么用Redis做Mysql?

由于Redis有高性能和高并发两个特性 

高性能:

  1.         第一次访问mysql速度比较慢(硬盘读取)
  2. 将Rdeis的数据放入缓存,后续访问可直接从缓存中获取数据;

高并发:

  1.         Redis的QPS(每秒处理完请求的次数)是Mysql的10倍;
  2. Redis单机可轻松突破10W,MySQL很难突破1W;
  3. Redis可轻松处理大量请输数据;从而减少数据库的压力

4.Redis支持的数据类型及应用场景

  1. String:可对整体字符串或字符串的一部分并进行操作,对整数或浮点数进行自增或自减操作。                                                                                                                              应用场景: 缓存对象、常规技术、分布式锁、共享session信息等。

  2. List:可对链表的两端进行pop或push操作,读取单个或多个数据,根据值查找或删除数据。                                                                                                                                   应用场景:消息队列(两个问题:1.生产者需要实现全局唯一ID 2.不能以消费组的形式消费数据)

  3. Hash:包含键值对无序哈希列表,包含数据的添加、获取、删除数据;                          应用场景:缓存对象、购物车

  4. Set集合:应用场景:聚合计算(交集、并集、差集),例如点赞、共同关注、抽奖活动等

  5. Zset集合:zset是有序键值对,字符串成员与浮点数分数之间的有序映射,元素的排序与分数的大小有关,包含元素的添加,获取,删除操作以及与分值范围或成员获取数据;                                                                                                                                  应用场景:排序场景;例如:排行榜,姓名或电话排序等。

  6. BitMap:二值状态键值,                                                                                                应用场景:签到,用户登录状态,用户签到的总数等。

  7. HyperLogLog: 应用于海量数据                                                                                       应用场景:海量网页UV统计等。

  8. GEO:获取地理位置信息                                                                                                   应用场景:滴滴打车

  9. Stream:基于List的一些特性(自动生成全局唯一ID,支持消费组的形式消费数据)

5.五中常见redis数据类型

  1. String 实现的底层原理:String的底层实质是SDS,SDS不仅可以保存文本文件,也可保存二进制文件;并对字符串长度的时间复杂度O(1)

  2. List实现的底层原理:List基于链表结构和压缩列表

  3. Hash实现的底层原理:Hash基于压缩列表和哈希表

  4. Set实现的底层原理:Set基于哈希表和整数集合

  5. ZSet实现的基层原理:Zset基于压缩列表和跳表

6.Redis6.0之前的单线程模式

 客户端通过listen stocket连接到Redis;

Redis通过epoll多路复用机制多处理多客服端连接;

事件循环:

       初始化时,创建一个epoll对象和监听套接字;

       调用bind()绑定端口并调用listen()监听套接字;

       将监听套接字加入epoll并注册接口事件处理函数;

时间处理流程:

     接受连接请求:调用accept()获取已连接的套接字---->注册读时间处理函数。

     读取数据:调用read()获取客户端发送的数据----->解析命令------>执行命令------->添加到发送队列------>写入缓存等待发送。

     发送数据:遍历发送队列-------->调用write()发送数据------>如果未发送完,则继续注册事件处理函数,等待epoll_wait()发现可写后在处理。

7.Redis采用单线程为什么这么快?

Redis的吞吐量可达到每秒10万次请求。

原因如下:

  1. Redis的大部分操作都在内存中完成的,并采用高效的数据结构;
  2. 单线程模式避免多线程之间的竞争和开销;
  3. 使用I/O多路复用机制处理大量客户端Scoket请求 

8.Redis6.0之前为什么使用单线程?

因为单线程程序是无利用服务器的多核CPU的 ;

CPU并不是制约Redis的瓶颈所在;

可以通过在同一台服务器上运行多个redis实例来充分利用多核CPU

使用了单线程后,可维护性高;多线程模式虽然在某些方面表现优异,但引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至出现死锁、加锁、解锁

9.Redis6.0之后为什么引入多线程?

  • 尽管Redis的主要工作一直是单线程来处理网络请求,,这是因为随着网络硬件的性能提升,Redis的性能瓶颈有时会出现在网络I/O的处理上;

  • 为了提高网络I/O并行度,Redis6.0对于网络I/O采用多线程来处理;

  • Redis官方表示,Redis6.0版本引入的多线程I/O特性对性能提升至少是一倍以上;

  • 默认情况下,I/O多线程只针对发送相应数据,并不会以多线程的方式处理请求。

10.Redis的持久化?

  1.  将当前数据进行保存,快照形式,存储数据结果,存储格式简单,关注点在数据(RDB);

  2. 将数据的操作过程进行保存,日志形式,存储操作过程,关注点在数据的操作过程(AOF

缓存预热:系统启动时,将缓存相关的数据提前加载到缓存系统中;

解决方案(限流、线程隔离(仓壁模式)、降级熔断(断路器)、超时处理

缓存雪崩:同一时段大量缓存key失效,Redis服务宕机,大量请求到数据库

解决方案(集群、降级限流、多级缓存) 

缓存击穿:一个高并发访问且重建复杂的key失效,无数请求瞬间到达数据库,造成高负载

解决方案(互斥锁、逻辑过期

缓存穿透:当客户端请求数据访问缓存和数据都没有时,导致每次请求都需查询数据库,从而给数据库带来不必要压力

解决方案(缓存空对象、使用布隆过滤器

标签:面试题,缓存,单线程,Redis,场景,多线程,数据
From: https://blog.csdn.net/fada_da_da/article/details/142980643

相关文章

  • 1. Redis简介与安装
    1.1什么是RedisRedis(RemoteDictionaryServer)是一个开源的、基于内存的数据结构存储系统,支持多种数据结构,如字符串、列表、集合、有序集合和哈希。它不仅能作为一个高效的缓存工具,还能作为消息队列、分布式锁和持久化存储等广泛的场景中使用。Redis的历史Redis由意......
  • ubuntu里 docker 启动springboot工程,报连不上redis
    也挺奇怪的,直接在ubuntu里使用idea是可以跑起来的。一样使用docker部署,centos7.3里面能正常启动,但是,ubuntu22.04里面就跑不起来了。具体报错:RedisConnectionException:Unabletoconnectto192.168.50.128/<unresolved>:6319这个是DockerFileFROMeclipse-temu......
  • Redis高可用-集群部署
    redis配置Redis集群需要至少3个主节点,为保证数据的完整性每个主节点至少需要一个从节点,所以至少需要准备6个Redis服务建议将redis注册为系统服务并设置自启动,服务注册命令为:redis-server--service-installredis.windows.conf--service-nameredis6379--loglevelverbose......
  • 5道大厂的JAVA经典面试题-初中级
    前言本来想着给自己放松一下,刷刷博客,慕然回首,Java的四种引用,强弱软虚?泛型常用特点?Java创建对象有几种方式?有没有可能两个不相等的对象有相同的hashcode?深拷贝和浅拷贝的区别是什么?似乎有点模糊了,那就大概看一下5道Java基础面试题吧。好记性不如烂键盘~***12万字的java面试题......
  • redis学习笔记整理
    安装redis6.2.6一件安装脚本#!/bin/bash#修改系统参数echo'net.core.somaxconn=1024'>>/etc/sysctl.confecho'vm.overcommit_memory=1'>>/etc/sysctl.conf#以上两个系统参数不调整,在redis启动时将会有两条WARNING提示:#WARNING:TheTCPbacklogsettingof511......
  • 挑战中,Java面试题复习第5天,坚持就是胜利。
     ......
  • 如何使用Java设计一个RDB格式的Redis
    RDB的使用场景数据备份:RDB适合定期备份Redis中的数据,帮助在系统崩溃或意外情况下恢复数据。冷备份:在不需要频繁写入数据的场景(如数据分析、报告生成),RDB可以作为冷备份使用。启动时数据加载:在系统启动时,通过加载RDB文件快速恢复数据,提高启动速度。数据迁移:使用RD......
  • 如何使用Java设计一个AOF格式的Redis
    AOF的使用场景高数据安全性需求:适用于对数据一致性要求高的应用场景,如金融交易系统、订单处理系统等。频繁写入操作:AOF适合频繁进行写操作的场景,因为它记录每个写命令,可以有效恢复最新数据。实时数据恢复:当系统崩溃或发生故障时,AOF能快速恢复数据,适合需要高可用性......
  • Linux安装Redis(保姆教程)
    1,安装GCC依赖#sudo表示以管理员身份运行,如果使用的是管理员用户就不需要sudosudoyuminstall-ygcc2,添加EPEL仓库yuminstallepel-release#更新yum源yumupdate3,安装redisyuminstallredis4,查看redis安装的路径,默认安装路径为:/var/lib/redisfindI-nameredis5,修改......
  • 并发面试题-谈谈你对AQS的理解
    简要回答AQS(AbstractQueuedSynchronizer抽象队列同步器)是Java并发包中的一个核心组件,它提供了一个框架用于实现基于FIFO等待队列的阻塞锁和同步器。AQS通过管理一个同步状态和一个等待队列来控制多线程对共享资源的访问。它定义了一系列模板方法,如tryAcquire、tryRelease等,供......