JAVA面试题大全(十七)

1、redis 是什么?都有哪些使用场景?

Redis是一个开源的,使用ANSI C语言编写,支持网络,可基于内存,可持久化的日志型,key-value数据库。

  • 数据高并发的读写
  • 海量数据的读写
  • 对扩展性要求高的数据

2、redis 有哪些功能? 

  • 数据缓存功能
  • 分布式锁的功能
  • 支持数据持久化
  • 支持事务
  • 支持消息队列

3、redis 和 memcache 有什么区别? 

  • memcache所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
  • redis的速度比memcache快很多
  • redis可以持久化其数据

4、redis 为什么是单线程的? 

因为 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 cpu 又不会成为瓶颈,那就顺理成章地采用单线程的方案了。

关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

而且单线程并不代表就慢。 nginx 和 nodejs 也都是高性能单线程的代表。

5、redis 支持的数据类型有哪些?

Redis支持多种数据类型,这些数据类型使得Redis不仅能够处理简单的键值对存储,还能够实现更复杂的数据结构和用例。以下是Redis支持的主要数据类型:

  1. 字符串(Strings)

    • 基本的数据类型,用于存储字符串数据,如用户信息、配置参数等。
  2. 列表(Lists)

    • 列表中的每个元素都是字符串,列表可以作为队列或者栈使用,支持两端添加或移除元素。
  3. 集合(Sets)

    • 无序集合,元素唯一,可以用于存储唯一性的数据集,支持集合操作如交集、并集、差集等。
  4. 有序集合(Sorted Sets)

    • 与集合类似,但每个元素都有一个分数(score)与之关联,可以按照分数对元素进行排序。
  5. 哈希(Hashes)

    • 键值对集合,其中键和值都是字符串,类似于某些编程语言中的字典或哈希表,适合存储对象。
  6. 位图(Bitmaps)

    • 可以将字符串作为位数组,每个位可以是0或1,适合用于实现大型的二进制数组。
  7. 超日志(HyperLogLogs)

    • 用于基数统计,可以用于统计独立用户访问量等场景,具有非常低的空间复杂度。
  8. 地理空间(Geospatial)

    • 用于存储地理位置信息,支持查询位置元素和根据距离排序等操作。
  9. 发布/订阅(Pub/Sub)

    • 一种消息队列模式,允许消息的发布者将消息发布到频道,而订阅者可以订阅一个或多个频道来接收消息。
  10. 流(Streams)

    • Redis 5.0引入的新数据类型,用于消息队列(MQ)系统,支持消息的持久化、自动过期删除等特性。

这些数据类型使得Redis非常灵活,可以适用于缓存、消息队列、排行榜、实时分析等多种应用场景。

6、jedis 和 redisson 有哪些区别?

Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。

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

7、redis 支持的 java 客户端都有哪些?

Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

8、怎么保证缓存和数据库数据的一致性?

合理设置缓存的过期时间。

新增、更改、删除数据库操作时同步更新 Redis,可以使用事物机制来保证数据的一致性。

9、redis 持久化有几种方式?

  • RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。
  • AOF(Append Only File):每一个收到的写命令都通过write函数追加到文件中。

10、redis 分布式锁有什么缺陷? 

Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行如果超出了锁的超时时间就会出现问题。

11、redis 如何做内存优化?

Redis的内存优化可以通过多种策略和配置选项来实现,以下是一些常用的内存优化方法:

  1. 内存分配器优化

    • Redis使用特殊的内存分配器如jemalloc来管理内存,这有助于减少内存碎片并提高内存利用率11。
  2. 限制内存大小

    • 使用maxmemory配置指令来限制Redis可以使用的最大内存量。这可以防止Redis消耗过多服务器内存13。
  3. 内存淘汰策略

    • 通过maxmemory-policy指令设置内存淘汰策略,如LRU(最近最少使用)或TTL(生存时间)策略,当达到内存上限时Redis将自动淘汰数据14。
  4. 使用合适的数据结构

    • 根据业务需求选择合适的数据结构,因为不同的数据结构在内存使用上可能存在显著差异15。
  5. 键值对优化

    • 优化键(key)和值(value)的大小,较短的键和较小的值可以减少内存占用14。
  6. 使用整型

    • 当可能时,使用整型而不是字符串类型存储数值,这样可以节省内存13。
  7. 共享对象

    • Redis允许共享一些对象,如小整数,可以通过调整REDIS_SHARED_INTEGERS参数来增加共享对象的数量,从而节省内存13。
  8. 内存回收策略

    • 利用Redis的惰性删除和定时删除策略来管理过期键值对的内存回收14。
  9. 客户端缓冲区优化

    • 监控并优化客户端缓冲区的大小,避免因客户端消费不及时导致的内存占用14。
  10. 禁用THP(Transparent Huge Pages)

    • 在Linux系统上,禁用THP特性可以减少内存页的合并,从而降低内存占用13。
  11. 使用物理机而非虚拟机

    • 在物理机上运行Redis可以避免虚拟化带来的额外内存开销13。
  12. 代码层面优化

    • 在代码层面,优化对Redis的访问模式,比如减少不必要的缓存键,合理设置键的过期时间等。
  13. 监控和分析

    • 使用工具监控Redis的内存使用情况,并定期分析内存使用模式,以便进行调整。

通过这些方法,可以有效地优化Redis的内存使用,提高其性能和稳定性。

12、redis 常见的性能问题有哪些?该如何解决?

Redis是一种高性能的内存数据库,但在使用过程中可能会遇到一些性能问题。以下是一些常见的Redis性能问题及其解决方案:

  1. 内存使用过多

    • 合理设计Key,避免使用过多的Key,可以通过合并多个Key或使用更简洁的Key来减少内存使用27。
    • 定期删除无用数据,通过设置合适的过期时间或使用Lua脚本定期删除无用数据,可以有效控制Redis内存使用27。
  2. 配置不当

    • 调整内存分配策略,根据实际需求调整maxmemorymaxmemory-policy参数,控制内存使用27。
    • 优化网络设置,调整timeouttcp-backlog等网络参数,提高网络性能27。
  3. 处理大数据集的性能问题

    • 使用集群,通过将数据分散到多个Redis节点上,可以提高处理大数据集的能力27。
    • 优化数据结构,选择适合场景的数据结构,如使用有序集合(sorted set)替代列表(list)来优化排序操作27。
  4. Redis自身限制

    • 升级硬件,通过升级服务器硬件,如增加内存、使用更快的CPU和磁盘等,可以提高Redis的性能27。
    • 优化操作系统设置,调整操作系统的相关参数,如文件描述符数量、网络参数等,以适应Redis的需求27。
  5. 内存碎片问题

    • 如果使用的是Redis 4.0版本以上,可以通过配置开启自动内存碎片整理来解决26。
    • 内存碎片整理的参数配置需要根据实际情况进行调整,以降低碎片整理期间对Redis性能的影响26。
  6. 集中过期key导致的问题

    • 增加随机过期时间,把集中过期的时间打散,降低Redis清理过期key的压力26。
    • 开启lazy-free机制,当删除过期key时,把释放内存的操作放到后台线程中执行,避免阻塞主线程26。
  7. 使用Swap导致性能下降

    • 增加机器的内存,让Redis有足够的内存可以使用。
    • 整理内存空间,释放出足够的内存供Redis使用,然后释放Redis的Swap,让Redis重新使用内存26。
  8. 网络带宽过载

    • 确认占满网络带宽的Redis实例,如果属于正常的业务访问,需要及时扩容或迁移实例。
    • 对Redis机器的网络流量增加监控,在网络流量达到一定阈值时提前报警,及时确认和扩容26。
  9. 慢查询问题

    • 尽量避免使用时间复杂度过高的命令,对于数据的聚合操作,放在客户端做26。
    • 执行时间复杂度为O(N)的命令时,保证N尽量小,每次获取尽量少的数据,让Redis可以及时处理返回26。
  10. fork耗时严重

    • 控制Redis实例的内存在合理范围内,尽量在10G以下,因为fork的耗时与实例大小有关26。
    • 合理配置数据持久化策略,例如在slave节点执行RDB备份,并在低峰期执行26。

通过上述措施,可以显著提高Redis的性能和稳定性。需要注意的是,Redis性能优化是一个持续的过程,需要不断地对Redis的使用和配置进行优化。

13、 redis 淘汰策略有哪些?

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

14、redis 怎么实现分布式锁? 

Redis 分布式锁其实就是在系统里面占一个“坑”,其他程序也要占“坑”的时候,占用成功了就可以继续执行,失败了就只能放弃或稍后重试。

占坑一般使用 setnx(set if not exists)指令,只允许被一个程序占有,使用完调用 del 释放锁。

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

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

相关文章

【机器学习】SUTRA引领多语言处理

在人工智能的浪潮中,自然语言处理(NLP)技术一直是备受瞩目的焦点。随着全球化和信息时代的到来,多语言处理能力成为了评估NLP技术优劣的重要标准。近期,一款名为SUTRA的多语言大型语言模型架构引起了业界的广泛关注。它…

【Linux】线程操作

文章目录 前言一、线程相关操作函数1. pthread_create2. pthread_join3. pthread_exit4. pthread_cancel5. pthread_detach6. 示例代码 前言 在 Linux 中并不存在真正意义上的线程, 而是通过复用进程的结构来实现的, 叫做轻量级进程. 线程是一个进程内部的一个执行流, 而一个进…

521源码-免费游戏源码下载-闯梦江湖Q萌复古全网通手游服务端H5全攻略

闯梦江湖H5:Q萌复古全网通手游服务端全攻略 一、概述 闯梦江湖H5 是一款结合Q萌画风与复古情怀的全网通H5手游。我们为您提供了最新打包的Windows服务端,并附带了通用视频架设教程和GM网页授权后台工具,让您轻松搭建并管理自己的游戏世界。 …

40、Flink 的窗口延迟数据处理(Allowed Lateness)详解

Allowed Lateness a)概述 在使用 event-time 窗口时,数据可能会迟到,即 Flink 用来追踪 event-time 进展的 watermark 已经越过了窗口结束的 timestamp 后,数据才到达。 默认,watermark 一旦越过窗口结束的 timesta…

Kubernetes中的节点选择方法

在Kubernetes集群中,节点选择是一个重要的环节,它决定了Pod将被调度到哪个节点上运行。Kubernetes提供了多种节点选择的方法,以满足不同的部署需求和资源优化。本文将介绍Kubernetes中的几种节点选择方法,并附带相关代码示例。 目…

为什么SQL执行计划未使用创建的索引呢?MySQL是如何选择索引的?

在实际工作中,大家可能会遇到这个问题:MySQL并没有按照自己的预想来选择索引,比如创建了索引但是选择了全表扫描,这肯定是 MySQL 数据库的 Bug,或者是索引出错了。真相真的是MySQL出错了吗?当然不是。主要是因为索引中的数据出了错。 为什么这么说呢?要理解这个问题,要…

python技巧梳理

背景 在开发中,经常会遇到,同时存在多个值,依次判断上述值,选择第一个非空、True的值作为整个表达式的值进行返回,这个时候会用到or这个关键词,下面讲一下用法。 方法 value1 None value2 0 value3 H…

斯洛文尼亚普利雅玛城堡:吉尼斯世界纪录认证的世界最大溶洞城堡

除了著名的波斯托伊纳溶洞(Postojna Cave),普利雅玛城堡(Predjama Castle)也是波斯托伊纳洞穴公园(Postojna Cave Park)不容错过的景点之一。这座城堡坐落在斯洛文尼亚(Slovenia&…

什么是数字化转型?企业数字化转型的核心重点有哪些?

一、什么才是真正的数字化转型? 虽然很多企业管理者已经就企业数字化逐步达成了较为广泛的共识,但根据业界的调查结论,不少企业管理者仍然缺乏紧迫感和行动力,反应迟缓。 导致这些情况的本质原因:主要还是因为企业管…

【编译原理】LR(0)分析

一、实验目的 LR(0)分析法是一种移进归约过程,能根据当前分析栈中的符号串,同时也不用向右查看输入串的符号就可唯一确定分析器的动作。通过对给定的文法构造LR(0)分析表和实现某个符号串的分析掌握LR(0)分析法的基本思想。 二、实验要求 实现LR(0)分…

用(华为)三层交换技术解决不同vlan间通信问题

用三层交换技术解决不同vlan间通信问题 一、网络拓扑: 二、配置思路:自下而上配置 1.PC端配置基本IP信息包括网关 2.接入交换机S1上划分三个vlan,分别是VLAN 10 VLAN 20 VLAN 30 并且将对应的接口加入指定的vlan 3.给接入交换机配置trunk链路…

IT技术 | 电脑蓝屏修复记录DRIVER_IRQL_NOT_LESS_OR_EQUAL

我的台式机是iMac 2015年的,硬盘是机械的,时间久了运行越来越慢。后来对苹果系统失去了兴趣,想换回windows,且想换固态硬盘,就使用winToGo 搞了双系统,在USB外接移动固态硬盘上安装了win10系统。 最近&…

SpringBoot 配置全局异常统一处理

【1】创建全局异常的类 BusinessException Slf4j public class BusinessException extends RuntimeException {/*** 错误码*/private int code;public int getCode() {return code;}/*** param message*/public BusinessException(String message) {super(message);this.code …

C++ 虚函数和纯虚函数

虚函数 #include <iostream> using namespace std; class Vehicle //交通工具 { public:void run() const{cout << "run a vehicle. " << endl;} }; class Car : public Vehicle //汽车 { public:void run() const{cout << "run a c…

Android studio版本和Android gradle plugin版本对应表

1.Android studio 版本的升级&#xff0c;一个方面上看主要是升级对AGP最高版本的支持 2.那为什么AGP要出高版本呢&#xff0c;主要支持高版本的API&#xff0c;真是一环扣一环

将YOLO格式数据集转换为YOLO-Mamba等特定工具指定的数据集格式

目录 克隆Github YOLO-Mamba源码YOLO-Mamba数据集格式下载的公开数据集目录边界框坐标文件类别标签文件 数据集格式转换代码转换格式的效果展示 今天为大家解析YOLO-Mamba这篇论文开源的代码&#xff0c;首先讲解YOLO格式数据集转换为YOLO-Mamba等特定工具指定的数据集格式的操…

C++聚合类型初始化

如果你的代码中没有定义构造函数&#xff0c;而你依然能够成功编译和运行 String a("Hello");&#xff0c;那么你可能使用的是一个支持聚合初始化的编译器版本。这种情况下&#xff0c;C 标准允许聚合类型使用这种形式的初始化&#xff0c;但这仅在特定条件下有效。 …

GoogLeNet论文解读—Going deeper with convolutions2015(V1)

GoogLeNet论文解读—Going deeper with convolutions2015 说明&#xff1a;本文只解读GooleNet的14年参赛的v1版本&#xff0c;之后的改进版本可能在日后的学习中继续更新 研究背景 更深的卷积神经网络 认识数据集&#xff1a;ImageNet的大规模图像识别挑战赛 LSVRC-2014&…

Java面试八股之Thread类中的yeild方法有什么作用

Thread类中的yeild方法有什么作用 谦让机制&#xff1a;Thread.yield()方法主要用于实现线程间的礼让或谦让机制。当某个线程执行到yield()方法时&#xff0c;它会主动放弃当前已获得的CPU执行权&#xff0c;从运行状态&#xff08;Running&#xff09;转变为可运行状态&#…

快速失败“fail-fast”和安全失败“fail-safe”

目录 快速失败——fail-fast 异常原因 正常原因 安全失败“fail-safe” 快速失败——fail-fast java的快速失败机制是java集合框架中的一种错误检测机制&#xff0c;当多个线程对集合中的内容进行修改时可能就会抛出ConcurrentModificationException异常。不仅仅在多线程状态…