阅读全文 »

git

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
1、解决文件已经添加到暂存区进行回退

git reset HEAD readme.txt(文件) #取消暂存区文件修改
git status #查看当前文件状态
git checkout -- readme.txt #回退到git add之前状态

git log -n10 --oneline #显示最近十次提交日志
git diff old_id new_id --name-status #对比两次提交和文件修改及状态

2、查看git提交日志

git log参数详解:
-p 按补丁格式显示每个更新之间的差异。

--stat 显示每次更新的文件修改统计信息。

--shortstat 只显示 --stat 中最后的行数修改添加移除统计。

--name-only 仅在提交信息后显示已修改的文件清单。

--name-status 显示新增、修改、删除的文件清单。

--abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。

--relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。

--graph 显示 ASCII 图形表示的分支合并历史。

--pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

-(n) 仅显示最近的 n 条提交

--since, --after 仅显示指定时间之后的提交。

--until, --before 仅显示指定时间之前的提交。

--author 仅显示指定作者相关的提交。

--committer 仅显示指定提交者相关的提交。

--grep 仅显示含指定关键字的提交

-S 仅显示添加或移除了某个关键字的提交
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
git log filename #查看filename文件commit记录

git log -p filename #显示每次提交的diff

git log --pretty=format:"%cn committed %h on %cd" #指定日志格式(%cn作者名字,%h缩略标识,%cd提交日期)

git log --author="manson"

git log --pretty="%an - %s" --author=cuibobo --since="2018-10-01" --before="2018-12-27" --oneline #指定格式和日期进行日志查询

git log #命令显示从最近到最远的提交日志,如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline

git reset --hard HEAD^ #用HEAD表示当前版本(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

git reset --hard commit_id #通过commit id来回溯

git reflog #Git提供了一个命令git reflog用来记录你的每一次命令

HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。

穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。

要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

git remote add origin git@server-name:path/repo-name.git #添加远程仓库

git push -u origin master #第一次推送master分支的所有内容;

git push origin master #提交以后,推送最新修改

3、git使用分支

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

4、合并和解决冲突

git log —-graph —-pretty=oneline —abbrev-commit #查看执行日志

git merge abort #放弃合并

git merge —-no-ff -m “描述信息” 分支名 #解决Fast forward删除分支会丢失commit id信息,加-m选项描述信息,因为会产生新commit id

总结:合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

5、解决bug分支前隐藏当前工作目录

工作场景:当前某个分支还未提交,需要解决线上bug:
git stash #把当前工作现场"储藏"起来,然后就可以修改bug

git stash list #查看工作现场

git stash apply #恢复工作现场,恢复以后stash内容不删除,使用git stash drop来删除

git stash pop #恢复工作目录同时并把stash内容也删除

git stash apply stash@{0} #恢复指定stash

6、git log --pretty=format:"%h - %an, %ar : %s"

%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明

-(n) 仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。

git log --pretty="%h - %s" --author=gitster --since="2008-10-01" --before="2008-12-27" --no-merges -- t/
git log --pretty=format:"%cn committed %h on %cd"


7、分支作用

分支策略

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

8、tags创建和推送

git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

git tag -a <tagname> -m "blablabla..."可以指定标签信息;

git tag可以查看所有标签。

git push origin <tagname>可以推送一个本地标签;

git push origin --tags可以推送全部未推送过的本地标签;

git tag -d <tagname>可以删除一个本地标签;

git push origin :refs/tags/<tagname>可以删除一个远程标签
阅读全文 »

正则表达式

基本语法和案列
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
正则就是规则,正则表达式就是能够让我们表达出自己想法的规则

grep命令:
选项详解:
-i 区分大小写匹配
-n 显示行号
--color 或 --color=auto 高亮显示关键字
可以设置别名:alias grep='grep --color=auto'
-c 统计符合条件的总行数,而不打印出行
-o 只显示被匹配到的关键字,而不是讲整行内容都输出,一行匹配多个关键字会换行显示
-B 显示符合条件的行之前的行,“B” 有before之意
-B1 表示显示符合条件的同时还显示之前的1行
-B3 表示显示符合条件的同时还显示之前的3行

-A 和-B恰恰相反,-A有After之意
-w 有word之意,表示搜索的字符串作为一个独立的单词时才会被匹配到
-v 和匹配字符串取反的意思
-q 表示时静默模式,静默模式下grep不会输出任何信息,无论是否匹配到指定字符串,都不会
输出任何字符串,都不会输出任何信息
-E 扩展正则表达式

"^" 在正则中表示锚定行首
"$" 在正则中表示锚定行尾
"^$" 在正则中表示空行

案列:
[root@test-service ~]# grep "^hello" --color test2 #显示已hello开头行
hello world
hello.cbb
hello
[root@test-service ~]# grep -n "^hello" --color test2 #显示已hello开头的行并显示行号
1:hello world
3:hello.cbb
4:hello
[root@test-service ~]# grep -n "^$" --color test2 #显示空行和空行行号
4:
6:

"\<"表示锚定词首,"\>"表示锚定词尾
"\<与\>" 一起使用,也可以使用\b 锚定词首和词尾
案列:
[root@test-service ~]# cat test3
hello world
hi hello111111
hello.cbb

11111hello

[root@test-service ~]# grep --color "\<hello" test3
hello world
hi hello111111
hello.cbb
[root@test-service ~]# grep --color "hello\>" test3
hello world
hello.cbb
11111hello
[root@test-service ~]# grep --color "\<hello\>" test3
hello world
hello.cbb

使用\b 锚定词首和词尾
案列:
[root@test-service ~]# grep --color "\bhello" test3
hello world
hi hello111111
hello.cbb
[root@test-service ~]# grep --color "hello\b" test3
hello world
hello.cbb
11111hello
[root@test-service ~]# grep --color "\bhello\b" test3
hello world
hello.cbb

\B 是用来匹配非单词边界的
案列:
[root@test-service ~]# grep --color "\Bhello" test3 #只要hello不是词首,就会被匹配到,和"\bhello"恰恰相反
11111hello
[root@test-service ~]# grep --color "hello\B" test3 #只要hello不是词尾就匹配
hi hello111111
[root@test-service ~]# grep --color "\Bhello\B" test3 #既不是词首也不是词尾,就匹配
1111hellocbb

总结:
^: 表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配
$: 表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配
^$: 表示匹配空行,这里所描述的空行表示“回车”,而“空格”或"tab"等都不能算此处所描述的空行
^abc$: 表示abc独占一行,会被匹配到
\<h或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现
\B: 匹配非单词边界,与\b 正好相反
正则表达式之分组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
正则表达式之分组:

案列:
[root@test-service ~]# cat test5
abefef
abefefabefef
[root@test-service ~]# grep -n --color "\(abefef\)\{2\}" test5 #{2}是影响括号中一整个字符串
2:abefefabefef
[root@test-service ~]# grep -n --color "\(ab\(ef\)\{2\}\)\{2\}" test5
2:abefefabefef
以上案列中包含了两组分组符号,最外侧的"\( \)"中又包含了另一个"\( \)",这就是分组符号的嵌套

后向引用:
案列:
[root@test-service ~]# cat test6
Hello world Hello
Hiiii world Hiiii

[root@test-service ~]# grep --color "H.\{4\} world H.\{4\}" test6
Hello world Hello
Hiiii world Hiiii

#第三行是新增也匹配
[root@test-service ~]# grep --color "H.\{4\} world H.\{4\}" test6
Hello world Hello
Hiiii world Hiiii
Hello world Hiiii

#后向应用:在原有的基础之上新增分组
[root@test-service ~]# grep --color "\(H.\{4\}\) world \1" test6
Hello world Hello
Hiiii world Hiiii

小结:
"\1"表示引用整个正则中第一个分组中的正则所匹配到的结果
"\2"表示引用整个正则中第二个分组中的正则所匹配到的结果

\(\)表示分组,我们可以将其中的内容当做一个整体,分组可以嵌套
\(ab\)表示将ab当做一个整体去处理

awk 格式化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
主义以下三点:格式化printf和awk中printf不同
1)使用printf动作输出的文本不会换行,如果需要换行,可以在对应的"格式替换符"后加入"\n"进行转义。
2)使用printf动作时,"指定的格式" 与 "被格式化的文本" 之间,需要用"逗号"隔开。
3)使用printf动作时,"格式"中的"格式替换符"必须与 "被格式化的文本" 一一对应

案列:
[root@test-service ~]# awk -F: '{printf "%s\n%s\n%s\n" , $1,$2,$3}' test
root
x
0
bin
x
1

对比以下两个案列不同:
[root@test-service ~]# awk -F: '{printf "%s\n" , $1,$2}' test
root
bin
[root@test-service ~]# awk -F: '{printf "%s\n%s\n" , $1,$2}' test
root
x
bin
x

案列:设置变量指定分隔符
[root@test-service ~]# cat test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@test-service ~]# awk -v FS=':' '{printf "第一列: %s\t 第二列: %s\n" , $1,$2}' test
第一列: root 第二列: x
第一列: bin 第二列: x

[root@test-service ~]# awk -v FS=':' 'BEGIN{printf "%-10s\t %s\n" , "username","userid"} {printf "%-10s\t %s\n" , $1,$2}' test
username userid
root x
bin x
awk 分隔符
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
输入分隔符,英文原文为field separator,此处简称为FS
输入分割符,默认是空白字符(即空格),awk默认以空白字符为分隔符对每一行进行分割。

输出分割符,英文原文为output field separator,此处简称为OFS
awk将每行分割后,输出在屏幕上的时候,以什么字符作为分隔符,awk默认的输出分割符也是空格。

除了使用 -F 选项指定输入分隔符,还能够通过设置内部变量的方式,指定awk的输入分隔符,awk内置变量FS可以用于指定输入分隔符,但是在使用变量时,需要使用-v选项,用于指定对应的变量,比如 -v FS='#'
案列:
awk -F: '{print $1,$2}' test

awk -v FS=':' '{print $1,$2}' test

总结:
而-F,就是options的一种,用于指定输入分隔符
-v也是options的一种,用于设置变量的值

案列:
awk -v FS=':' -v OFS='-----' '{print $1,$2}' test #指定输入和输出分隔符,
-v 选项设置变量意思

在输出的时候,我们想要让两列合并在一起显示,不使用输出分隔符分开显示,该怎么做呢?
案列:
awk '{print $1$2}' test
awk '{print $1 $2}' test
awk 变量
阅读全文 »

软中断

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
top -H -p XX 1 / pidstat -wut -p XX 1   #那个线程占用CPU

perf report -g -p XX 是否可以定位到具体的系统调用函数.

中断:系统用来响应硬件设备请求的一种机制,会打断进程的正常调度和执行,通过调用内核中的中断处理程序来响应设备的请求(中断是一种异步的事件处理机制,用来提高系统的并发处理能力。中断事件发生,会触发执行中断处理程序,而中断处理程序被分为上半部和下半部这两个部分)

上半部对应硬中断,用来快速处理中断

下半部对应软中断,用来异步处理上半部未完成的工作

1.中断是一种异步的事件处理机制,能提高系统的并发处理能力

2.为了减少对正常进程运行进行影响,中断处理程序需要尽快运行。

3.中断分为上下两个部分
(1)上部分用来快速处理中断,在中断禁止模式下,主要处理跟硬件紧密相关的或时间敏感的工作
(2)下部分用来延迟处理上半部分未完成的工作,通常以内核线程的方式运行。

小结:
上半部分直接处理硬件请求,即硬中断,特点是快速执行
下部分由内核触发,即软中断,特点是延迟执行
软中断除了上面的下部分,还包括一些内核自定义的事件,如:内核调度 RCU锁 网络收发 定时等
软中断内核线程的名字:ksoftirq/cpu编号

4.proc文件系统是一种内核空间和用户空间进行通信的机制,可以同时用来查看内核的数据结构又能用了动态修改内核的配置,如:
/proc/softirqs 提供软中断的运行情况
/proc/interrupts 提供硬中断的运行情况```

---
## 进程状态

当iowait升高时,进程很可能因为得不到硬件的响应,而长时间处于不可中断状态。从ps或者top命令的输出中,你可以发现它们都处于D状态,也就是不可中断状态(Uninterruptible Sleep)。
进程状态有哪几种:
R 是Running 或 Runnable 的缩写,表示进程CPU的就绪队列中,正在运行或者正在等待运行

D 是Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程中不允许被其他进程或中断打断

Z 是Zombie的缩写,也就是可中断状态的睡眠,表示进程因为等待某个事件而被系统挂起,当进程等待的时间发生时,它会被唤醒并进入R状态

I 是idle的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上,前面说了,硬件交互导致的不可中断进程D表示,但对某些内核线程会导致平均负载升高,I状态的进程却不会。

T或者t 也就是Stopped和Traced的缩写,表示进程处于暂停或者跟踪状态
向一个进程发送SIGSTOP信号,它就会因为响应这个信号变成暂停状态(Stopped);再向它发送SIGCONF信号,进程又会恢复运行(如果进程是终端里直接启动的,则需要你用fg命令,恢复到前台运行)

X 也是Dead的缩写,表示进程已经消亡,所以你不会再top或者ps命令中看到它

总结:
不可中断状态,表示进程正在跟硬件交互,为了保护进程数据和硬件的一致性,系统不允许其他进程或中断
打断这个进程。进程长时间处于不可中断状态,通常表示系统I/O性能问题

僵尸进程表示进程已经退出,但它的父进程还没有回收子进程占用的资源。短暂的僵尸状态我们通常不必理会
但进程长时间处于僵尸状态,就应该注意了,可能有应用程序没有正常处理子进程的退出

阅读全文 »

1.apk update
$ apk update #更新最新镜像源列表

2.apk search
$ apk search #查找所以可用软件包
$ apk search -v #查找所以可用软件包及其描述内容
$ apk search -v ‘acf*’ #通过软件包名称查找软件包
$ apk search -v -d ‘docker’ #通过描述文件查找特定的软件包

3.apk add
$ apk add openssh #安装一个软件
$ apk add openssh openntp vim #安装多个软件
$ apk add –no-cache mysql-client #不使用本地镜像源缓存,相当于先执行update,再执行add

4.apk info
$ apk info #列出所有已安装的软件包
$ apk info -a zlib #显示完整的软件包信息
$ apk info –who-owns /sbin/lbu #显示指定文件属于的包

5.apk upgrade
$ apk upgrade #升级所有软件
$ apk upgrade openssh #升级指定软件
$ apk upgrade openssh openntp vim #升级多个软件
$ apk add –upgrade busybox #指定升级部分软件包

6.apk del
$ apk del openssh #删除一个软件

阅读全文 »

Redis

Redis 介绍和优点
1
2
3
4
5
6
7
8
9
10
Redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。 Redis开创了一种新的数据存储思路,使用Redis,我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱。

目前多数的NoSql数据库本质上都是键值对形式,Redis也不例外。作为缓存数据库的一种,和Memcached相比,有以下几种主要的优点:

(1)速度上,Redis要比Memcached快,这是基于一些Benchmarks的测试结果得出的,而且在内存使用上,Redis突破了物理内存限制,可以使用虚拟内存;

(2)数据类型比Memcached要多,Redis支持List、Set、SortedSet、HashMap等多种数据结构;

(3)持久化方面,Memcached没有相应的持久化机制,而Redis有RDB快照和AOF日志两种形式结合做持久化,很大限度上保证了数据的持久化和安全性,不像Memcached断电后全都没了。
Redis不失为Memcached的一种良好的替代方案。
Redis Aof 三种同步机制:
1
2
3
always  写一条数据就会刷新到硬盘上(不会丢失数据但是IO开销大)
everysec 每秒一次刷新到磁盘中(最多会丢失一秒数据),默认推荐这种方式
no 根据操作系统来决定 (数据不可控)

Redis 配置详解
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
Redis示例配置文件

注意单位问题:当需要设置内存大小的时候,可以使用类似1k、5GB、4M这样的常见格式:
1k => 1000 bytes

1kb => 1024 bytes

1m => 1000000 bytes

1mb => 1024*1024 bytes

1g => 1000000000 bytes

1gb => 102410241024 bytes

单位是大小写不敏感的,所以1GB 1Gb 1gB的写法都是完全一样的。

Redis默认是不作为守护进程来运行的。你可以把这个设置为"yes"让它作为守护进程来运行。

注意,当作为守护进程的时候,Redis会把进程ID写到 /var/run/redis.pid

aemonize no

当以守护进程方式运行的时候,Redis会把进程ID默认写到 /var/run/redis.pid。你可以在这里修改路径。

idfile /var/run/redis.pid

接受连接的特定端口,默认是6379。

如果端口设置为0,Redis就不会监听TCP套接字。

ort 6379

如果你想的话,你可以绑定单一接口;如果这里没单独设置,那么所有接口的连接都会被监听。

bind 127.0.0.1

指定用来监听连接的unxi套接字的路径。这个没有默认值,所以如果你不指定的话,Redis就不会通过unix套接字来监听。

unixsocket /tmp/redis.sock

unixsocketperm 755

一个客户端空闲多少秒后关闭连接。(0代表禁用,永不关闭)

imeout 0

设置服务器调试等级。

可能值:

debug (很多信息,对开发/测试有用)

verbose (很多精简的有用信息,但是不像debug等级那么多)

notice (适量的信息,基本上是你生产环境中需要的程度)

warning (只有很重要/严重的信息会记录下来)

oglevel verbose

指明日志文件名。也可以使用"stdout"来强制让Redis把日志信息写到标准输出上。

注意:如果Redis以守护进程方式运行,而你设置日志显示到标准输出的话,那么日志会发送到 /dev/null

ogfile stdout

要使用系统日志记录器很简单,只要设置 "syslog-enabled" 为 "yes" 就可以了。

然后根据需要设置其他一些syslog参数就可以了。

syslog-enabled no

指明syslog身份

syslog-ident redis

指明syslog的设备。必须是一个用户或者是 LOCAL0 ~ LOCAL7 之一。

syslog-facility local0

设置数据库个数。默认数据库是 DB 0,你可以通过SELECT WHERE dbid(0~'databases' - 1)来为每个连接使用不同的数据库。

atabases 16

############################### 快照 #################################

把数据库存到磁盘上:

save

会在指定秒数和数据变化次数之后把数据库写到磁盘上。

下面的例子将会进行把数据写入磁盘的操作:

900秒(15分钟)之后,且至少1次变更

300秒(5分钟)之后,且至少10次变更

60秒之后,且至少10000次变更

注意:你要想不写磁盘的话就把所有 "save" 设置注释掉就行了。

ave 900 1

ave 300 10

ave 60 10000



当导出到 .rdb 数据库时是否用LZF压缩字符串对象。

默认设置为 "yes",所以几乎总是生效的。

如果你想节省CPU的话你可以把这个设置为 "no",但是如果你有可压缩的key的话,那数据文件就会更大了。

dbcompression yes


数据库的文件名

bfilename dump.rdb

工作目录

数据库会写到这个目录下,文件名就是上面的 "dbfilename" 的值。

累加文件也放这里。

注意你这里指定的必须是目录,不是文件名。

ir ./

################################ 同步 #################################

# 主从同步。通过 slaveof 配置来实现Redis实例的备份。

# 注意,这里是本地从远端复制数据。也就是说,本地可以有不同的数据库文件、绑定不同的IP、监听不同的端口。

# slaveof

# 如果master设置了密码(通过下面的 "requirepass" 选项来配置),那么slave在开始同步之前必须进行身份验证,否则它的同步请求会被拒绝。

# masterauth

# 当一个slave失去和master的连接,或者同步正在进行中,slave的行为有两种可能:

# 1) 如果 slave-serve-stale-data 设置为 "yes" (默认值),slave会继续响应客户端请求,可能是正常数据,也可能是还没获得值的空数据。

# 2) 如果 slave-serve-stale-data 设置为 "no",slave会回复"正在从master同步(SYNC with master in progress)"来处理各种请求,除了 INFO 和 SLAVEOF 命令。

slave-serve-stale-data yes

# slave根据指定的时间间隔向服务器发送ping请求。

# 时间间隔可以通过 repl_ping_slave_period 来设置。

# 默认10秒。

# repl-ping-slave-period 10

# 下面的选项设置了大块数据I/O、向master请求数据和ping响应的过期时间。

# 默认值60秒。

# 一个很重要的事情是:确保这个值比 repl-ping-slave-period 大,否则master和slave之间的传输过期时间比预想的要短。

# repl-timeout 60

################################## 安全 ###################################

# 要求客户端在处理任何命令时都要验证身份和密码。

# 这在你信不过来访者时很有用。

# 为了向后兼容的话,这段应该注释掉。而且大多数人不需要身份验证(例如:它们运行在自己的服务器上。)

# 警告:因为Redis太快了,所以居心不良的人可以每秒尝试150k的密码来试图破解密码。

# 这意味着你需要一个高强度的密码,否则破解太容易了。

# requirepass foobared

# 命令重命名

# 在共享环境下,可以为危险命令改变名字。比如,你可以为 CONFIG 改个其他不太容易猜到的名字,这样你自己仍然可以使用,而别人却没法做坏事了。

# 例如:

# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52

# 甚至也可以通过给命令赋值一个空字符串来完全禁用这条命令:

# rename-command CONFIG ""

################################### 限制 ####################################
# 设置最多同时连接客户端数量。

# 默认没有限制,这个关系到Redis进程能够打开的文件描述符数量。

# 特殊值"0"表示没有限制。

# 一旦达到这个限制,Redis会关闭所有新连接并发送错误"达到最大用户数上限(max number of clients reached)"

# maxclients 128

# 不要用比设置的上限更多的内存。一旦内存使用达到上限,Redis会根据选定的回收策略(参见:maxmemmory-policy)删除key。

# 如果因为删除策略问题Redis无法删除key,或者策略设置为 "noeviction",Redis会回复需要更多内存的错误信息给命令。

# 例如,SET,LPUSH等等。但是会继续合理响应只读命令,比如:GET。

# 在使用Redis作为LRU缓存,或者为实例设置了硬性内存限制的时候(使用 "noeviction" 策略)的时候,这个选项还是满有用的。

# 警告:当一堆slave连上达到内存上限的实例的时候,响应slave需要的输出缓存所需内存不计算在使用内存当中。

# 这样当请求一个删除掉的key的时候就不会触发网络问题/重新同步的事件,然后slave就会收到一堆删除指令,直到数据库空了为止。

# 简而言之,如果你有slave连上一个master的话,那建议你把master内存限制设小点儿,确保有足够的系统内存用作输出缓存。

# (如果策略设置为"noeviction"的话就不无所谓了)

# maxmemory

# 内存策略:如果达到内存限制了,Redis如何删除key。你可以在下面五个策略里面选:

#

# volatile-lru -> 根据LRU算法生成的过期时间来删除。

# allkeys-lru -> 根据LRU算法删除任何key。

# volatile-random -> 根据过期设置来随机删除key。

# allkeys->random -> 无差别随机删。

# volatile-ttl -> 根据最近过期时间来删除(辅以TTL)

# noeviction -> 谁也不删,直接在写操作时返回错误。

# 注意:对所有策略来说,如果Redis找不到合适的可以删除的key都会在写操作时返回一个错误。

# 这里涉及的命令:set setnx setex append

# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd

# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby

# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby

# getset mset msetnx exec sort

# 默认值如下:

# maxmemory-policy volatile-lru

# LRU和最小TTL算法的实现都不是很精确,但是很接近(为了省内存),所以你可以用样例做测试。

# 例如:默认Redis会检查三个key然后取最旧的那个,你可以通过下面的配置项来设置样本的个数。

# maxmemory-samples 3

############################## 纯累加模式 ###############################
# 默认情况下,Redis是异步的把数据导出到磁盘上。这种情况下,当Redis挂掉的时候,最新的数据就丢了。

# 如果不希望丢掉任何一条数据的话就该用纯累加模式:一旦开启这个模式,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件。

# 每次启动时Redis都会把这个文件的数据读入内存里。

# 注意,异步导出的数据库文件和纯累加文件可以并存(你得把上面所有"save"设置都注释掉,关掉导出机制)。

# 如果纯累加模式开启了,那么Redis会在启动时载入日志文件而忽略导出的 dump.rdb 文件。

# 重要:查看 BGREWRITEAOF 来了解当累加日志文件太大了之后,怎么在后台重新处理这个日志文件。

appendonly no

# 纯累加文件名字(默认:"appendonly.aof")

# appendfilename appendonly.aof

# fsync() 请求操作系统马上把数据写到磁盘上,不要再等了。

# 有些操作系统会真的把数据马上刷到磁盘上;有些则要磨蹭一下,但是会尽快去做。

# Redis支持三种不同的模式:

# no:不要立刻刷,只有在操作系统需要刷的时候再刷。比较快。

# always:每次写操作都立刻写入到aof文件。慢,但是最安全。

# everysec:每秒写一次。折衷方案。

# 默认的 "everysec" 通常来说能在速度和数据安全性之间取得比较好的平衡。

# 如果你真的理解了这个意味着什么,那么设置"no"可以获得更好的性能表现(如果丢数据的话,则只能拿到一个不是很新的快照);

# 或者相反的,你选择 "always" 来牺牲速度确保数据安全、完整。

# 如果拿不准,就用 "everysec"

# appendfsync always

appendfsync everysec

# appendfsync no

# 如果AOF的同步策略设置成 "always" 或者 "everysec",那么后台的存储进程(后台存储或写入AOF日志)会产生很多磁盘I/O开销。

# 某些Linux的配置下会使Redis因为 fsync() 而阻塞很久。

# 注意,目前对这个情况还没有完美修正,甚至不同线程的 fsync() 会阻塞我们的 write(2) 请求。

# 为了缓解这个问题,可以用下面这个选项。它可以在 BGSAVE 或 BGREWRITEAOF 处理时阻止 fsync()。

# 这就意味着如果有子进程在进行保存操作,那么Redis就处于"不可同步"的状态。

# 这实际上是说,在最差的情况下可能会丢掉30秒钟的日志数据。(默认Linux设定)

# 如果你有延迟的问题那就把这个设为 "yes",否则就保持 "no",这是保存持久数据的最安全的方式。

no-appendfsync-on-rewrite no

# 自动重写AOF文件

# 如果AOF日志文件大到指定百分比,Redis能够通过 BGREWRITEAOF 自动重写AOF日志文件。

# 工作原理:Redis记住上次重写时AOF日志的大小(或者重启后没有写操作的话,那就直接用此时的AOF文件),

# 基准尺寸和当前尺寸做比较。如果当前尺寸超过指定比例,就会触发重写操作。

# 你还需要指定被重写日志的最小尺寸,这样避免了达到约定百分比但尺寸仍然很小的情况还要重写。

# 指定百分比为0会禁用AOF自动重写特性。

auto-aof-rewrite-percentage 100

auto-aof-rewrite-min-size 64mb

################################## 慢查询日志 ###################################

# Redis慢查询日志可以记录超过指定时间的查询。运行时间不包括各种I/O时间。

# 例如:连接客户端,发送响应数据等。只计算命令运行的实际时间(这是唯一一种命令运行线程阻塞而无法同时为其他请求服务的场景)

# 你可以为慢查询日志配置两个参数:一个是超标时间,单位为微妙,记录超过个时间的命令。

# 另一个是慢查询日志长度。当一个新的命令被写进日志的时候,最老的那个记录会被删掉。

# 下面的时间单位是微秒,所以1000000就是1秒。注意,负数时间会禁用慢查询日志,而0则会强制记录所有命令。

slowlog-log-slower-than 10000

# 这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。(译者注:日志居然是在内存里的Orz)

slowlog-max-len 128
################################ 虚拟内存 ###############################
### 警告!虚拟内存在Redis 2.4是反对的。

### 非常不鼓励使用虚拟内存!!

# 虚拟内存可以使Redis在内存不够的情况下仍然可以将所有数据序列保存在内存里。

# 为了做到这一点,高频key会调到内存里,而低频key会转到交换文件里,就像操作系统使用内存页一样。

# 要使用虚拟内存,只要把 "vm-enabled" 设置为 "yes",并根据需要设置下面三个虚拟内存参数就可以了。

vm-enabled no

# vm-enabled yes

# 这是交换文件的路径。估计你猜到了,交换文件不能在多个Redis实例之间共享,所以确保每个Redis实例使用一个独立交换文件。

# 最好的保存交换文件(被随机访问)的介质是固态硬盘(SSD)。

# *** 警告 *** 如果你使用共享主机,那么默认的交换文件放到 /tmp 下是不安全的。

# 创建一个Redis用户可写的目录,并配置Redis在这里创建交换文件。

vm-swap-file /tmp/redis.swap

# "vm-max-memory" 配置虚拟内存可用的最大内存容量。

# 如果交换文件还有空间的话,所有超标部分都会放到交换文件里。

# "vm-max-memory" 设置为0表示系统会用掉所有可用内存。

# 这默认值不咋地,只是把你能用的内存全用掉了,留点余量会更好。

# 例如,设置为剩余内存的60%-80%。

vm-max-memory 0

# Redis交换文件是分成多个数据页的。

# 一个可存储对象可以被保存在多个连续页里,但是一个数据页无法被多个对象共享。

# 所以,如果你的数据页太大,那么小对象就会浪费掉很多空间。

# 如果数据页太小,那用于存储的交换空间就会更少(假定你设置相同的数据页数量)

# 如果你使用很多小对象,建议分页尺寸为64或32个字节。

# 如果你使用很多大对象,那就用大一些的尺寸。

# 如果不确定,那就用默认值 :)

vm-page-size 32

# 交换文件里数据页总数。

# 根据内存中分页表(已用/未用的数据页分布情况),磁盘上每8个数据页会消耗内存里1个字节。

# 交换区容量 = vm-page-size * vm-pages

# 根据默认的32字节的数据页尺寸和134217728的数据页数来算,Redis的数据页文件会占4GB,而内存里的分页表会消耗16MB内存。

# 为你的应验程序设置最小且够用的数字比较好,下面这个默认值在大多数情况下都是偏大的。

vm-pages 134217728

# 同时可运行的虚拟内存I/O线程数。

# 这些线程可以完成从交换文件进行数据读写的操作,也可以处理数据在内存与磁盘间的交互和编码/解码处理。

# 多一些线程可以一定程度上提高处理效率,虽然I/O操作本身依赖于物理设备的限制,不会因为更多的线程而提高单次读写操作的效率。

# 特殊值0会关闭线程级I/O,并会开启阻塞虚拟内存机制。

vm-max-threads 4

############################### 高级配置 ###############################

# 当有大量数据时,适合用哈希编码(需要更多的内存),元素数量上限不能超过给定限制。

# 你可以通过下面的选项来设定这些限制:

hash-max-zipmap-entries 512

hash-max-zipmap-value 64

# 与哈希相类似,数据元素较少的情况下,可以用另一种方式来编码从而节省大量空间。

# 这种方式只有在符合下面限制的时候才可以用:

list-max-ziplist-entries 512

list-max-ziplist-value 64

# 还有这样一种特殊编码的情况:数据全是64位无符号整型数字构成的字符串。

# 下面这个配置项就是用来限制这种情况下使用这种编码的最大上限的。

set-max-intset-entries 512

# 与第一、第二种情况相似,有序序列也可以用一种特别的编码方式来处理,可节省大量空间。

# 这种编码只适合长度和元素都符合下面限制的有序序列:

zset-max-ziplist-entries 128

zset-max-ziplist-value 64

# 哈希刷新,每100个CPU毫秒会拿出1个毫秒来刷新Redis的主哈希表(顶级键值映射表)。

# redis所用的哈希表实现(见dict.c)采用延迟哈希刷新机制:你对一个哈希表操作越多,哈希刷新操作就越频繁;

# 反之,如果服务器非常不活跃那么也就是用点内存保存哈希表而已。

# 默认是每秒钟进行10次哈希表刷新,用来刷新字典,然后尽快释放内存。

# 建议:

# 如果你对延迟比较在意的话就用 "activerehashing no",每个请求延迟2毫秒不太好嘛。

# 如果你不太在意延迟而希望尽快释放内存的话就设置 "activerehashing yes"。

activerehashing yes

################################## 包含 ###################################

# 包含一个或多个其他配置文件。

# 这在你有标准配置模板但是每个redis服务器又需要个性设置的时候很有用。

# 包含文件特性允许你引人其他配置文件,所以好好利用吧。

#

# include /path/to/local.conf

# include /path/to/other.conf

Redis 开启密码
阅读全文 »