Java面试题——数据库

本文详细探讨了数据库相关知识,包括jdbc的七个步骤、MyBatis中的#{}与${}区别、MySQL的ACID特性及存储引擎、索引原理与优化。此外,还深入讲解了Redis的持久化策略、单线程运行机制、过期键删除策略、数据类型以及主从复制和哨兵模式,是Java开发者面试必备的参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.jdbc的七个步骤

1.注册驱动

2.获取数据库连接对象

3.获取操作sql语句对象

4.定义sql语句

5.执行sql语句

6.处理结果集

7.释放资源

2.mybatis中#{}和${}传参的区别

使用#{}传参时,sql语句使用的是占位符的方式

使用${}传参时,sql语句使用的是字符串拼接的方式

项目中都使用#{},因为这样可以防止sql注入

3.MySql的ACID是靠什么保证的

ACID值得是数据库事务的四个特性:原子性、一致性、持久性、隔离性

A原子性:由undolog日志保证,他记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql(undolog记录的是反向sql)

C一致性:由其他三大特性保证,程序代码要保证业务上的一致性

I隔离性:由MVCC来保证(多版本控制)

D持久性:由内存+redolog来保证,mysql修改数据同时在内存和redolog记录这次操作,宕机的时候可以从redolog恢复

原子性:一个执行单元中的多条SQL语句,要么同时成功,要么同时失败

一致性:事务的操作前后要求数据的综合保持不变

持久性:事务一旦生效,对于数据库的操作是永久性的

隔离性:多个事务之间是相互隔离的

4.MySql的存储引擎

MySql数据库使用不同的机制存取表文件,包括存储方式、索引技巧、锁定水平等不同的功能,这些不同的技术以及配套的功能称为存储引擎

MyISAM:访问快,不支持事务和外键,不支持行锁,非聚簇索引

InnoDB:MySql5.5+默认存储引擎,支持事务和外键,支持并发,占用磁盘空间大

MEMORY:内存存储,速度快,不安全,适合小量快速访问的数据

5.MySql索引

mysql索引是针对mysql数据库中数据的字段创建的一个用于快速检查的标识

作用:给字段建立索引,可以提高针对该字段进行过滤的sql语句的执行效率

普通索引:针对某一字段直接创建的索引就是普通索引

唯一索引:在创建表时,指定唯一的约束后,也会自动生成一个唯一索引,也可手动创建唯一索引

主键索引、外键索引:在创建表时,指定主键、外键后会自动生成一个主键、外键索引

联合索引:多个字段共同组成一个索引

全文索引:是将存储于数据库中的整本书或整篇文章中的任意信息查找出来的技术。它可以根据需要获得全文中有关章、节、段、句、词等信息,也可以进行各种统计和分析。

规则

1.对查询频次较高且数据量比较大的表建立索引

2.索引字段的选择,最佳候选列应当从where子句的条件中提取

3.使用唯一索引,需要区分当前使用唯一索引的字段是否可以重复,如果可以重复的话,建议使用普通索引

4.索引可以提高效率,但并不是多多益善

缺点

1.维护索引需要消耗数据库资源

2.索引需要占用磁盘空间

3.当对表的数据进行增删改的时候,因为要维护索引,速度会收到影响

6.Mysql锁

概念:MySql中的锁是指在查询期间可以动态添加锁操作保证数据完整性、安全性

按操作分类

读锁:允许所有用户查,不允许其他用户增删改

写锁:允许当前用户增删改查,不允许其他用户增删改查

按粒度分类

表级锁:会锁定整个表,开销小,加锁快,锁定力度大,锁冲突概率高,并发度低,不会死锁

行级锁:会锁定当前行,开销大,加锁慢,锁定力度小,锁冲突概率低,并发度高,会出现死锁情况

按使用方式分类

悲观锁:每次查询数据时都会认为别人会修改,所以查询时加锁

乐观锁:每次查询数据时都认为别人不会修改,但是在更新时会判断一下在此期间别人有没有更新这个数据

7.数据库的优化

1.优化sql语句

针对经常使用在where语句中,做条件过滤的字段,建立索引

少使用*关键字,相当于查询每个字段

少使用like关键字

2.优化数据库结构

数据库的表进行水平拆分:分表存储,负载

数据库的表进行垂直拆分:一对一字段、

8.Redis的持久化RDB和AOF

RDB:RedisDataBase

在指定的时间间隔内将内存中的数据即快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后再替换之前的文件,用二进制压缩存储

优点:

1.整个Redis数据库将只包含一个文件dump.rdb,方便持久化

2.容灾性好,方便备份

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

4.相对于数据集较大时,比AOF效率更高

缺点:

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

2.由于RDB是通过fork子进程来协助完成数据持久化工作的,因此如果当数据集较大时,可能会导致服务器停止服务几百毫秒甚至一秒钟

AOF:AppendOnlyFile

以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录

优点:

1.数据安全,Redis中提供了3种同步策略,即每秒同步、每修改同步和不同步,事实上,每秒同步也是异步完成的,其效率也是非常高的,所差的是一旦系统出现宕机现象,那么这一秒中之内修改的数据将会丢失

2.通过append模式写文件,即使中途服务器宕机也不会破坏已经存在的内容,可以通过redis-check-aof工具解决数据一致性问题

3.AOF的rewrite模式,定期对AOF文件进行重写,以达到压缩的目的,例如增完以后删

缺点

1.AOF文件比RDB文件大,且恢复速度慢

2.数据集大的时候,比RDB启动效率低

3.运行效率没有RDB高

AOF文件比RDB更新频率高,AOF文件比RDB文件更安全也更大

RDB性能比AOF好,如果两个都配置了优先加载AOF

9.Redis是单线程的为什么这么快

Redis基于Reactor模式开发了网络事件处理器,它是单线程的

1.Redis处理操作都是基于内存进行读写,而不是进行磁盘IO

2.核心是基于非阻塞的IO多路复用机制

3.单线程反而避免了多线程频繁上下文切换带来的性能问题

10.Redis的过期键删除策略

惰性过期:只有当访问一个key时,才会判断该key是否已经过期,过期则清除,该策略可以最大化的节省CPU的资源,却对内存非常不友好,极端情况可能出现大量的过期key没有再次被访问,从而不会被清楚,占用大量内存

定期过期:每隔一定时间,会扫描一定数量的数据库中的key,并清除已经过期的key,过期key存放在expires字典中

Redis中同时使用了惰性过期和定期过期两种策略

11.Redis分布式锁

分布式锁,就是控制分布式系统中不同进程共同访问同一共享资源的一种锁的实现。

实现

1.首先利用setnx来保证:如果key不存在才能获取到锁,如果key存在则获取不到锁

2.利用lua脚本来保证操作的原子性

3.同时还要考虑到锁过期,所以需要额外的一个看门狗定时任务来监听锁是否需要续约

看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个数字,程序开始运行后看门狗开始计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗置零,重新开始计数。如果看门狗增加到设定值就认为程序没有正常工作,强制整个系统复位。

12.Redis的数据类型

string(java String):最基本的数据类型,二进制安全的字符串,最大512M。
list(java LinkedList):按照添加顺序保持顺序的字符串列表。
set(java HashSet):无序的字符串集合,不存在重复的元素。
sorted set(zset)(java TreeSet):有序集合,已排序的字符串集合。
hash(java HashMap):key-value对的一种集合。


bitmap:更细化的一种操作,以bit为单位。
hyperloglog:基于概率的数据结构。 # 2.8.9新增
Geo:地理位置信息储存起来, 并对这些信息进行操作   # 3.2新增
流(Stream)# 5.0新增

13.Redis主从复制

http://t.csdn.cn/69wLh

主节点Master有读写权限,从节点slave只有读的权限,所以从节点需要从主节点上拷贝数据,即主从复制

主从复制:是指将一台Redis服务的数据,复制到其他Redis服务器上。前者称为主节点(master),后者称为从节点(slave)。数据的复制是单向的,只能从主节点到从节点。
默认情况下,每一台Redis服务都是主节点,一个主节点可以有多个从节点(也可以没有),但一个从节点只能有一个主节点。

全量复制(全量拷贝)

1.主节点通过bgsave命令fork子进程进行RDB持久化,该过程时非常消耗CPU内存和硬盘的

2.主节点通过网络将RDB文件发送给从节点,对从节点的带宽会带来很大的消耗

3.从节点清空老数据,载入新的RDB文件,这个过程时阻塞的,无法响应客户端的命令

部分复制(增量复制、增量拷贝)

1.复制偏移量:执行复制的双方即主从节点,分别会维护一个复制偏移量offset

2.复制积压缓冲区:主节点内部维护了一个固定长度的,先进先出的队列作为复制积压缓冲区,当主从节点offset的差距过大,超过缓冲区的长度时,将无法执行部分复制,只能进行全量复制

3.服务器运行id(runid):每个Redis节点都有其运行id,运行id由节点在启动时自动生成,主节点会将自己的运行id发送给从节点,从节点会将主节点的运行id存起来,从节点Redis断开重连的时候,就是根据运行ID来判断同步的进度

作用

1,数据冗余,实现数据的热备份,这也是持久化实现的另一种方式。
2,针对单机故障问题,一个节点故障,其他节点可以提供服务,不影响用户使用。实现了快速恢复故障,这也是服务冗余。
3,读写分离,master服务主要用来写,slave服务主要用来读数据。可以提高服务器的负载能力,可以根据需求的变化,添加从节点的数量。
4,负载均衡,同时配合读写分离,由主节点提供写服务,从节点提供读服务,分担服务器的负载。在写少读多的情况下,通过多个从节点分担读负载,能够大大提高Redis服务的并发量和负载。
5,高可用的基石,主从复制是哨兵和集群模式能够实施的基础。

14.Redis哨兵模式

哨兵模式是用于一个分布式系统对主从结构中的每台服务器进行监控,当出现故障时,通过投票机制选择新的master并将所有的salve连接到新的master

步骤

1.监控:监控master和salve,检查master和salve是否正常运行

2.通知:不断的获取master的信息,在各个节点之间共享,当被监控节点出现问题时,向其他哨兵(客户端)发送通知

3.故障转移:断开master与slave连接,选取一个slave作为master,将其他的slave连接新的master,并告知客户端新的服务器地址

选取新master的原则

不要不在线的,不要响应慢的,不要与master断开时间久的

哨兵也是一台redis服务器,只是不提供数据相关服务,通知哨兵的数量配置为单数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值