本周ARTS
本周ARTS打卡内容:
- Algorithm 来源 LeetCode30
- Review 分享 Creating a Linux service with systemd
- Tip 分享 流控算法
- Share 分享 多人实时协作的算法和软件实现
Algorithm
Leetcode的30题 所有单词组成的子串
https://leetcode.com/problems/substring-with-concatenation-of-all-words/
解法:
从s = "barfoothefoobarman", words = ["foo","bar"]
中,找出words中所有单词组成的字符串在s中出现的位置。在看到这个问题时,首先想到的是顺着s的每个字母,看其后3个字母组成的单词是否在words中出现,若不出现,则下一个字母,若出现,则再比较其后三位组成的单词是否在words中出现,若没出现,则跳出这次比较,继续下一个字母,依次类推,遇到words中单词全部出现的情况则记录此时的字母位置,继续下一次循环。按照此思路,将words中的单词保存在map中,记录words中单词出现的次数,初始化map。轮询s中的每个字母,比较其后的单词是否出现在words中,若出现不在words中的单词,或words中的单词出现次数比words中记录的多,则不满足条件,退出,重新初始化map,否则记录该字母在s中的位置,具体代码如下:
1 | func findSubstring(s string, words []string) []int { |
Review
本周内容: Creating a Linux service with systemd
本文介绍了如何用systemd创建一个linux service:
创建配置
在/etc/systemd/system/rot13.service
创建文件:
1 | [Unit] |
其中用户需要修改的有User=
,设置真实用户名,和ExecStart=
,设置应用的脚本
启动服务
启动服务:
systemctl start rot13
加入到开机启动:
systemctl enable rot13
配置详解
After=
指在什么服务之后启动,例如After=mysqld.service
表示Mysql运行之后启动。
Restart=
重启策略,可以配置为Restart=always
,表示应用一旦退出,总是重启。Restart=on-failure
,表示如果退出状态不为0,则重启。
RestartSec=
重启前等待的时间,默认是100ms,通过RestartSec=1
表示退出后1ms,立刻重启
需要注意Restart=always
默认10s内失败5次,会放弃重启,该机制是通过两个参数控制的:
1 | StartLimitBurst=5 |
RestartSec
参数对其也有影响,例如RestartSec
设置为3s,那么10s内失败5次永远不会出现。
可以设置StartLimitIntervalSec=0
避免10s内失败5次而放弃的情况。当然将RestartSec
设置大于1s有助于降低应用重启对系统的压力。
StartLimitAction=reboot
定义达到重启失败次数限制后的行为,如此处的重启。
Tip
流控算法
https://leitty.github.io/2019/06/06/Ratelimit/
Share
Hacker News 的一个讨论帖,完整涉及了现有的多人实时协作的算法和软件实现。