数据库技术 - Redis

前言

20题。

项目中为什么用Redis?

  1. 操作速度快:数据都保存在内存中;

  2. 数据类型丰富 :支持stringlistsetZsethash等数据类型;

  3. 使用场景丰富 :缓存,消息队列,按key设置过期时间,过期后自动删除。

Redis的基础数据类型有哪些?

Redis最常见的数据类型有5种,分别是StringListHashSetZSet

  1. String:字符串类型,场景:计数、缓存文本内容等;

  2. List:底层是链表,增删容易随机访问困难。场景:消息队列;

  3. Hash :类似于Java中的HashMap,存储对象。场景:系统中对象数据的存储;

  4. Set:无序集合;

  5. ZSet:有序集合,且集合中每个元素关联一个分数,可以根据分数进行排序。

Redis为什么这么快?

  1. 纯内存操作Redis的绝大部分请求是纯粹的内存操作,非常快速;

  2. 单线程Redis的核心部分是单线程运行的,避免了不必要的上下文切换,也不存在线程切换导致的CPU消耗;

  3. 使用I/O多路复用模型 :利用单个线程来同时监听多个Socket,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。

  4. 数据类型redis内置了多种优化过的数据类型(5种基本数据类型+5种复杂数据类型 ),这些数据类型的性能非常高。

Redis的过期删除策略有哪些?

Redis的过期删除策略有:

  1. 惰性删除 :只会在取出key的时候才对数据进行过期检查,过期了就删除;

  2. 定期删除 :每隔一段时间抽取一批key执行删除过期key操作。

两者相比,定期删除 对内存更加友好,惰性删除CPU更加友好。

Redis采用的是定期删除 +惰性/懒汉式删除

Redis的内存淘汰策略有哪些?

内存淘汰策略指的是:当Redis的内存已经存满,又有新的数据需要保存时的处理方案。

Redis的内存淘汰策略有:

  1. 默认策略:直接报错;
  2. 随机淘汰策略;
  3. 淘汰最少使用策略。

Redis持久化RDB和AOF的区别?

  • RDB 采用的是定期更新的方式,磁盘上保存的就是Redis的内存快照。文件较小,数据恢复速度较快,但存在丢失数据的风险;

  • AOF 磁盘保存的是所有执行的指令,在下次Redis重启时,只需要将指令重写一遍即可。相对完整但文件较大,数据恢复的速度较慢。

实践中可以同时开启RDBAOF持久化机制。Redis重启时先使用AOF日志进行恢复,然后再使用RDB快照进行备份。定期进行RDB快照的备份,以便在需要时进行全量数据的恢复,提高数据的可靠性、恢复能力以及持久化能力。

RDB期间可以同时处理写请求吗?

可以,bgsave快照备份时不耽误写,但save不行。

  1. 具体来说,就是Redis在持久化时会产生一个子进程,快照持久化完全交给子进程来处理,父进程继续处理客户端请求;

  2. 当主线程执行写指令修改数据的时候,这个数据就会复制一份副本,然后修改副本中的数据,RDB结束后,主进程读取这个副本数据写到RDB文件;

  3. 这既保证了快照的完整性,也允许主线程同时对数据进行修改,避免了对正常业务的影响。

Redis集群有哪些方案?

Redis集群主要有三种方案,分别是主从哨兵分片集群。

  • 主从 集群主要用来解决Redis的并发问题,实现读写分离。一个主节点负责写,多个从节点负责读,主节点的数据会实时同步给从节点;

  • 哨兵 集群主要用来解决Redis的高可用问题。哨兵会监控集群中节点状态,并在主节点出现问题时重新选主,但他不保存数据;

  • 分片 集群主要用来解决Redis的海量数据存储和高并发写的问题--哈希槽。要求有多个主节点,然后写入的数据会经过计算落到其中一个上。

如何保证Redis数据与MySQL一致?

常见的有三种:

  1. 同步双写 :即在程序更新完MySQL之后后立即同步更新redis

  2. 异步监听 :即通过Canal监听MySQLbinlog日志变化,然后再通过程序将变化的数据更新数据到 Redis

  3. MQ异步 :即程序在更新完MySQL后,发送一条消息到MQ中,然后再通过一个程序监听MQ,获取到消息,然后更新Redis

什么是缓存预热?

缓存预热指的是:提前将数据放进Redis中--先查Redis再查MySQL,避免高并发访问时,对数据库造成的压力。

缓存预热解决方案主要有下面几个:

  1. 数据量不大的时候,工程启动的时候进行加载缓存动作;

  2. 数据量的时候,设置一个定时任务脚本,进行缓存的刷新;

  3. 数据量太大的时候,优先保证热点数据进行提前加载到缓存。

什么是缓存穿透,怎么解决?

缓存穿透指的是:当查询redis中未存在的数据时就会去MySQL中查询,然后大量请求进入MySQL就会导致MySQL承受不了压力而宕机。常用的解决方案有:

  1. 对传入参数进行判断是否合法;

  2. 对数据库未查询到的id信息也存入redis,这样下次查询就会从redis中获取;

  3. 使用布隆过滤器 :以较小内存为代价的,用于检测大量元素是否存在的算法,核心原理是二进制数组 + 哈希运算,可以通过RedissonGuavaHutool来实现。

什么是缓存击穿,怎么解决?

缓存击穿指的是:当redis中一个热点数据的过期时间到了,然后还有大量请求来访问这个热点数据,但redis已经对该数据做了过期处理,这个时候就会访问MySQL当大量请求进入MySQL,就会导致MySQL承受不了压力而宕机。

常用的解决方案有:

  1. 不对热点数据设置过期时间;

  2. 布隆过滤器。

什么是缓存雪崩,怎么解决?

redis中的大量数据都是同一过期时间,当这些数据同时过期,这时候然后大量请求过来在redis中没有拿到数据,这些请求就会去MySQL中获取数据,导致MySQL承受不了压力而宕机。

解决方案:给这些数据设置随机过期时间或者不进行过期处理。

用过Redis的事务吗?

没有用过,他本身没有事务概念但一些命令组合起来可以起到事务的效果。

什么类型的数据适合往redis里放?

  1. 热点数据:也即需频繁访问的数据;
  2. 会话数据:存储用户会话信息如登录状态;
  3. 消息队列:存储消息队列中的消息。

redis除了5种基本数据类型,还有哪些类型?

除了5种基本数据类型,redis还有5种特殊数据类型:

  1. GEO地理位置类型,用于存储地理位置信息并进行相关操作,如添加地理位置的坐标、获取地理位置的坐标、计算两个位置之间的距离等。
  2. ‌‌HyperLogLog‌类型 用于基数统计,基数指的是去重后元素出现的个数,HyperLogLog类型的优点在于输入元素的数量或体积很大时,计算基数所需的空间总是固定且很小;
  3. ‌‌Bitmap‌ :位图,是由01状态表示的二进制位的bit数组,用于处理大量数据的布尔值状态。可以用作布隆过滤器的数据类型。
  4. ‌‌bitfield类型:可以一次性对多个比特域进行操作。
  5. Stream类型Stream类型是redis5.0新增加的数据结构,主要用于消息队列。Stream类型提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每个客户端的访问位置,保证消息不丢失。

你们的redis是什么版本?

实际开发常用版本7

布隆过滤器会不会出现判断不准确的情况?

布隆过滤器可能会误判,原因在于它使用了哈希算法,Hash算法存在着一定的碰撞几率。Hash碰撞的含义是不同的输入值经过hash得到相同的hash结果

当一个不存在于redis的数据经过布隆过滤器时,先根据哈希算法计算出其在数组上的位置,此时该哈希槽可能因为其他数据计算出相同位置,该位置数据状态已经变成11表示数据存在,0表示数据不存在),因此布隆过滤器认为该数据存在,这就产生了误判。

但是,如果布隆过滤器判断这个元素不在redis时,它就一定不在redis中,因此非常适合解决缓存穿透的问题。

关于io多路复用,redis在windows和linux上的性能表现会不会不同?

redislinux上的性能表现高于windows,主要的区别是操作系统内核的不同。

redislinux上通过单线程epoll非阻塞同步模型 + 自己开发的一个事件框架实现了io多路复用模型,windows上则没有epoll

为什么使用redis存储消息队列的消息?

因为redis直接操作内存非常快速,且可以设置key的过期时间,还有专门存储消息队列的数据类型StreamStream类型能够实现消息的持久化和主备复制,可以让任何客户端访问任何时刻的数据,并且能记住每个客户端的访问位置,保证消息不丢失

相关推荐
_一条咸鱼_1 小时前
Vue 配置模块深度剖析(十一)
前端·javascript·面试
鸡鸭扣2 小时前
系统设计面试总结:高性能相关:CDN(内容分发网络)、什么是静态资源、负载均衡(Nginx)、canal、主从复制
网络·面试·负载均衡
风铃儿~2 小时前
Java微服务注册中心深度解析:环境隔离、分级模型与Eureka/Nacos对比
java·分布式·微服务·面试
洛神灬殇3 小时前
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 文件事件处理部分)
redis·后端
顾林海4 小时前
Flutter 图标和按钮组件
android·开发语言·前端·flutter·面试
海姐软件测试4 小时前
面试求助:在性能测试中发现CPU占用过高应该如何进行分析?
面试·自动化
杰瑞学AI4 小时前
LeetCode详解之如何一步步优化到最佳解法:27. 移除元素
数据结构·python·算法·leetcode·面试·职场和发展
尘寰ya4 小时前
前端面试-HTML5与CSS3
前端·面试·css3·html5
kinlon.liu5 小时前
SpringBoot整合Redis限流
spring boot·redis·后端
尘寰ya5 小时前
前端面试-React篇
前端·react.js·面试