动态规划
最大差值类
121.买卖股票最佳时机
抽象逻辑:在给定的数组中,求最大差值,前提是只能用后面的数减去前面的数。
思路:定义两个变量来维护最大差值max和最小值min,min=数组第一个元素nums[0],在遍历过程中只有两种情况,
- 当前值n大于min,说明是可以计算差值的,max = max(n-min, max),max取二者较大的。
- n小于min,则min=n。
最终遍历结束,max即为最大差值。
抽象逻辑:在给定的数组中,求最大差值,前提是只能用后面的数减去前面的数。
思路:定义两个变量来维护最大差值max和最小值min,min=数组第一个元素nums[0],在遍历过程中只有两种情况,
消息队列常见的问题:如消息什么场景会重复消费,如何解决。什么场景下会丢失,如何解决。
我们以最常用的系统调用 open,打开一个文件为线索,看看系统调用是怎么实现的。这一节我们仅仅会解析到从 glibc 如何调用到内核的 open,至于 open 怎么实现,怎么打开一个文件,留到文件系统那一节讲。
现在我们就开始在用户态进程里面调用 open 函数。
为了方便,大部分用户会选择使用中介,也就是说,调用的是 glibc 里面的 open 函数。这个函数是如何定义的呢?
int open(const char *pathname, int flags, mode_t mode)
在 glibc 的源代码中,有个文件 syscalls.list,里面列着所有 glibc 的函数对应的系统调用,就像下面这个样子:
# File name Caller Syscall name Args Strong name Weak names
open - open Ci:siv __libc_open __open open
另外,glibc 还有一个脚本 make-syscall.sh,可以根据上面的配置文件,对于每一个封装好的系统调用,生成一个文件。这个文件里面定义了一些宏,例如 #define SYSCALL_NAME open。
glibc 还有一个文件 syscall-template.S,使用上面这个宏,定义了这个系统调用的调用方式。
T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)
ret
T_PSEUDO_END (SYSCALL_SYMBOL)
#define T_PSEUDO(SYMBOL, NAME, N) PSEUDO (SYMBOL, NAME, N)
这里的 PSEUDO 也是一个宏,它的定义如下:
#define PSEUDO(name, syscall_name, args) \
.text; \
ENTRY (name) \
DO_CALL (syscall_name, args); \
cmpl $-4095, %eax; \
jae SYSCALL_ERROR_LABEL
里面对于任何一个系统调用,会调用 DO_CALL。这也是一个宏,这个宏 32 位和 64 位的定义是不一样的。
有些业务场景,为了提高查询速度,会将结果存在缓存中,当db数据变化时,将可能出现数据不一致问题。原因有三种:
1.db读写分离,主从延迟
2.时序性
3.原子性
解决方案:
1.强一致性。分布式事务(2pc, 3pc)
2.降低并发时脏数据的概率
3.缩小不一致的时间,保证最终一致性。
又到年末,各团队都开始了年终述职,即绩效参考。说来惭愧,工作了四年多,总共参加了两次述职,但是效果很差,找不到关键点。
年终述职的目的,是要让领导看到你的工作成果,发现你解决问题的思维方式。所以,总结工作亮点、处理问题的细节尤为重要。
总结几点
年终述职一般只有10天左右的时间准备,在这么短的时间,靠回忆很容易遗漏一些不起眼的细节。
所以,在平时就要养成记录的习惯。我倾向于使用思维导图,用时间线或者类型分类记录。
记录内容
举个例子,
主题:创建账号生成默认密码
背景:在做进校业务中,需要在后台导入老师学生信息,创建账号,同时生成默认密码,生成规则是姓的全拼+123456
问题:找了很多提取汉字的拼音的开源包无法区分多音字,就会导致生成的密码并非是老师的姓的拼音。举个例子,有个老师姓曾,通过组件提取的拼音为【ceng】,生成的默认密码是ceng123456,影响老师使用体验。
解决方案:首先想到的是通过技术手段解决,找一个针对中国姓氏的转换包,不过调研一些开源项目后并没有找到。后来经过讨论分析,我们存储的用户名是老师的姓名全拼,这是由学校提供的,基本不会出现错误。于是,在生成默认密码时,将通过转换包生成的拼音来和老师全拼比较
if strings.HasPrefix(username, pinyin) {
return pinyin + "123456"
}
[rd@mark-k8s-log-213-235 mark]$ df -lh
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 7.8G 0 7.8G 0% /dev
tmpfs 7.8G 24K 7.8G 1% /dev/shm
tmpfs 7.8G 928K 7.8G 1% /run
tmpfs 7.8G 0 7.8G 0% /sys/fs/cgroup
/dev/vda1 50G 7.5G 40G 16% /
/dev/vdb1 394G 309G 86G 79% /data
tmpfs 1.6G 0 1.6G 0% /run/user/0
tmpfs 1.6G 0 1.6G 0% /run/user/2000
[rd@mark-k8s-log-213-235 mark]$ du -sh *
3.3M fe-mk-admin-mis
396K fe-mk-h5-student
604K fe-mk-h5-teacher
452K fe-mk-rd-toolmis
1.3M fe-mk-resource-mis
21M fe-mk-teacher-mis
34G markapi
43G mkexam
108M mk-node-export-server
7.3M mkresource
113G mkscanner
4.0G mksmartpen
106M mktag
50G mktiku
75G mktool
18M rewrite
等同于
[rd@mark-k8s-log-213-235 mark]$ du -h --max-depth=1
20M ./fe-mk-teacher-mis
592K ./fe-mk-h5-teacher
106M ./mk-node-export-server
1.3M ./fe-mk-resource-mis
72G ./mktool
3.2M ./fe-mk-admin-mis
7.4M ./mkresource
106M ./mktag
380K ./fe-mk-h5-student
113G ./mkscanner
49G ./mktiku
18M ./rewrite
33G ./markapi
4.0G ./mksmartpen
448K ./fe-mk-rd-toolmis
41G ./mkexam
309G .
unix_timestamp(now())
number, _ := strconv.Atoi(str) //number 为int类型
str := string(rune(number))
int64, err := strconv.ParseInt(string, 10, 64)
string:=strconv.FormatInt(int64,10)
git log 默认时区为UTC,显示时间比本地晚8小时
显示本地时间
git log --date=local