Java --- 面试题

一、Redis应用场景

1.1、缓存

热点数据(高频查询,但不经常修改和删除的数据)首选redis作为缓存,性能优秀。

案例:如仓储业务中的商品信息,用户从redis的查询商品信息,没有在去数据库中查询。

1.2、分布式锁

在多线程环境下,对共享资源访问的线程问题,需要通过锁的机制实现访问的互斥。

案例:在集群环境下的库存扣减功能,普通方式实现,步骤:①、获取锁:setnx key vlue ②、设置好锁的过期时间:expire key 10 ③、执行业务代码 ④、释放锁:del key

使用redisson来实现分布式锁:①、获取锁 ②、执行业务代码 ③、释放锁

redisson加锁、锁续期、释放锁底层都是通过lua脚本实现的,这样保证了操作的原子性。

redisson的锁为可重入锁。

1.2.1、分布式锁的坑 -- 非原子操作

解决办法:①、将加锁与设置锁的过期时间进行统一操作。②采用lua脚本。

1.2.2、分布式锁的坑 -- 锁未释放

解决办法:锁必须加过期时间。

1.2.3、分布式锁的坑 -- 锁提前释放

解决办法:给锁续期

1.2.4、分布式锁的坑 -- 释放其他线程的锁

解决办法:给每个锁添加唯一的id

1.2.5、分布式锁的坑 -- 大量请求竞争锁失败

解决办法:①、使用自旋锁重试。②、优化业务代码,将执行时间变短。③、进行限流。

1.2.6、分布式锁的坑 -- 主从复制

解决办法:①、红锁机制(不采用) 

1.2.7、分布式锁的坑 -- 锁的性能

解决办法:分段锁(大多数不采用,需要根据场景)

1.2.8、分布式锁的坑 -- 锁可重入性

解决办法:redisson自身实现

1.3、使用场景案例

1.3.1、Token存储

过程:前端发送登录请求给后端,后端生成一个token返回给前端,并存储在redis中。当前端发送请求是携带token需要给跟redis存储中token进行验证,通过才能返回结果给前端。

1.3.2、短信验证码存储

 过程:用户发送获取短信验证码,后端获取并写入redis中,前端用户输入验证码与redis中进行比较。

1.3.3、计数器

如:文章阅读数,视频点赞数等,使用hset类型。

1.3.4、全局唯一ID

主要使用redis自增id的特性。

1.3.5、排行榜

如积分排行榜,英雄战力排行榜。使用zset类型数据。

1.3.6、限流

local key = KEYS[1] --限流KEY(一秒一个)"limit:" + System.currentTimeMillis() / 1000;
local limit = tonumber(ARGV[1]) --限流大小  10local current = tonumber(redis.call('get', key) or "0")
if current + 1 > limit then --如果超出限流大小return 0
else  --请求数+1,并设置2秒过期redis.call("INCRBY", key, "1")redis.call("EXPIRE", key, "15")return 1
end
@Testvoid testLimit() {DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();redisScript.setResultType(Long.class);redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("limit.lua")));for (int i = 0; i < 112; i++) {String key = "limit:" + System.currentTimeMillis() / 1000; // limit:1705664721Long result = stringRedisTemplate.execute(redisScript, Arrays.asList(key), String.valueOf(100));if (result == 0) {//需要限流System.out.println("限流了......");}}}

1.3.7、购物车

 使用hset类型实现

1.4、缓存穿透

 原因:用户访问一个不存在的数据,而redis就会去请求后端数据库,当这种大量不存在的数据访问,导致redis频繁去查询后端数库以至于后端数据库崩溃。

解决办法:①、缓存空结果,将所有查询的数据都存在redis的缓存中,减少对数据库的查询,优点:实现简单。缺点:会导致redis的内存被大量占用,出现缓存与数据库不一致的情况。

②、布隆过滤器。优点:不会缓存无效数据,缺点:实现比较复杂,存在一定误判。

1.4.1、布隆过滤器

使用方案:在用户请求reids缓存之前,先经过布隆过滤器,经过筛选在去查询redis缓存。

原理:布隆过滤器主要使用一个很长的二进制数组,在由一系列hsah函数来确定请求数据是否存在于该集合中。

案例:布隆过滤器BloomFilter

 缓存预热+雪崩+穿透+击穿

1.5、缓存击穿

原因:在高并发条件下,对于热点数据,当热点数据失效的瞬间,或刚开始还没有对热点数据进行缓存,所有请求都被发送到数据库去查询,数据库就会崩溃。

解决办法:①、使用全局锁:在访问数据库之前都先请求全局锁,获取锁的线程才有资格去访问数据库,其他线程必须等待。由于现在的业务都是分布式的,本地锁没法控制其他服务器的线程等待,所以要用全局锁。如分布式锁。

②、热点数据,设置不过期时间。实现方式一:redis中的热点key不设置过期时间,缺点:缓存热点数据是静态的,得不到更新。实现方式二:给热点key设置一个逻辑过期时间得字段,跟逻辑删除思路一致。

1.6、缓存雪崩

原因:①、由于大量得key或整个缓存数据全部过期,同时又有大量请求访问这些过期缓存而导致请求落地数据库上,而导致数据库崩溃。②、缓存发生故障,导致大量请求落入到数据库,导致数据崩溃。

解决办法:①、建立高可用得redis集群。②、给不同的key设置不同的过期时间。③、本地缓存+限流或降级,避免数据库被压垮。

1.7、内存使用完怎么办?

 redis7的缓存淘汰策略

1.8、String类型的值最大能放多大数据?

String类型:512MB

List,Set,Hash类型:2^32-1(4294967295) 个元素。

1.9、如何保证数据库与redis的数据一致性?

解决办法:使用缓存双写一致性

 redis7缓存双写一致性

1.10、redis集群最大能部署多少主节点?

redis集群中内置了16384个哈希槽,redis会根据节点数量大致均等的将哈希槽映射到不同节点 

二、Spring 

2.1、Spring容器中的bean是线程安全的吗?

答:不是线程安全的

原因:①、spring容器中的bean默认是singleton单例的,所有线程都共享一个单例bean,因此是存在资源竞争的。②、实际开发中,单例bean一般以无状态的方式来使用,即线程之间的操作不会对bean的成员执行除查询以外的操作,所以这个单例bean也可以说是线程安全的。如c

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

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

相关文章

快速业务建模

一句话故事 培训学院进行新季度招生工作&#xff0c;出计划后教务处审批&#xff0c;教学秘书下发计划&#xff0c;班主任手机名单审核后完成计划 用户故事 角色 时间线 动作为动名词 业务建模 多次建模&#xff0c;模型是否能完成业务

高考填报志愿(选专业),怎样找准自己的兴趣?

在很多的高考报考指南中&#xff0c;第一要点&#xff0c;都会建议我们根据自己的兴趣来选择自己的专业。很多人虽然是依据这条规则&#xff0c;选择了自己大学的专业。却依然在学习的过程中发现&#xff0c;好像自己对这个专业并不是那么的有兴趣。 甚至对专业学习深入了解之…

构建健壮的Java应用:错误处理与日志管理

构建健壮的Java应用&#xff1a;错误处理与日志管理 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java应用程序的开发过程中&#xff0c;错误处理和日志管…

docker部署ClamAV集成java和python实现文件病毒扫描

介绍 官方文档&#xff1a;https://docs.clamav.net/manual/Signatures/DatabaseInfo.html ClamAV 是一个开源的反病毒引擎&#xff0c;它由多个模块组成&#xff0c;负责不同的任务处理。以下是 ClamAV 的主要模块和它们的功能&#xff1a; clamd&#xff1a;clamd 是 Clam…

java通过 notify和 wait 实现线程间的通信

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

【专业英语 复习】第2章 The Internet, the Web, and Electronic Commerce

1. 单选题 (1分) "Wiki" comes from the Hawaiian word for ________.____ A fast B social C small D changeable 正确答案&#xff1a;A 翻译&#xff1a;Wiki来源于夏威夷语中的________。 2. 单选题 (1分) This type of e-commerce often resembles the elec…

WHAT - 高性能和内存安全的 Rust(一)

目录 一、介绍1.1 示例代码1.2 关键特性内存安全零成本抽象&#xff1a;高效性能示例代码&#xff1a;使用迭代器的零成本抽象示例代码&#xff1a;泛型和单态化总结 并发编程&#xff1a;防止数据竞争Rust 并发编程示例Rust 的所有权系统防止数据竞争总结 丰富的类型系统包管理…

2024.06.11校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 美团2025届北斗计划正式启动&#xff08;内推&#xff09; 校招 | 美团2025届北斗计划正式启动&#xff08;内推&#xff09; 2、实习 | 沃尔沃汽车 Open Day & 实习招聘 …

医学记录 --- 腋下异味

逻辑图地址 症状 病因 汗液分泌旺盛&#xff1a;由于天气炎热、活动出汗、肥胖等因素导致汗液分泌旺盛&#xff0c;可引起腋下有异味表现。在这种情况下&#xff0c;建议保持身体清洁&#xff0c;特别是在炎热和潮湿的环境下。可以使用抗菌洗液、喷雾或霜剂来帮助减少细菌滋…

(done) 关于 GNU/Linux API setenv 的实验

写一个下面的代码来验证 #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/types.h>int main() {// 设置环境变量 MY_VAR 的值为 "hello_world"if (setenv("MY_VAR", "hello_world", 1) ! 0…

【数据挖掘】机器学习中相似性度量方法-闵可夫斯基距离

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

Android简单登录界面布局设计

<ImageView android:id“id/yxlg” android:layout_marginTop“12dp” android:layout_marginLeft“80dp” android:layout_width“30dp” android:layout_height“30dp” android:background“drawable/net” /> <TextView android:paddingTop“5dp” andr…

Go 语言学习笔记之数组与切片

大家好&#xff0c;我是码农先森。 数组与切片的区别 在 Go 语言中&#xff0c;数组和切片是两种不同的数据结构&#xff0c;它们之间有以下主要区别。 参数长度&#xff1a; 数组&#xff08;Array&#xff09;&#xff1a;数组的长度是固定的&#xff0c;在创建时就需要指…

微信小程序学习(十三):mobx-miniprogram和miniprogram-computed

1、mobx-miniprogram 1.1 介绍 mobx-miniprogram 是针对微信小程序开发的一个简单、高效、轻量级状态管理库&#xff0c;它基于Mobx状态管理框架实现。 使用 mobx-miniprogram 定义管理的状态是响应式的&#xff0c;当状态一旦它改变&#xff0c;所有关联组件都会自动更新相…

图片覆盖攻击

点击劫持的本质是一种视觉欺骗。顺着这个思路&#xff0c;还有一些攻击方法也可以起到类似的作 用&#xff0c;比如图片覆盖。 一名叫 sven.vetsch 的安全研究者最先提出了这种 Cross Site Image Overlaying 攻击&#xff0c;简称 XSIO。sven.vetsch 通过调整图片的 style 使得…

DVWA-XSS(Stored)-beef

用Low Level来测试beef的使用 beef配置 如果kali没有beef的&#xff0c;进行下载 apt install beef-xss使用 beef-xss # 命令方式启动 beef-xss-stop # 命令方式关闭 systemctl start beef-xss.service #开启beefsystemctl stop beef-xss.service #关闭…

前端 CSS 经典:backface-visibility 属性

前言&#xff1a;backface-visibility 属性可以使反转 180deg 的元素隐藏&#xff0c;使用这个属性实现卡片翻转效果 效果 代码实现 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta http-equiv"X-…

记MySQL事务+消息队列引起的问题

问题描述&#xff1a; 先说一下流程&#xff1a;后端保存前端提交的图表信息&#xff0c;然后发送异步消息到消息队列&#xff0c;由下游服务去处理图表信息。 部署项目到服务器&#xff0c;验证项目功能的时候&#xff0c;出现了以下错误&#xff1a;数据库存在数据。下游服…

C++ 音视频传输

目录 一、概述 二、音视频采集 1、视频采集 2、音频采集 三、音视频编码 四、网络传输 五、音视频解码 六、音视频播放 1、视频播放 2、音频播放 七、音视频同步 1. 时间戳管理 2. 缓冲控制 3. 同步策略 3.1 视频为主 3.2 音频为主 3.3 同步点策略 3.4 缓冲区…

Spring Boot+vue社区养老系统(智慧养老平台)

使用技术&#xff1a; springbootvueMySQL 主要功能&#xff1a; 管理员 登录个人资料密码管理, 用户管理:床位类型管理,床位管理,护工管理,老人管理 咨询登记管理&#xff0c;预约登记管理,老人健康信 息管理,费用管理等功能.护工角色包含以下功能: 护工登录&#xff0c;个…