API设计指南

第一、设计原则

  1. 必须使用 TLS(https)
  2. 请求和响应都要带有版本号
  3. 支持缓存
  4. 给每个请求都分配一个 Request-ID
  5. 响应的大小要有限制

第二、请求的设计

  1. 每个请求要有身份验证
  2. 对请求进行限流和限速

第三、响应的设计

  1. 每一个响应都要有合适的状态码
  2. 每个响应至少包含状态码、消息提示和数据体

rpm打包教程

一、安装 rpm-build

yum -y install rpm-build rpmdevtools

二、生成相关目录

rpmdev-setuptree

三、编写 spec 文件:/root/rpmbuild/SPECS/redis.spec


Name: redis
Version: 3.2.8
Release: 1
Vendor: Redis
Summary: GUN Redis X86_64
License: GPL
Source: redis-3.2.8.tar.gz
Group: Redis
URL: https://redis.io/
Packager: mogu
%description
Redis 3.2.8 Server

%pre
useradd redis
mkdir -p /www/redis/6379
echo '
bind 127.0.0.1
port 6379
dir /www/redis/6379
pidfile /www/redis/6379/redis.pid
logfile /www/redis/6379/redis.log
daemonize yes
requirepass 123456
maxmemory 1G
' > /www/redis/6379/redis.conf
chown redis.redis /www/redis

%prep
pkill redis-server
%setup -q
%build
make
%install
make install
%clean
make clean

%files
%defattr (-,root,root)

四、把源码包放在 /root/rpmbuild/SOURCES 目录下

cp redis-3.2.8.tar.gz /root/rpmbuild/SOURCES/

五、开始打包

rpmbuild -bb /root/rpmbuild/SPECS/redis.spec

记一次数据库崩溃记录

今天公司的数据库主服务器突然崩溃,查看错误日志发现有下面这行提示:


key_buffer_size + (read_buffer_size + sort_buffer_size)*max_threads = 32827455 K  bytes of memory

这句话的意思是根据这个公式计算得到的值,是否超过服务器的物理内存,如果超过就说明是参数设置的太高,导致内存不足而崩溃。

所以在配置数据库参数时,要确保上面几个参数的计算结果小于最大内存。

Python获取系统监控参数

系统监控


import os, json

# load
load = os.popen('cat /proc/loadavg').read()

# uptime
uptime = os.popen('uptime').read()

# net
net = os.popen('cat /proc/net/dev').read()

# memory
memory = os.popen('free -m').read()

# tcp
tcp = os.popen('ss -ant | wc -l').read()

# disk
disk = os.popen('df -hli').read()

# iostat
iostat = os.popen('iostat').read()

# data
data = {'load':load, 'uptime':uptime, 'net':net, 'memory':memory, 'tcp':tcp, 'disk':disk, 'iostat':iostat}

send = json.dumps(data)

MySQL压力测试脚本

数据库压测


import mysql.connector, threading

THREAD_NUM = 10
WORKER_NUM = 100

def working():
    conn = mysql.connector.connect(host='192.168.1.12', user='mogu', password='123456', database='blog')
    for i in range(WORKER_NUM):
        cursor = conn.cursor()
        cursor.execute('select * from wp_users where ID = %s', ('1',))
        values = cursor.fetchall()
        cursor.close()
    conn.close()

def main():
    Threads = []
    for i in range(THREAD_NUM):
        t = threading.Thread(target=working, name=str(i))
        t.setDaemon(True)
        Threads.append(t)
    for t in Threads:
        t.start()
    for t in Threads:
        t.join()
    print("main end")

if __name__ == "__main__":
    main()

Redis安全部署

redis默认以root权限运行,非常的不安全,这个方案是把redis的所有权限限制到redis用户上,实现redis的安全部署


# 创建 redis 用户
useradd redis

# 创建目录
mkdir -p /www/redis
chown redis.redis /www/redis

# 创建 redis 服务,端口 6379
iptables -I INPUT -p tcp -m tcp --dport 6379 -j ACCEPT
su redis
mkdir /www/redis/6379
echo '

bind 127.0.0.1
port 6379
dir /www/redis/6379
pidfile /www/redis/6379/redis.pid
logfile /www/redis/6379/redis.log
daemonize yes
requirepass 123456
maxmemory 1G

' > /www/redis/6379/redis.conf

# 启动
redis-server /www/redis/6379/redis.conf

C语言文件操作

一、打开文件

[c]
#include <stdio.h>
#include <stdlib.h>

main(){

	FILE *fp;

	fp = fopen("test", "r");

	if(fp == NULL){
	// 打开操作不成功
	    printf("The file can not be opened.\n");
	    exit(1);
	}

}
[/c]

二、读取文件

[c]

#include <stdio.h>
#include <stdlib.h>

main(){

	int str;
	FILE *fp;

	fp = fopen("test", "r");

	str = fgetc(fp); // 读取一个字符

	if(str != EOF){
		putchar(str);
	}

	fclose(fp);

}

[/c]

三、读取一行

[c]

#include <stdio.h>
#include <stdlib.h>

main(){

	char str[1024];
	FILE *fp;

	fp = fopen("test", "r");

	fgets(str, 1024, fp);

	printf("%s\n", str);

	fclose(fp);

}

[/c]

四、写入文件

[c]
#include <stdio.h>

main(){

	FILE *fp;

	fp = fopen("test", "w");

	fputs("this is test\n", fp);

	fclose(fp);

}
[/c]

五、其他

C语言使用Socket

C语言使用Socket发起HTTP请求

[c]


#include <string.h>
#include <sys/socket.h>
#include <resolv.h>

int request(char *host, int port){

    int sockfd;
    struct sockaddr_in server;
    char buffer[2048];
    char *request = "GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n";

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    server.sin_addr.s_addr = inet_addr(host);

    connect(sockfd, (struct sockaddr*)&server, sizeof(server));

    send(sockfd, request, strlen(request), 0);

    recv(sockfd, buffer, sizeof(buffer), 0);

    close(sockfd);

    printf("%s", buffer);

    return 0;
}

void main(){
    request("219.239.21.42", 80);
}



[/c]

下载源码

C语言字符串函数

C语言字符串函数

复制字符串

strcpy(p, p1)

复制指定长度字符串

strncpy(p, p1, n)

附加字符串

strcat(p, p1)

附加指定长度字符串

strncat(p, p1, n)

取字符串长度

strlen(p)

比较字符串

strcmp(p, p1)

忽略大小写比较字符串

strcasecmp(p, p1)

比较指定长度字符串

strncmp(p, p1, n)

在字符串中查找指定字符

strchr(p, c)

在字符串中反向查找

strrchr(p, c)

查找字符串

strstr(p, p1)

字符串类型转换

strtod(p, p1) 字符串转换 double 类型
strtol(p, p1, base) 字符串转换 long 类型
atoi(p) 字符串转换到 int 整型 
atof(p) 字符串转换到 double 符点数 
atol(p) 字符串转换到 long 整型

字符串类型检查

isalpha() 检查是否为字母字符 
isupper() 检查是否为大写字母字符 
islower() 检查是否为小写字母字符 
isdigit() 检查是否为数字 
isxdigit() 检查是否为十六进制数字表示的有效字符 
isspace() 检查是否为空格类型字符 
iscntrl() 检查是否为控制字符 
ispunct() 检查是否为标点符号 
isalnum() 检查是否为字母和数字 
isprint() 检查是否是可打印字符 
isgraph() 检查是否是图形字符

 

Lua语言

Lua语言

一、变量

local str (局部)
str = nil (全局)

二、数据类型

nil, boolean, number, string, function, userdata, thread, table

三、操作符

==(等于)~=(不等于)>=(大于)<=(小于)and(与) or(或) not(非)

..(连接字符串)#(字符串长度)

四、字符串操作

1   string.upper(argument):将全部字符转换为大写并返回
2   string.lower(argument):将全部字符转换为小写并返回
3   string.gsub(maingString,findString,replaceString):替换
4   string.strfind(mainString,findString):在主字符串中查找 find
5   string.reverse(arg):将输入字符串颠倒并返回
6   string.format(...):返回格式化后的字符串
7   string.char(arg) 和 string.byte(arg):字符转换数值
8   string.len(arg):返回输入字符串的长度
9   string.rep(string,n): 将输入字符串 string 重复 n 次
10  ..:连接两个字符串

五、循环

-- while
while( true )
do
    print("This loop will run forever.")
end 

-- for

六、判断语句

if(a > b)then
    print(a)
else
    print(b)
end

七、数组

-- 定义数组
array = {"Lua", "Tutorial"} 
-- 使用
array[0]
-- 遍历
for key,value in ipairs(array) 
do 
    print(key, value) 
end

八、文件操作

-- 隐式文件描述符 

file = io.open("test.lua", "r")
io.input(file)
print(io.read())
io.close(file) 

file = io.open("test.lua", "a")
io.output(file)
io.write("-- End of the test.lua file")
io.close(file) 

-- 显示文件描述符 

file = io.open("test.lua", "r")
print(file:read())
file:close()

file = io.open("test.lua", "a")
file:write("--test")
file:close()

九、调试

print()

十、变量销毁

str = nil