mhy-test01
题目描述
1234567891011121314151617181920地图上有n个格子排成一排,最左边的格子为1,最右边的格子为n。第0秒时,每个格子都有一只史莱姆。第i只史莱姆的跳跃方向用数组a表示。a[i]=0表示史莱姆跳跃的方向是往左。若第 i 秒史莱姆位于格子 x,那么第 i+1 秒史莱姆会跳到格子 x-1 。如果当前史莱姆在格子 ,则下一秒史莱姆将跳出地图。a[i]=1表示史莱姆跳跃的方向是往右。若第 i 秒史莱姆位于格子 x,那么第 i+1 秒史莱姆会跳到格子 x+1 。如果当前史莱姆在格子n,则下一秒史莱姆将跳出地图。米小游想知道第1~n秒,地图上有多少个格子没有史莱姆。输入描述:第一行包含一个整数 n(1 <= n <= 3 * 10^3),表示地图上的格子数量。第二行包含n个整数 a[i](0 <= a[i] <= 1),表示每只史莱姆的跳跃方向输出描述输出包含一行n个整数,用空格隔开,第i个数表示第i秒没有史莱姆的格子数量。输入:31 0 1输出:1 2 3
代码实现:
1234567891011121314151617181920212 ...
Java-Deque
Java Deque是一种结合了普通Queue和Stack的数据结构,实际上就是一个接口,linkedlist和arraydeque都有对这个接口的实现。您可以在 Deque 的头部和尾部添加和删除元素。如果当队列使用就是先进先出,如果是栈就是先进后出
特点:
Java 中的 Deque 是一个接口,它的实现提供了对可变大小数组的支持。所以你有一个数组不受限制的容量,你可以根据你的需要添加新的元素。
Deque 不支持多个线程的当前访问
在没有外部同步的情况下,双端队列不是线程安全的。
数组双端队列中不允许有 Null 元素。
方法:
boolean add(element)添加一个元素到双端队列的尾部。成功时返回 true,如果当前没有可用空间则抛出 IllegalStateException。
addFirst(element)将一个元素添加到 Deque 的头部。
addLast(element)将一个元素添加到双端队列的尾部。
offer(element)在尾部添加一个元素并返回一个布尔值来说明插入是否成功。
offerFirst(element)向头部添加一个元 ...
MySQL-summaryTwo
一条SQL更新语句是如何执行的?上篇说到一条SQL查询语句如何执行,这下说一下一条SQL更新语句如何执行的,其实跟一条查询语句执行过程大差不差,只不过更新流程会涉及两个重要的日志模块:redolog和binlog。
先简单说一下大致流程:客户端连接-连接器权限认证-分析器分析词法和语法-优化器决定执行方案-执行器执行优化后的方案-更新成功。(这里不会走到查询缓存的原因很简单:我们执行的语句是更新,而不是查询,缓存的目的就是能减少磁盘I/O的次数,直接在缓存中找到结果然后返回给客户端。)
下面介绍一下我们的主角:redo log(重做日志)和bin log(归档日志)
redo log:InnoDB引擎特有的日志先讲个故事,如果你是一个小卖部的老板(这时候还没有什么互联网、记账app、备忘录等),假如有人会赊账或者还账,如果人少的话,用**铅笔(注意一下,是用铅笔,后面会说明原因)**写一张便利贴就能搞定,但是人多的话,肯定就需要一个记录赊账/还账的总账本,那么别人来还账/赊账的时候,老板你无疑是两种做法:
直接拿出总账本,找到相关记录进行修改。
先记在便利贴上,等晚上打烊空闲的时候再 ...
MySQL-summaryOne
一条SQL查询语句的执行流程我们先看一下,MySQL的基本示意图,并逐个解析每个部件的作用。
Server层主要包含:连接器,查询缓存,分析器,优化器,执行器
这里提一嘴,查询缓存到MySQL8.0版本开始就被干掉了,具体原因往下看。
连接器:负责客户端和MySQL建立连接,获取权限,维持和管理连接,一般通过mysql -h* -P* -u* -p经过TCP三次握手协议之后,来连接上MySQL
如果用户账号密码不对,就会收到一个Access denied for user的错误,然后客户端结束执行。
如果用户账号密码正确,连接器就会在权限表中查出登录用户的权限,之后用户的所有相关操作都将依赖于刚刚所查询到的连接对应的权限。(如果管理员此时修改了你的权限,也不会影响到你现在的操作,除非重新登录创建连接)
当一个连接长时间处于sleep状态的时候,默认(wait_timeout参数)8小时之后就会自动断开,连接又分为短连接和长连接,如果所有连接都是长连接,可能会导致内存占用太大,从而系统自动把长连接给OOM,一般表现就是MySQL的异常重启了。
原因分析:长连接会导致内存占 ...
web-coursePushErrorSolution
背景重启python服务之后,课表推送服务莫名失效
可能性
调用微信推送接口逻辑有问题
重写推送服务之后,服务部署失败
由于服务器内存资源有限导致推送的时候,处理课表数据的时候,OOM导致进程被干掉了。
解决方案及思路
本地测试了一遍,推送课表服务,发现推送成功,排除第一种可能性
重写推送服务之后,服务部署失败,发现在启动celery服务的时候确实启动失败了,因为通过微信后台的接口调用数据,发现到时间点的时候,即使调用失败也应该有调用接口次数统计,于是重新部署服务并打好了日志,防止后续出错,以便快速找到问题。
排查服务器资源
上python的服务器之后,发现当时部署定时推送服务的时候没有打log(这是一个重大失误,以后一定要打不然很难找到问题的),后面重新部署了一遍,中途遇到了如下问题:
多次nohup同一任务的时候,应该查看此任务进程是否还存在,如果存在就需要kill,否则会服务器后台会挂起多个相同的进程,导致服务器资源浪费,甚至可能导致宕机。。。比如昨天就是nohup多次同一个任务进程,导致资源浪费甚至被干宕机了
等到推送的时候,查看celery打出来的日志,发现,返 ...
Java-Basics
基本类型和包装类型的区别
存放方式:基本数据类型的局部变量存放在Java虚拟机栈中的局部变量表中,基本数据类型的成员变量(未被static修饰)存放在Java虚拟机中的堆中。包装类型属于对象类型,我们知道几乎所有对象实例都存在于堆中。
占用空间:基本数据类型占用空间往往小于对应类型的包装类型
默认值:成员变量中包装类型不赋值就是null,而基本类型有默认值而不是null。
比较方式:对于基本数据类型用==,包装类型用equals方法
包装类型的缓存机制Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。
123456789101112131415161718192021222324252627Integer缓存源码 public static Integer valueOf(int i) { if (i >= IntegerCache.low && i & ...
web-timetableServerDown
业务场景接上次说的服务器宕机排查,最近又出现了一次宕机,发现每次到上课前20min的时候服务器就会直接宕机处理不了
排查原因:第一感觉是服务器磁盘又爆了,但是当时也才清理几天,后面去看top,发现CPU被干爆了、然后赶紧去查一下Java的日志、发现主要都是在调用python的爬虫服务占用了大量的线程,于是再去另一台服务器上面查询python的日志发现因为请求数远远大于python服务器能够承受的压力,所以很多请求一直积压或者处理错误,进一步导致Java调用的时候也会抛出一些异常以及请求超时。
解决思路:每次打开小程序都会默认请求一次拉去最新课表,这样会因为课表请求太大导致的服务器宕机,于是我考虑了课表的以下几个特点来进行了一些优化:
老师调课可能性比较低,完全可以不需要每次都调用py去获取课表
服务器资源有限
小程序可以本地缓存
看到以上三点,毋庸置疑,我采取了小程序本地缓存策略、看看类似于天天课程表、wakeup等相关app都是采取的本地爬虫,爬取课表并存储到本地,并没有实现实时性更新,课表可变性也很低,所以完全可以本地缓存课表。
当用户每次打开小程序本地拉取三次缓存课表之后,再 ...
web-slowSQLSearchOptimize
业务场景:在查询我参与过的说说的时候,拉取速度会直接超时,从而导致根本拉取不出来用户参与过的说说。
查询逻辑优化前的查询逻辑:
如果用户发布了某条说说的二级评论、那么也代表他参与过、此时就会先查到他评论的二级评论的bid、然后通过这个bid查到他评论的一级或对二级评论的评论的bid、最后通过while循环直到查到二级评论所对应的一级评论的targetbid字段,此时的targetbid就是存的那条贴子的唯一id,然后到talk表中拿这个targetbid作为主键查询到对应的说说记录即可。
优化后的查询逻辑:
在评论表中的创建一个masterbid字段代表这条评论对应的贴子的唯一id,然后直接拿着这个masterbid(实际上就是talk表中某条记录的主键)作为条件去talk表里面查询即可
排查过程:优化1:
1、通过对测试数据库,使用explain语句查看我使用的查询的语句是否走的是ALL查询,发现真是的话、确定是没有走或创建索引查询的,
2、去看这个评论表有没有创建索引,发现是没有创建索引的,由于查询语句中where的条件只有一个,所以只需要对target_b ...
微布开发-数据库备份
要定时每天固定时间将MySQL数据库备份成.sql.gz格式的文件,可以使用Linux上的cron作业和mysqldump命令结合使用。
步骤如下:
创建备份脚本:创建一个Shell脚本,例如backup_mysql.sh,并确保该脚本可执行。使用文本编辑器创建并编辑脚本文件,然后添加以下内容:
123456789101112131415161718#!/bin/bash# MySQL数据库连接信息DB_USER="your_username"DB_PASS="your_password"DB_NAME="your_database_name"# 备份文件的保存路径BACKUP_DIR="/path/to/backup/directory"# 生成备份文件名(带有时间戳)BACKUP_FILE="$BACKUP_DIR/backup_$(date +\%Y\%m\%d\%H\%M\%S).sql.gz"# 使用mysqldump命令备份数据库mysqldump -u$DB_USER -p ...