redis【面试题】

目录

  • Java全技术栈面试题合集地址
  • Redis篇
    • 1.Redis 的数据类型?
    • 2.Redis 是单进程单线程的?
    • 3.一个字符串类型的值能存储最大容量是多少?
    • 4.Redis 的持久化机制是什么?各自的优缺点?
    • 5.redis 过期键的删除策略?
    • 6.Redis 的回收策略(淘汰策略)?
    • 7.为什么 Redis 需要把所有数据放到内存中?
    • 8.Redis 的同步机制了解么?
    • 9.Jedis 与 Redisson 对比有什么优缺点?
    • 10.说说 Redis 哈希槽的概念?
    • 11.Redis 事务相关的命令有哪几个?
    • 12.Redis key 的过期时间和永久有效分别怎么设置?
    • 13.MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
    • 14.Redis 最适合的场景?
    • 15.缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
    • 16.Redis事务
    • 17.RedLock算法
    • 18.MySQL与Redis 如何保证双写一致性
    • 19.延时双删?
    • 20.删除缓存重试机制
    • 21.读取biglog异步删除缓存
    • 22.在生成 RDB期间,Redis 可以同时处理写请求么?
    • 23.布隆过滤器

Java全技术栈面试题合集地址

Java全技术栈面试题合集地址跳转

Redis篇

1.Redis 的数据类型?

Redis 支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及 zsetsorted set:有序集合)。

String
应用场景:共享session、分布式锁,计数器、限流。
Hash
应用场景:缓存用户信息等。
List
应用场景:消息队列,文章列表
Set
应用场景:用户标签,生成随机数抽奖、社交需求。
Zset
应用场景:排行榜,社交需求(如用户点赞)。
Redis 的三种特殊数据类型

  • Geo:Redis3.2推出的,地理位置定位,用于存储地理位置信息,并对存储的信息进行操作。
  • HyperLogLog:用来做基数统计算法的数据结构,如统计网站的UV。
  • Bitmaps :用一个比特位来映射某个元素的状态,在Redis中,它的底层是基于字符串类型实现的,可以把bitmaps成作一个以比特位为单位的数组

2.Redis 是单进程单线程的?

Redis 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

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

512M, Redis还支持保存多种数据结构,此外单个value的最大限制是1GB.

4.Redis 的持久化机制是什么?各自的优缺点?

  • RDB(Redis DataBase)持久化方式: 是指用数据集快照的方式半持久化模式)记录 redis 数据库的所有键值对,在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。
    优点

    1. 只有一个文件 dump.rdb,方便持久化。

    2. 容灾性好,一个文件可以保存到安全的磁盘。

    3. 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis的高性能)。

    4. 相对于数据集大时,比 AOF 的启动效率更高。
      缺点

    5. 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)。

  • AOF(Append-only file)持久化方式: 是指所有的命令行记录以 redis 命令请求协议的格式完全持久化存储)保存为 aof 文件。
    优点

    1. 数据安全,aof 持久化可以配置 appendfsync 属性,有 always,每进行一次命令操作就记录到 aof 文件中一次。
    2. 通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof工具解决数据一致性问题。
    3. AOF 机制的 rewrite 模式。AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)
      缺点
    4. AOF 文件比 RDB 文件大,且恢复速度慢。
    5. 数据集大的时候,比 rdb 启动效率低。

5.redis 过期键的删除策略?

  1. 惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
  2. 定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。

6.Redis 的回收策略(淘汰策略)?

  1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰。
  2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰。
  3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰。
  4. allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰。
  5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰。
  6. no-enviction(驱逐):禁止驱逐数据。

7.为什么 Redis 需要把所有数据放到内存中?

Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 redis 具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘 I/O 速度为严重影响 redis 的性能。在内存越来越便宜的今天,redis 将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

8.Redis 的同步机制了解么?

Redis 可以使用主从同步,从从同步。第一次同步时,主节点做一次 bgsave,并同时将后续修改操作记录到内存 buffer,待完成后将 rdb 文件全量同步到复制节点,复制节点接受完成后将 rdb 镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。

9.Jedis 与 Redisson 对比有什么优缺点?

Jedis 是 Redis 的 Java 实现的客户端,其 API 提供了比较全面的 Redis 命令的支持;Redisson 实现了分布式和可扩展的 Java 数据结构,和 Jedis 相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等 Redis 特性。Redisson 的宗旨是促进使用者对 Redis 的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

10.说说 Redis 哈希槽的概念?

Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。

11.Redis 事务相关的命令有哪几个?

MULTI、EXEC、DISCARD、WATCH

12.Redis key 的过期时间和永久有效分别怎么设置?

EXPIRE 和 PERSIST 命令。

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

Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

14.Redis 最适合的场景?

  1. 会话缓存(Session Cache)
  2. 全页缓存(FPC)
  3. 队列
  4. 排行榜/计数器
  5. 发布/订阅

15.缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级

缓存雪崩 由于原有缓存失效,新缓存未到期间

  1. 可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机
  2. 缓存标记:记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际key的缓存;缓存数据:它的过期时间比缓存标记的时间延长1倍,例:标记缓存时间30分钟,数据缓存设置为60分钟。这样,当缓存标记key过期后,实际缓存还能把旧数据返回给调用端,直到另外的线程在后台更新完成后,才会返回新缓存。

缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空。

  • 将查询结果为null存入redis
  • 添加布隆过滤器

缓存预热
1、直接写个缓存刷新页面,上线时手工操作下;
2、数据量不大,可以在项目启动的时候自动进行加载;
3、定时刷新缓存;

缓存降级
(1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;
(2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;
(3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;
(4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。
缓存击穿 缓存击穿是指在高并发的情况下,当一个缓存失效的同时,大量的请求直接访问数据库,导致数据库压力过大,甚至崩溃。

  • 使用互斥锁或分布式锁:在缓存失效的瞬间,通过互斥锁或分布式锁来保证只有一个线程去访问数据库,其他线程等待该线程从数据库中加载数据并更新缓存后再获取。这样可以避免大量请求同时访问数据库。
  • 添加逻辑过期字段,并不实际过期,当逻辑过期字段到期时,去数据库查询并更新缓存和过期时间。

16.Redis事务

Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的
Redis会将一个事务中的所有命令序列化,然后按顺序执行。
1.redis 不支持回滚“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”, 所以 Redis 的内部可以保持简单且快速。
2.如果在一个事务中的命令出现错误,那么所有的命令都不会执行;
3.如果在一个事务中出现运行错误,那么正确的命令会被执行。
1)MULTI命令用于开启一个事务,它总是返回OK。 MULTI执行之后,客户端可以继续向服务器发送任意多条命令,这些命令不会立即被执
行,而是被放到一个队列中,当EXEC命令被调用时,所有队列中的命令才会被执行。
2)EXEC:执行所有事务块内的命令。返回事务块内所有命令的返回值,按命令执行的先后顺序排列。当操作被打断时,返回空值 nil 。
3)通过调用DISCARD,客户端可以清空事务队列,并放弃执行事务, 并且客户端会从事务状态中退出。
4)WATCH 命令可以为 Redis 事务提供 check-and-set (CAS)行为。 可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行,监控一直持续到EXEC命令

17.RedLock算法

  1. 获取当前时间,以毫秒为单位。
  2. 按顺序向5个master节点请求加锁。客户端设置网络连接和响应超时时间,并且超时时间要小于锁的失效时间。(假设锁自动失效时间为10秒,则超时时间一般在5-50毫秒之间,我们就假设超时时间是50ms吧)。如果超时,跳过该master节点,尽快去尝试下一个master节点。
  3. 客户端使用当前时间减去开始获取锁时间(即步骤1记录的时间),得到获取锁使用的时间。当且仅当超过一半(N/2+1,这里是5/2+1=3个节点)的Redis master节点都获得锁,并且使用的时间小于锁失效时间时,锁才算获取成功。
  4. 如果取到了锁,key的真正有效时间就变啦,需要减去获取锁所使用的时间。
  5. 如果获取锁失败(没有在至少N/2+1个master实例取到锁,有或者获取锁时间已经超过了有效时间),客户端要在所有的master节点上解锁(即便有些master节点根本就没有加锁成功,也需要解锁,以防止有些漏网之鱼)。

18.MySQL与Redis 如何保证双写一致性

  • 缓存延时双删
  • 删除缓存重试机制
  • 读取biglog异步删除缓存

19.延时双删?

  1. 先删除缓存
  2. 再更新数据库
  3. 休眠一会(比如1秒),再次删除缓存。

这个休眠时间 = 读业务逻辑数据的耗时 + 几百毫秒。为了确保读请求结束,写请求可以删除读请求可能带来的缓存脏数据。

20.删除缓存重试机制

因为延时双删可能会存在第二步的删除缓存失败,导致的数据不一致问题。可以使用这个方案优化:删除失败就多删除几次呀,保证删除缓存成功就可以了呀~ 所以可以引入删除缓存重试机制。

  1. 写请求更新数据库
  2. 缓存因为某些原因,删除失败
  3. 把删除失败的key放到消息队列
  4. 消费消息队列的消息,获取要删除的key
  5. 重试删除缓存操作

21.读取biglog异步删除缓存

以mysql为例:

  1. 可以使用阿里的canal将binlog日志采集发送到MQ队列里面。
  2. 然后通过ACK机制确认处理这条更新消息,删除缓存,保证数据缓存一致性。

22.在生成 RDB期间,Redis 可以同时处理写请求么?

Redis提供两个指令生成RDB,分别是 save和bgsave。

  • 如果是save指令,会阻塞,因为是主线程执行的。
  • 如果是bgsave指令,是fork一个子进程来写入RDB文件的,快照持久化完全交给子进程来处理,父进程则可以继续处理客户端的请求。

23.布隆过滤器

布隆过滤器(Bloom Filter)是一种空间效率高、查询速度快的数据结构,主要用于判断一个元素是否可能属于一个集合。它的主要特点是能够高效地判断一个元素是否在集合中,但不能确保元素一定在集合中,也就是可能存在一定的误判。
布隆过滤器的基本原理:

  1. 初始化:使用一个长度为m的比特数组,初始化所有比特位为0。
  2. 哈希函数:选择k个不同的哈希函数,每个哈希函数可以将输入元素映射到比特数组的一个位置。
  3. 插入:对于集合中的每个元素,分别经过k个哈希函数得到k个哈希值,将对应比特数组的位置置为1。
  4. 查询:对于查询元素,同样经过k个哈希函数得到k个哈希值,检查对应比特数组的位置,如果所有位置都是1,则说明元素可能在集合中;如果有任意一个位置为0,则说明元素一定不在集合中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/765224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

maven手动上传的第三方包 打包项目报错 Could not find xxx in central 解决办法

背景: 在Maven私服手动上传了第三方的jar包, 只有jar包, 没有pom文件, 项目在ide中可以正常编译启动,但打包报错无法找到jar包 解决办法: 上传jar包的时候, 点击生成pom. 则打包的时候不会报错

Python判断一个数是否为素数

在Python中&#xff0c;你可以编写一个函数来判断一个数是否为素数。素数是指只有1和它本身两个正因数&#xff08;不包括1本身&#xff09;的自然数。以下是一个简单的示例代码&#xff1a; python复制代码 def is_prime(n): if n < 1: return False if n < 3: return …

pyrealsense2获取保存点云

一、第一种实现代码 Python import sys import cv2 import pyrealsense2 as rs import numpy as np import keyboard import open3d as o3d import osif __name__ "__main__":output_folder output_data/os.makedirs(output_folder, exist_okTrue)pipeline rs.p…

三级数据库技术知识点(详解!!!)

1、从功能角度数据库应用系统可以划分为表示层、业务逻辑层、数据访问层、数据持久层四个层次&#xff0c;其中负责向表示层直接传送数据的是业务逻辑层。 【解析】表示层负责所有与用户交互的功能;业务逻辑层负责根据业务逻辑需要将表示层获取的数据进行组织后&#xff0c;传…

怎样保持SSH长时连接不断开(客户机)

怎样保持SSH连接不自动断开? 一、前言 远程访问服务器的时候&#xff0c;长时间不操作就会断开连接&#xff0c;这让我苦恼不已&#xff0c;因此花了不少时间折腾&#xff0c;因为我用过的很多方法都无效&#xff0c;经过几番测试&#xff0c;找到了一种解决方案。 不过我只…

阅读MySQL知识4

一、MySQL数据库主从同步延迟产生的原因 MySQL的主从复制都是单线程的操作&#xff0c;主库对所有DDL和DML产生的日志写进binlog&#xff0c;由于binlog是顺序写&#xff0c;所以效率很高。 Slave的SQL Thread线程将主库的DDL和DML操作事件在slave中重放。DML和DDL的IO操作…

c# 结构体(Struct)与枚举(Enum)与记录(Record)

结构体(Struct) struct是值类型数据,存储在栈上,原来的值数据一般一般存储单一数据结构定义的数据是记录(存储的数据多). 类也可以存储大量数据,但是类是引用结构,存储在堆上.严谨来说,引用类型的值存储在堆上,引用类型的存储地址存储在栈上. struct的数据成员不能通过初始化器…

鸿蒙:PrefereneceUtil

1、初始化 在EntryAbility.ets中初始化 export default class EntryAbility extends UIAbility {async onCreate(want, launchParam) {// 1.加载用户首选项PreferenceUtil.loadPreference(this.context)hilog.info(0x0000, testTag, %{public}s, Ability onCreate);} } 2、使…

【Centos 轻松一键安装X11 Forwarding,实现无桌面版运行GUI】

#!/bin/bash# 更新系统包索引 echo "更新系统包索引..." sudo yum update -y# 安装X11相关的应用和认证工具 echo "安装X11相关的应用和认证工具..." sudo yum install -y xorg-x11-apps xorg-x11-xauth# 检查和修改/etc/ssh/sshd_config以允许X11转发 ech…

Java中过滤器和拦截器区别

1. 过滤器&#xff08;Filters&#xff09; 过滤器是Servlet规范中的一部分&#xff0c;它用于在请求进入Web应用程序时预处理请求&#xff0c;或在响应离开应用程序前进行处理。过滤器可以作用于请求内容、请求头、响应内容等。过滤器在Servlet容器中运行&#xff0c;并且与S…

Java集合面试题(一)

1. Java 中常用的容器有哪些&#xff1f; 在 Java 中&#xff0c;容器是一种特殊的数据结构&#xff0c;用于存储其他对象。它们可以帮助我们更高效地管理和操作大量的数据。以下是 Java 中常用的几种容器&#xff1a; List&#xff1a;有序集合&#xff08;也是动态数组&…

SpringBoot如何替换启动图标

SpringBoot项目在启动时会出现一个默认的启动图案 . ____ _ __ _ _/\\ / ____ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | _ | _| | _ \/ _ | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) ) |____| .__|_| |_|_| |_\__, | / / / /|_||___//_/_/_/::…

Qt:使用ctrl+z快捷键取消文本框修改

1、使用ctrlz快捷键取消文本框修改 #include <QApplication> #include <QLineEdit> #include <QUndoStack> #include <QVBoxLayout>int main(int argc, char *argv[]) {QApplication a(argc, argv);QWidget window;QVBoxLayout layout(&window);/…

软件架构和基于架构的软件开发方法知识总结

一、软件架构定义 软件架构为软件系统提供了一个结构、行为和属性的高级抽象 软件架构是一种表达&#xff0c;使软件工程师能够&#xff1a; &#xff08;1&#xff09;分析设计在满足所规定的需求方面的有效性 &#xff08;2&#xff09;在设计变更相对容易的阶段&#xff0c;…

题目:异或森林(蓝桥OJ 3400)

问题描述&#xff1a; 解题思路&#xff1a; 一个数也可以看作是一段区间&#xff0c;当该区间的异或和为完全平方数时则符合题意。 我们需要注意枚举的完全平方的上限。 异或前缀和减小时间复杂度。 题解&#xff1a; #include <bits/stdc.h> using namespace std; usi…

vi\vim编辑器详解

vi\vim编辑器介绍 vi\vim是visual interface的简称, 是Linux中最经典的文本编辑器 同图形化界面中的 文本编辑器一样&#xff0c;vi是命令行下对文本文件进行编辑的绝佳选择。 vim 是 vi 的加强版本&#xff0c;兼容 vi 的所有指令&#xff0c;不仅能编辑文本&#xff0c;而…

鸿蒙一次开发,多端部署(九)应用市场首页

本小节将以应用市场首页为例&#xff0c;介绍如何使用自适应布局能力和响应式布局能力适配不同尺寸窗口。 页面设计 一个典型的应用市场首页的UX设计如下所示。 观察应用市场首页的页面设计&#xff0c;不同断点下的页面设计有较多相似的地方。 据此&#xff0c;我们可以将页…

实现不同数据类型的处理——数据类型转换和数据溢出

1.数据类型转换 当需要将整数型数据转换为浮点型数据&#xff0c;比如12转换为12.00&#xff0c;字符串“123”转换为整数类型123&#xff0c;可以通过类型转换来实现。 数据类型转换就是将某一数据类型转换为其他类型的数据。 有些数据转换不需要人工操作&#xff0c;编写相…

python的BBS论坛系统flask-django-nodejs-php

为了更好地发挥本系统的技术优势&#xff0c;根据BBS论坛系统的需求&#xff0c;本文尝试以B/S架构设计模式中的django/flask框架&#xff0c;python语言为基础&#xff0c;通过必要的编码处理、BBS论坛系统整体框架、功能服务多样化和有效性的高级经验和技术实现方法&#xff…

WebClient上载文件——实现将本地文件同步到远端服务器上

问题描述 用户上传产品示例图片到服务器端上&#xff0c;客户端在请求图片资源时&#xff0c;当服务端架设了多个节点的情况下&#xff0c;由于没有负载均衡请求到保存图片资源的服务器&#xff0c;出现图片访问404的问题。 这里保存上传文件时&#xff0c;同时需要将该文件保…