哈喽~,大家好,我是千羽。
下面分享我认识的一位大佬华中科技大学985硕,图森未来暑期实习一面。
pass通过~
- 1、自我介绍
- 2、项目经历
- 3、MySQL如何解决分布式的主从复制(binlog半同步复制)
- 4、redis如何实现持久化
- 5、算法:给定n个任务,每个任务的执行时间都为1小时,但现在由于机械出现了故障,导致所有的任务延后了k个小时执行,costs[i]表示原定于第i个小时执行的任务延后一小时的损失。现在,需要重新规划任务流程,规定现在的执行时间不能早于原定的执行时间。返回最小损失
- 6、给定一个数组arr,和一个长度k,我们可以将数组分隔为多个长度最大为k的子数组,在完成分隔后,子数组内所有值都会变为子数组中元素的最大值。返回最好的分隔方法下,数组元素之和
- 7、反问环节(做什么,技术栈,实习时间)
1、自我介绍
略
2、项目经历
略
3、MySQL如何解决分布式的主从复制(binlog半同步复制)
MySQL的分布式主从复制通常是通过以下步骤解决的:
- 设置主库(Master)和从库(Slave):选择一个数据库服务器作为主库,其他数据库服务器作为从库,从库会复制主库的数据。
- 初始数据同步:在开始复制之前,从库需要获取主库的数据。可以通过使用mysqldump工具或直接在主库上进行逻辑备份来完成这一步。
- 配置主库(Master):在主库上编辑my.cnf文件(或my.ini文件),添加以下配置:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_do_db = your_database_name
这些配置将启用二进制日志(binlog),并指定日志文件的位置以及要复制的数据库名称。
- 配置从库(Slave):在每个从库上编辑my.cnf文件,添加以下配置:
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin.log
log_bin = /var/log/mysql/mysql-bin.log
read_only = 1
这些配置将启用中继日志(relay log),并指定日志文件的位置。此外,将server-id设置为唯一的值,以避免冲突。read_only选项将限制从库只能进行只读操作。
- 在从库上启动复制:在从库上执行以下命令:
CHANGE MASTER TO MASTER_HOST='master_ip_address', MASTER_USER='replication_user', MASTER_PASSWORD='replication_password', MASTER_LOG_FILE='mysql-bin.XXXXXX', MASTER_LOG_POS=XXXX;
START SLAVE;
替换master_ip_address为你的主库IP地址,replication_user和replication_password为你的复制用户名和密码,mysql-bin.XXXXXX为主库当前的二进制日志文件名,XXXX为主库当前的二进制日志位置。
- 检查复制状态:在从库上执行以下命令来检查复制状态:
SHOW SLAVE STATUSG;
检查结果中的Slave_IO_Running和Slave_SQL_Running应为Yes,表示复制已经成功启动。
- 维护复制:定期检查复制状态,确保从库与主库保持同步。如果需要调整复制设置,可以在从库上执行相应的SQL命令。
通过以上步骤,你可以实现MySQL的主从复制并解决分布式环境中的数据同步问题。如有需要,可以添加更多的从库或调整复制设置以适应你的需求。
4、redis如何实现持久化
Redis提供了两种持久化方法:RDB(Redis DataBase)和AOF(Append Only File)。
- RDB持久化:
- 如果在生成快照期间,服务器宕机,那么会丢失这段时间的数据;
- 对于大型数据集,RDB可能会占用大量的磁盘空间。
- 生成数据的快照,可以用于备份;
- 通常比AOF启动更快,因为AOF需要先进行载入再进行解析和同步。
- 在指定的时间间隔内,如果至少有一条写命令被送到服务器,那么Redis就会记录当前的数据库快照到一个磁盘文件上。这个文件通常被称为dump.rdb。
- 当Redis需要持久化时,它会fork出一个子进程,子进程会将数据写入一个临时文件。当持久化过程完成后,Redis将替换旧的快照文件为这个临时文件。
- RDB的优点是:
- RDB的缺点是:
- AOF持久化:
- 如果在写入追加日志文件期间服务器宕机,那么会丢失这段时间的数据;
- AOF启动需要的时间比RDB启动的时间要长。
- 每次只写入一条命令,因此更为可靠;
- 对于大型数据集,AOF通常比RDB占用更少的磁盘空间。
- Redis记录服务器接收到的所有写操作命令到一个追加日志文件(append only file)中。在Redis启动时,会通过载入这个追加日志文件来重建数据集。
- AOF持久化的默认配置是每秒写一次追加日志文件,或者当接收到新的写命令时也会立即追加到日志文件。当然这个是可以配置的。
- AOF文件的恢复过程比RDB更慢,但可以保证数据的完整性,并且可以避免因为数据写入磁盘而造成的性能损失。
- AOF的优点是:
- AOF的缺点是:
5、算法:给定n个任务,每个任务的执行时间都为1小时,但现在由于机械出现了故障,导致所有的任务延后了k个小时执行,costs[i]表示原定于第i个小时执行的任务延后一小时的损失。现在,需要重新规划任务流程,规定现在的执行时间不能早于原定的执行时间。返回最小损失
这道题可以用动态规划来解决。我们可以定义一个数组dp,其中dp[i]表示在i小时结束之前完成所有任务的最小损失。对于每个任务,我们都有两种选择:
- 在i小时执行任务:这种情况下,我们需要支付costs[i],并且后面的任务都会延后1小时执行。因此,后面的任务的损失也会增加。所以,在i小时执行任务的损失为costs[i] dp[i 1]。
- 不在i小时执行任务:这种情况下,后面的任务可以按照原定的时间执行。因此,在i小时不执行任务的损失为dp[i]。
我们需要选择这两种情况中的较小值作为dp[i]的值。最终,dp[n]就是我们的答案,表示在n小时结束之前完成所有任务的最小损失。
以下是Python代码实现:
代码语言:javascript复制def min_loss(costs, n, k):
dp = [0] * (n 1)
for i in range(1, n 1):
for j in range(i 1, n 1):
dp[j] = max(dp[j], dp[i] costs[i - 1] min(dp[j], dp[j - 1]))
return dp[n]
其中,costs是一个长度为n的数组,表示每个任务延后一小时的损失。n表示任务的个数,k表示所有任务延后的总小时数。注意,这里我们将任务的执行时间都假设为1小时,因此k表示延后的总小时数。
6、给定一个数组arr,和一个长度k,我们可以将数组分隔为多个长度最大为k的子数组,在完成分隔后,子数组内所有值都会变为子数组中元素的最大值。返回最好的分隔方法下,数组元素之和
这道题可以使用贪心算法来解决。具体思路如下:
首先将数组arr按照长度k进行分隔,得到多个子数组。
对于每个子数组,将其中的元素取最大值,并将所有子数组中的最大值记录下来。
对于所有子数组中的最大值,取其中最小的一个作为整个数组arr的最大值。
返回所有子数组中的元素之和与原数组arr的元素之和的差值。
具体实现代码如下:
代码语言:javascript复制def maximize_sum(arr, k):
# 将数组arr按照长度k进行分隔,得到多个子数组
subarrays = [arr[i:i k] for i in range(0, len(arr), k)]
# 对于每个子数组,将其中的元素取最大值,并将所有子数组中的最大值记录下来
max_values = [max(sub) for sub in subarrays]
# 对于所有子数组中的最大值,取其中最小的一个作为整个数组arr的最大值
max_value = max(max_values)
# 返回所有子数组中的元素之和与原数组arr的元素之和的差值
return sum(max_values) - sum(arr)
其中,arr表示原数组,k表示分隔后每个子数组的最大长度。函数返回所有子数组中的元素之和与原数组arr的元素之和的差值。
7、反问环节(做什么,技术栈,实习时间)
略
- 原文链接:https://github.com/warthecatalyst/What-to-in-Graduate-School/blob/main/秋招的面经/华科计科第二人的秋招报告.md