面试题整理 3
总结了某公司面试遇到的值得整理记录的面试题,比较侧重于Redis方面。
目录
Redis持久化配置
RDB
AOF
Redis rdb日志文件路径编辑
命令行参数设置
Redis事务
Redis事务介绍
Redis事务阶段
watch监听
Mysql隔离级别
1.READ UNCOMMITTED
2.READ COMMITTED
3.REPEATABLE READ
4.SERIALIZABLE
App登录验签 踢出并保持30分钟不能登录实现方案
Redis磁盘空间满清理冷数据
删除过期的键:
使用LFU算法删除冷门键:
使用volatile-lru或volatile-lfu策略控制过期键的删除:
定期进行数据持久化:
Redis 确定哪些是热key
缓存雪崩
产生原因
影响
防范策略
设置不同的过期时间:
使用热备份:
数据预热:
使用限流和熔断机制:
缓存击穿
产生原因
影响
防范策略
设置热点数据永不过期:
使用互斥锁:
缓存穿透
产生原因
影响
防范策略
缓存空值:
使用布隆过滤器:
来源分组 只要十个分组
一条sql计算两种条件的数量
总结
Redis持久化配置
Redis支持两种持久化方式:RDB(Redis DataBase)和AOF(Append Only File)。
RDB
根据配置定时将内存中的数据快照保存到磁盘的一个压缩二进制文件中。
Redis的redis.conf配置文件中相关的RDB持久化配置参数:
# 是否开启RDB持久化save <seconds> <changes># 例如,如下配置表示900秒内至少1个键被修改则触发保存save 900 1# RDB文件名dbfilename dump.rdb# RDB文件和AOF文件的保存位置dir /path/to/your/redis/directory# 是否在导出.rdb文件时使用LZF压缩rdbcompression yes
AOF
每个写命令都通过append操作保存到文件中。
Redis的redis.conf配置文件中相关的AOF持久化配置参数:
# 是否开启AOF持久化appendonly yes# AOF文件名appendfilename "appendonly.aof"# AOF文件的保存位置dir /path/to/your/redis/directory# AOF文件的更新频率appendfsync everysec# 是否在AOF重写期间对新写操作进行同步no-appendfsync-on-rewrite no# AOF文件大小超过此值时触发重写auto-aof-rewrite-percentage 100auto-aof-rewrite-min-size 64mb
注意:
开启AOF时,appendfsync的设置对性能影响较大,everysec为推荐配置,即每秒同步一次。
Redis rdb日志文件路径编辑
在redis的配置未见redis.conf中可以找到以下配置项:
# 默认的RDB名称dump.rdbdbfilename dump.rdb
可以将dbfilename配置为自定义的RDB名称,例如:
dbfilename mydata.rdb
命令行参数设置
在启动Redis的命令行中,可以使用参数--dbfilename来设置RDB名称,例如:
redis-server --dbfilename mydata.rdb
Redis事务
事务是指一个完整的动作,要么全部执行,要么什么也没有做。Redis 事务不是严格意义上的事务,只是用于帮助用户在一个步骤中执行多个命令。单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
Redis事务介绍
Redis 事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
redis事务的主要作用就是串联多个命令防止别的命令插队。
Redis 在形式上看起来也差不多,MULTI、EXEC、DISCARD
这三个指令构成了 redis 事务处理的基础。
MULTI:用来组装一个事务,从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,redis会将之前的命令依次执行。
EXEC:用来执行一个事务。
DISCARD:用来取消一个事务。
Redis事务阶段
redis事务分2个阶段:组队阶段、执行阶段;
组队阶段:只是将所有命令加入命令队列;
执行阶段:依次执行队列中的命令,在执行这些命令的过程中,不会被其他客户端发送的请求命令插队或者打断。
所有的指令在 exec 之前不执行,而是缓存在服务器的一个事务队列中,服务器一旦收到 exec 指令,才开执行整个事务队列,执行完毕后一次性返回所有指令的运行结果。因为 Redis 的单线程特性,不用担心自己在执行队列的时候被其它指令打搅,可以保证他们能得到的有顺序的执行。
watch监听
WATCH:在执行multi之前,先执行watch key1 [key2 …],可以监视一个或者多个key,若在事务的exec命令之前这些key对应的值被其他命令所改动了,那么事务中所有命令都将被打断,即事务所有操作将被取消执行。
unwatch:取消 WATCH 命令对所有 key 的监视。如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行UNWATCH 了。
Mysql隔离级别
在 MySQL中事务的隔离级别有以下 4 种:
读未提交(READ UNCOMMITTED)
读已提交(READ COMMITTED)
可重复读(REPEATABLE READ)
序列化(SERIALIZABLE)
MySQL 默认的事务隔离级别是可重复读,这4种隔离级别的说明如下。
1.READ UNCOMMITTED
未提交读,该隔离级别的事务可以看到其他事务中未提交的数据。该隔离级别因为可以读取到其他事务中未提交的数据,而未提交的数据可能会发生回滚,因此把该级别读取到的数据称之为脏数据,把这个问题称之为脏读。
2.READ COMMITTED
提交读,该隔离级别的事务能读取到已经提交事务的数据,因此它不会有脏读问题。但由于在事务的执行中可以读取到其他事务提交的结果,所以在不同时间的相同 SQL查询中,可能会得到不同的结果,这种现象叫做不可重复读。
3.REPEATABLE READ
可重复读,是MySQL的默认事务隔离级别,它能确保同一事务多次查询的结果一致。但也会有新的问题,比如此级别的事务正在执行时,另一个事务成功的插入了某条数据,但因为它每次查询的结果都是一样的,所以会导致查询不到这条数据,自己重复插入时又失败(因为唯一约束的原因)。明明在事务中查询不到这条信息,但就是插入不进去,这就叫幻读 (Phantom Read)。
4.SERIALIZABLE
序列化,事务最高隔离级别,它会强制事务排序,使之不会发生冲突,从而解决了脏读、不可重复读和幻读问题,但因为执行效率低,所以真正使用的场景并不多。
App登录验签 踢出并保持30分钟不能登录实现方案
账号密码登录后,通过设置的字符串中取得部分字符串加上通过uniqid函数获得的唯一字符串及随机数字组合成token。设置此token为当前用户的cookie。
并把用户信息数组进行非对称加密处理后返回客户端。
验证是否登录时,客户端需把登录返回的信息进行解密后获取token和用户id及加盐字符串组合后通过hash生成一个签名。并把签名和登录token和用户id组合设置为cookie。通过https协议发送给后端,后端通过相同方式进行验证,以判断请求是否合法及是否登录。
踢出登录:设置用户的状态为禁用,并设置禁止登录的最终时间戳为当前的30分钟后时间戳
Redis磁盘空间满清理冷数据
当Redis的空间满了,需要进行清理工作以确保其正常运行。以下是几种常见的清理方法:
删除过期的键:
Redis支持设置键的过期时间,一旦过期,键会自动被删除。可以使用EXPIRE或PEXPIRE命令设置键的过期时间,或使用TTL命令查看键的剩余过期时间。可以编写一个定时任务来定期检查并删除过期的键。
使用LFU算法删除冷门键:
Redis还支持使用LFU(最近最少使用)算法来删除键,可以在配置文件中设置maxmemory-policy为allkeys-lfu。这样当Redis的内存空间快要满时,会优先删除最近最少使用的键。
使用volatile-lru或volatile-lfu策略控制过期键的删除:
可以在配置文件中设置maxmemory-policy为volatile-lru或volatile-lfu来控制删除过期键时使用的算法。这样Redis会优先删除设置了过期时间的键,以便为新的键腾出空间。
定期进行数据持久化:
可以使用Redis的RDB或AOF持久化方式将数据写入到磁盘上。这样即使Redis的内存空间满了,数据仍然可以从磁盘上读取,避免数据丢失。可以根据实际需求来决定数据持久化的频率和是否进行压缩。
总的来说,清理Redis的空间可以通过删除过期键、使用LRU或LFU算法删除冷门键、控制过期键的删除策略以及进行数据持久化等方式来实现。根据实际情况和需求选择适当的清理方法,以确保Redis的正常运行。
Redis 确定哪些是热key
可以通过分析redis的访问日志或使用redis自带的监控工具来实现。
1.使用info命令获取当前的统计信息,包括所有的key访问次数
2.分析这些信息,找出访问频率高的key
redis-cli info state | grep keyspace
这个命令会列出所有key的访问次数。
然而,redis本身不会跟踪每个key的具体访问频率。
要更具体,需要在应用程序层面进行跟踪,列如通过记录每个key的访问次数。
在应用程序中,通过中间件或拦截器来记录每个key的访问次数,并定期将这些信息发送到后台服务进行统计分析。
缓存雪崩
缓存雪崩是指在某一时刻,大量的缓存数据同时失效,导致大量的请求直接打到数据库上,从而引发数据库的压力激增,可能导致整个系统的崩溃,这种现象被称为缓存雪崩。
产生原因
缓存雪崩通常由于缓存的过期策略或者缓存服务器的故障导致。例如,如果我们将大量的缓存数据设置为在同一时间点过期,那么在这个时间点,这些缓存数据将同时失效,导致大量的请求直接打到数据库上,从而可能引发缓存雪崩。
影响
缓存雪崩的影响是灾难性的。由于大量的请求直接打到数据库上,数据库的压力激增,可能导致数据库崩溃,从而影响整个系统的正常运行。在极端情况下,可能导致整个系统的崩溃。
防范策略
防止缓存雪崩的策略主要有以下几种:
设置不同的过期时间:
通过为每个缓存项设置稍微不同的过期时间,可以避免大量的缓存数据同时失效。
使用热备份:
可以使用热备份的缓存服务器,当主缓存服务器出现问题时,可以立即切换到备份服务器。
数据预热:
在缓存数据过期前,提前将数据加载到缓存中,避免缓存数据的同时失效。
使用限流和熔断机制:
通过限流和熔断机制,可以防止数据库被大量的请求打垮。
缓存击穿
缓存击穿是指一个存在的数据在缓存中过期,导致所有的请求都直接打到数据库,造成数据库短时间内压力过大。这种现象被称为缓存击穿。
产生原因
缓存击穿通常发生在一个热点数据的缓存过期的时候。由于这个数据非常热门,所以在缓存过期的瞬间,大量的请求会直接打到数据库。
影响
缓存击穿会导致大量的请求直接访问数据库,从而增加数据库的负载,可能会导致数据库性能下降,甚至崩溃。
防范策略
防止缓存击穿的策略主要有以下几种:
设置热点数据永不过期:
对于一些访问频率非常高的热点数据,可以设置为永不过期,这样就可以避免因为缓存过期而导致的缓存击穿。
使用互斥锁:
当缓存失效的时候,不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再去load db。这样可以防止大量的并发请求去数据库加载数据。
缓存穿透
缓存穿透是指查询一个数据库中不存在的数据,由于缓存中也没有,所以每次查询都会直接访问数据库。如果有大量此类请求,就会对数据库造成很大压力,这种现象被称为缓存穿透。
产生原因
缓存穿透通常发生在查询一个数据库中不存在的数据时。由于缓存中也没有这个数据,所以每次查询都会直接访问数据库。如果有大量此类请求,就会造成缓存穿透。
影响
缓存穿透会导致大量的请求直接访问数据库,从而增加数据库的负载,可能会导致数据库性能下降,甚至崩溃。
防范策略
防止缓存穿透的策略主要有以下几种:
缓存空值:
即使数据库中没有某个值,也可以在缓存中存储一个空值或特殊标记,这样当查询这个值时,就可以直接从缓存中获取,而不需要访问数据库。
使用布隆过滤器:
布隆过滤器是一种空间效率极高的概率型数据结构,可以用来判断一个元素是否在一个集合中。我们可以将所有可能存在的数据哈希到布隆过滤器中,当查询一个数据时,先判断它是否在布隆过滤器中,如果不在,就可以直接返回,而不需要访问数据库。
来源分组 只要十个分组
SELECT source FROM `service_order` GROUP BY source limit 10;
一条sql计算两种条件的数量
SELECT count(case when to_state = 2 THEN 0 end) as num1, count(case when to_state=0 THEN 0 end) as num2
FROM `service_order`;
总结
这家公司的技术似乎比较擅长Redis领域的技术。
相关文章:
面试题整理 3
总结了某公司面试遇到的值得整理记录的面试题,比较侧重于Redis方面。 目录 Redis持久化配置 RDB AOF Redis rdb日志文件路径编辑 命令行参数设置 Redis事务 Redis事务介绍 Redis事务阶段 watch监听 Mysql隔离级别 1.READ UNCOMMITTED 2.READ COMMITTED …...

数据结构(Java)—— 认识泛型
1. 包装类 在学习泛型前我们需要先了解一下包装类 在 Java 中,由于基本类型不是继承自 Object ,为了在泛型代码中可以支持基本类型, Java 给每个基本类型都对应了一个包装类型。 1.1 基本数据类型和对应的包装类 基本数据类型包装类byteByt…...
处理后的视频如何加上音频信息?
总方案:原来模型对图像进行每帧处理,保留后的视频自然失去了audio信息,因此先用ffmpeg处理得到audio,原输出video加上audio即可,也采用ffmpeg处理。 imageio库用于读取和写入视频文件,并且你正在使用img_cartoon模型处理每一帧图像。然而,这段代码只处理了视频的图像部…...
02LangChain 实战课——安装入门
LangChain安装入门 一、大语言模型简介 大语言模型是利用深度学习技术,尤其是神经网络,来理解和生成人类语言的人工智能模型。这些模型因其庞大的参数数量而得名,能够理解和生成复杂的语言模式。它们通过预测下一个词来训练,基于…...
Python函数中关键字参数、位置参数、默认参数有何不同
在Python中,函数的参数分为三种类型:关键字参数(key arguments)、位置参数(positional arguments)和默认参数(default arguments)。它们的主要区别在于调用时如何传递值,…...

PNG 格式和 JPG 格式都什么时候用
通常我们都知道,如果是针对网络传输或者网站的格式,我们多会使用 PNG 格式。 如果是照片,大部分都是 JPG 格式的。 那么我们网站常用的截图应该保存为什么格式呢? 照片截图 照片截图应该保存为 JPG 格式。 虽然现在我们多存储…...

Qt 练习做一个登录界面
练习做一个登录界面 效果 UI图 UI代码 <?xml version"1.0" encoding"UTF-8"?> <ui version"4.0"><class>Dialog</class><widget class"QDialog" name"Dialog"><property name"ge…...

计算机视觉实验一:图像基础处理
1. 图像的直方图均衡 1.1 实验目的与要求 (1)理解直方图均衡的原理与作用; (2)掌握统计图像直方图的方法; (3)掌握图像直方图均衡的方法。 1.2 实验原理及知识点 直方图均衡化是通过灰度变换将一幅图象转换为另一幅均衡直方图,即在每个灰度级上都具有相同的象素…...
【WebApi】C# webapi 后端接收部分属性
在C#的Web API后端接收部分属性,可以使用[FromBody]特性配合JsonPatchDocument或者Delta来实现。这里提供一个使用JsonPatchDocument的示例。 首先,定义一个模型类:public class User public class User {public int Id {get; set; }...
Java 使用 Redis
Java 使用 Redis 1. 引言 Redis是一个开源的、基于内存的数据结构存储系统,可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串、哈希、列表、集合、有序集合等。由于Redis基于内存,其读写速度非常快,因此被广泛应用于需要高速缓存和实时通讯的场景。…...

【ONE·Linux || 高级IO(二)】
总言 主要内容:多路转接:epoll学习。 文章目录 总言5、多路转接:epoll5.1、相关概念与接口5.1.1、基本函数认识5.1.1.1、epoll_create5.1.1.2、epoll_ctl5.1.1.3、epoll_wait 5.1.2、epoll的工作原理5.1.2.1、准备工作(…...

将 IBM WatsonX 数据与 Milvus 结合使用,构建用于知识检索的智能 Slack 机器人
在当今快节奏的工作环境中,快速轻松地访问信息对于保持生产力和效率至关重要。无论是在 Runbook 中查找特定说明,还是访问关键知识转移 (KT) 文档,快速检索相关信息的能力都可以产生重大影响。 本教程将指导您构建一个…...

2024 网鼎杯 CTF --- Crypto wp
文章目录 青龙组Crypto1Crypto2 白虎组Crypto1Crypto2 朱雀组Crypto2Crypto3part1part2part3part4 青龙组 Crypto1 题目: from Crypto.Util.number import * from secret import flagp getPrime(512) q getPrime(512) n p * q d getPrime(299) e inverse(d,…...

深度学习基础知识-损失函数
目录 1. 均方误差(Mean Squared Error, MSE) 2. 平均绝对误差(Mean Absolute Error, MAE) 3. Huber 损失 4. 交叉熵损失(Cross-Entropy Loss) 5. KL 散度(Kullback-Leibler Divergence&…...
《逆向记录》
这里写自定义目录标题 1.什么是vmp加密VMP加密的工作原理VMP加密的应用场景和优缺点实际应用案例 2.什么是ast混淆3.魔改算法总结 1.什么是vmp加密 VMP加密(Virtual Machine Protection)是一种软件保护技术,旨在通过虚拟化和加密技术来保…...
chatgpt3.5权重参数有多少MB;llama7B权重参数有多少MB
目录 chatgpt3.5权重参数有多少MB llama7B权重参数有多少MB chatgpt3.5权重参数有多少MB 关于ChatGPT 3.5的权重参数占用的存储空间大小,虽然直接给出具体的MB数值可能较为困难(因为这取决于多种因素,如参数表示的精度、是否进行了压缩等),但可以根据其参数量来估算一个…...

ST IoT Wireless 物联网与无线技术 研讨会
一、研讨会背景与目的 ◆ 意法半导体致力于提供可靠且经济实惠的无线连接解决方案,包含Wireless NFC Security & Esim等产品。 ◆ 将智能物体连接到互联网和云,或者从更广泛的意义上说,连接到物联网(IoT)。 ◆ 远程监控、配…...
PHP实现雪花算法生成唯一ID
引言 雪花算法是Twitter开源的分布式ID生成算法,可以产生64位的ID。其中第一位是固定的正数标识,41位用于存储时间戳,剩下的为机器ID和序列号。通过时间戳、机器ID和序列号的组合,确保每个ID都是唯一的。 PHP代码 1、定义雪花算…...

APP的设置页面,应该怎样尽可能减少用户的输入操作呢
一、引言 在当今数字化时代,移动应用程序(APP)已经成为人们生活中不可或缺的一部分。无论是社交娱乐、工作学习还是日常生活,我们都离不开各种 APP 的帮助。而 APP 的设置页面作为用户调整应用参数、个性化定制功能的重要入口&am…...

Node.js:内置模块
Node.js:内置模块 Node.jsfs模块读取文件写入文件__dirname path模块路径拼接文件名解析 http模块创建服务 Node.js 传统的JavaScript是运行在浏览器的,浏览器就是其运行环境。 浏览器提供了JavaScript的API,以及解析JavaScript的解析引擎&a…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...