阿里云设置虚拟内存
问题描述
这两天发现自己的个人网站响应速度特别慢,于是自己就远程连接了一下,发现运行指令也特别慢,然后排查的过程中MySQL居然down了,然后速度一下子就变快了。当我再启动mysql的时候日志中居然提示无法分配内存。
看来是我的学生机内存不够了,毕竟跑了5个微服务加上redis和mysql,还跑了一个博客,真是难为了自己的小服务器。
但是扩容太贵啦,作为一个搞技术的那必然不能先用钱解决问题hhh,于是我运行了
free
命令查看了一下机器的内存,发现阿里云默认不开启虚拟内存。好的……
解决方案
创建虚拟内存磁盘卷
1
2
3使用该命令创建一个4G大小的内存磁盘卷
/swap/swap是一个文件,可以手动创建
[root@izbp1edcr2463nzx31xohgz logs]# dd if=/dev/zero of=/swap/swap bs=1024 count=4194304将磁盘卷转换为虚拟内存卷
1
2转换
[root@izbp1edcr2463nzx31xohgz logs]# mkswap /swap/swap启用虚拟内存服务
1
2启动虚拟内存服务
[root@izbp1edcr2463nzx31xohgz logs]# swapon /swap/swap查看内存使用情况
1
2
3
4
5查看内存使用情况
[root@izbp1edcr2463nzx31xohgz logs]# free -m
total used free shared buff/cache available
Mem: 1839 1668 63 0 107 36
Swap: 4095 80 4015
发现虚拟内存已经被使用了,而且现在访问也不卡了。
Git代码行数统计
问题描述
想统计一个项目到底有多少行代码。
解决方案
在git bash中cd到代码在的目录,然后调用以下命名即可把每个源代码文件行数及总数统计出来:
1
find . "(" -name "*.m" -or -name "*.mm" -or -name "*.cpp" -or -name "*.h" -or -name "*.rss" ")" -print | xargs wc -l
例如查询.java文件的行数
1
find . "(" -name "*.java" ")" -print | xargs wc -l
JavaScript判定字符串是否为JSON
问题描述
毕设中遇到的一个小需求,需要使用JavaScript判断一个字符串是否为Java。
解决方案
只需要使用JSON.parse()方法,看看这个字符串是否可以转换成一个对象,如果可以,说明是一个JSON字符串,如果不可以,则不是一个JSON字符串。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17/**
* 判定是否是JSON
* @param $string
* @returns {boolean}
*/
function isJson($string)
{
try {
if(typeof JSON.parse($string) == 'object')
return true;
return false;
} catch (e) {
console.log(e);
return false;
}
}
JavaScript获取url中的参数
问题描述
同样是毕设中的一个小需求,之前做过,但是忘了,把它记下来。
解决方案
使用正则表达式来解决。
1
2
3
4
5
6//获取url中的参数
function getUrlParam(name) {
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象
var r = window.location.search.substr(1).match(reg); //匹配目标参数
if (r != null) return unescape(r[2]); return null; //返回参数值
}
RedisCluster水平扩容
问题描述
学习RedisCluster集群时留下的一个坑,当时没有想过这个问题。
解决方案
作为主节点进行扩容:
redis-cli --cluster add-node new_host:new_port existing_host:existing:port
重新分配槽位:
redis-cli --cluster reshard 已存在的主机IP:端口
,然后指定槽位数量,然后指定节点分一点槽位给新增的节点,这个参数可以写all,就是每个节点都分一点槽位给他,或者可以写一个或多个确定的nodeId,让这个node分配,输入done结束。作为从节点进行扩容:
redis-cli --cluster add-node new_host:new_port existing_host:existing:port --cluser-slave --cluster-master-id 主节点的nodeId
数据迁移:是跟随槽位自动迁移的。
RedisCluster缩容
问题描述
学习RedisCluster集群时留下的一个坑,当时没有想过这个问题。
解决方案
放弃槽位:
redis-cli --cluster reshard --cluster-from 要迁出节点id --cluster-to 接收槽节点id --cluster-slots 迁出槽数量 已存在节点Ip:端口
删除节点:
redis-cli --cluster del-node host:port node_id
注:先删除从节点,再删除主节点,否则会进行不必要的故障转移。
将一个字符串中的多个连一起的空格变成单个空格
问题描述
项目中遇到的一个需求,需要将例如“aa bb cc dd ee”这样的字符串变为“aa bb cc dd ee”。
解决方案
使用正则表达式可以很好地实现。
1
String test = string.replaceAll("\\s{1,}", " ");
LayUI内置组件请求后端时自动携带Cookie
问题描述
之前是使用Ajax,可以携带Cookie访问跨域的后端。但是LayUI中例如数据表格这样的组件,其Ajax请求是封装好的,那么如何去使它也携带Cookie访问后端接口?
解决方案
给Ajax请求统一设置一个携带cookie的属性,这样LayUI内置的Ajax请求也会携带Cookie访问后端接口。
1
2
3
4
5
6$.ajaxSetup({
// 发送cookie
xhrFields: {
withCredentials: true
}
});
LayUI上传文件前动态添加参数
问题描述
项目需求,需要在上传文件时携带一个参数,如果是使用普通的Ajax上传,这个需求将会非常简单,但是使用LayUI,其将Ajax请求封装了一层,那么如何完成这个需求呢?
解决方案
使用LayUI上传空间中的before回调方法实现。
1
2
3
4
5
6
7
8before:function(obj){
$.each(path,function(index,item){
uploadPath+=item+"/";
});
this.data = {
"uploadPath":uploadPath
}
}
Curl执行Shell脚本并传参
问题描述
自动化运维平台的需求,需要使受托管服务器端使用一个命令即可下载守护进程并且完成部署。整个逻辑是,我们使用Curl命令时,去访问我们服务器上的Shell脚本下载链接,并且下载完毕后自动运行Shell脚本,那么就有一个问题,我们需要识别该服务器是属于哪个用户的,所以我们需要在下载完毕运行脚本时传参给Shell脚本,所以这个命令需要一气呵成地解决这个问题。
解决方案
使用管道解决。
1
curl url地址 |bash -s 参数1 参数2 ...
普通J2EE Maven项目部署在tomcat上,Servlet出现404
问题描述
部署一个基于Maven的J2EE项目时,无法访问Servlet,错误代码404。
解决方案
配置项目属性的Project Facet,将Dynamic Web Module勾选去掉,然后再勾选,生成web.xml,然后选择右边的runtime,勾选服务器。
TreeSet按照自定义规则 对象排序
问题描述
项目需求,需要使用TreeSet实现一个排序的功能,但是参与排序的不是基础类型,而是自定义的对象,如果直接添加对象,会抛出ClassCastException异常,所以需要学习如何让TreeSet按照自定义规则来进行对象排序。
解决方案
定义一个排序类,继承Comparator接口。
1
2
3
4
5
6
7
8
9class MyComparator implements Comparator {
public int compare(Object o1, Object o2) {
Person p1 = (Person)o1;
Person p2 = (Person)o2;
return (p1.score - p2.score);
}
}在构建TreeSet时传入该排序类
1
2
3
4
5
6
7
8public class TreeSetTest2 {
public static void main(String[] args) {
//带自定义排序规则的TreeSet
TreeSet set = new TreeSet(new MyComparator());
}
}使用TreeSet的特性直接进行排序。
1
2
3
4
5
6
7
8
9
10
11
12
13Person p1 = new Person(10);
Person p2 = new Person(20);
Person p3 = new Person(30);
Person p4 = new Person(40);
Person p5 = new Person(50);
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
set.add(p5);
System.out.println(set);