Redis
2018-01-10
测试环境
keys *
删除指定模式的 key:
redis-cli keys 'a.b.*' > /tmp/deleted_keys
cat /tmp/deleted_keys
cat /tmp/deleted_keys | xargs redis-cli del
线上环境
线上 keys 可能会导致严重的性能问题。
2.8 开始,Redis 增加了 4 个 SCAN 命令:
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
遍历当前 db 中的所有键, 返回 keys ...
SSCAN key cursor [MATCH pattern] [COUNT count]
遍历 set 类型,返回 value ...
HSCAN key cursor [MATCH pattern] [COUNT count]
遍历 hash 类型,返回 (key, value)
ZSCAN key cursor [MATCH pattern] [COUNT count]
遍历 sorted set 类型,返回 (score, member)
scan 0 count 100
每次会返回一个新的游标,用于下一次 scan 请求。
import redis
r = redis.StrictRedis(host='localhost', port=6379, db=0)
for key in r.scan_iter():
print(key)
WebDev ECharts
2018-01-04
一般都是参考着 官网示例 写,修修改改就好了,挺方便。
Linux Vim 编辑器 CheatSheet
2018-01-03
我并不是个 Vim 高手,但是我所掌握的知识对于轻量使用来说,也够用了。
这就是我能想到的全部 Vim 知识。
如果你是一个新手,看看这篇文章,应该可以快速入门 Vim,能解决所有简单编辑任务所会面临的问题。
基础知识
避免由于意外操作而不知所措。
模式
- 普通模式(Normal):直接打开文件(
vim filepath
)就进入了这个模式,可以移动光标,执行一些指令
- 插入模式(Insert):像普通编辑器一样编辑文本
- 可视模式(Visual):先在普通模式下移动光标到目标区域,然后切换到可视模式,这时移动光标就可以选中一块区域,对着块区域的内容执行一些命令
- 命令模式:在 Vim 底部输入命令,按回车执行
- 选择模式(Select):正常我们能够理解的选中,然后删除或者对着一块进行替换
- Ex 模式:。。。
模式切换:
- 在任何模式下按 Esc 就可以回到普通模式;
- 普通模式下,按
i
进入插入模式;
- 普通模式下,按
v
进入可视模式(字符);
- 普通模式下,按
V
进入行可视模式;
- 普通模式下,按
Ctrl
+ v
进入块可视模式;
- Windows 系统下 Ctrl + v 被占用作为粘贴快捷键,可以使用 Ctrl + q 代替;
- 普通模式下,按
:
进入命令模式;
- 可视模式下,按
Ctrl
+ g
进入选择模式;
- 选择模式下,可以按
Ctrl
+ o
回退到可视模式;
快捷键
上下左右,翻页(PageUp,PageDown),删除(Backspace,Del)本身就可以用,就不用记快捷键了。
Key |
Function |
u |
撤销 |
dd |
删除当前行 |
3dd |
删除当前行 + 后面两行(共 3 行) |
>> |
缩进 |
<< |
取消缩进 |
== |
自动对齐 |
使用命令 5d 删除第五行
使用命令 5,10d 删除第 5 到第 10 行
跳转
Key |
Function |
gg |
跳到第一行 |
20gg |
跳到第 20 行 |
G |
跳到最后一行 |
10j |
往前跳 10 行 |
10k |
往后跳 10 行 |
hjkl 本身用来表示左上下右,所以...
复制粘贴
Key |
Function |
yy |
复制当前行 |
3yy |
复制当前行 + 后面两行(共 3 行) |
yw |
复制当前单词和后面的空白字符 |
p |
Paste 粘贴在当前行、字符后面 |
P |
Paste 粘贴在当前行、字符前面 |
搜索
Key |
Function |
? |
向后搜索(正则) |
/ |
向前搜索(正则) |
# |
向后搜索当前单词,等同于输入 #\<xxx\> |
* |
向前搜索当前单词,等同于输入 /\<xxx\> |
- n/N 跳到上一处或下一处
\cp[a-z]*n
忽略大小写,搜索 p 开头,n 结尾的单词
命令
一般都有取消配置的 set noXXX
命令。
Key |
Function |
set nu |
显示行号 |
set paste |
粘贴模式(避免开启自动缩进时,会弄乱粘贴内容) |
set ignorecase / set ic |
搜索忽略大小写 |
set hlsearch |
高亮搜索结果(似乎是默认) |
set nohlsearch |
取消高亮搜索结果 |
noh |
关闭高亮 |
set listchars=tab:>~,trail:. |
显示 TAB 键和行末空格 |
set cursorline |
当前行加上下划线 |
替换
Key |
Function |
s/Gitee/Gitea/g |
将当前行所有 Gitee 替换成 Gitea |
%s/Gitee/Gitea/g |
将所有行所有 Gitee 替换成 Gitea |
%s/Gitee/Gitea/gi |
...忽略大小写 |
%s/Gitee/Gitea/gin |
...不真正执行,只反馈印象范围 |
5,10s/Gitee/Gitea/g |
将第 5 到 10 行所有 Gitee 替换成 Gitea |
.,+5s/Gitee/Gitea/g |
将当前行到后两行所有 Gitee 替换成 Gitea |
保存
Key |
Function |
q |
退出(可能会提示你:已修改但尚未保存) |
w |
保存 |
wq |
保存并退出 |
x |
保存并退出 |
q! |
不保存,强行退出 |
:w !sudo tee % |
没有写入权限的时候提权保存 |
清空数据:gg
+ 1000dd
(跳到第一行,然后删除 1000 行)
> filepath
# 或
echo > filepath
参考资料与拓展阅读
包管理工具 Linux Ubuntu Debian APT
2017-12-25
搜索
apt search xxx
检索
apt list
apt list --installed
apt list --upgradable
升级
apt update
apt upgrade
apt-file
apt-file list youtube-dl
apt-file search bin/update-locale
其他
apt search
apt show
apt install
apt reinstall
apt remove
apt autoremove
apt full-upgrade
apt edit-sources
apt satisfy
apt-mark
apt-key
apt-config
apt-cache
apt-add-repository
Git
2017-12-07
CR:Carriage Return 回车
LF:Line Feed 换行
EOL: End Of Line
平台 |
代码 |
数值 |
转义字符 |
Windows |
CRLF |
13 10 |
\r\n |
Linux/Unix |
LF |
10 |
\n |
Mac OS |
CR |
13 |
\r |
Git 相关配置项
core.eol
,换行符,可选:lf,crlf,native(根据系统判断,默认)
core.safecrlf
,是否接受非 LF 换行,可选:true(拒绝),false(允许),warn(警告,默认)
core.autocrlf
,是否自动转换换行符,可选:true(push lf,pull crlf),false(默认),input(push lf)
Linux 上,这三个配置项的默认值就非常恰当了,不用修改。
代码中的换行符应该由开发者自己判断、处理,工具提醒一下就行了。
如果项目组有共识,那么使用一个共同的配置也可以,比如:
git config --global core.eol lf
git config --global core.safecrlf true
git config --global core.autocrlf input
# 如果 CRLF 转换,会有警告提示:
# warning: in the working copy of 'README.md', CRLF will be replaced by LF the next time Git touches it
Linux
2017-12-06
比较独特的命令 [
DB MySQL
2017-12-06
几处小的知识点
WebFrontend SVG
2017-11-25
<!doctype html>
<html lang="en" xmlns="https://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title></title>
</head>
<body style="width:1000px;margin:10px auto;">
<svg
id="example"
width="1000"
height="800"
xmlns="https://www.w3.org/2000/svg"
>
<!-- 画个框框当边界 -->
<rect
x="0"
y="0"
width="100%"
height="100%"
fill="none"
stroke="rgb(99,99,99)"
stroke-width="2"
/>
<circle
id="circle1"
class="dragable"
cx="100"
cy="100"
r="30"
fill="red"
fill-opacity="0.7"
/>
<circle
id="circle2"
class="dragable"
cx="200"
cy="100"
r="30"
fill="yellow"
fill-opacity="0.7"
/>
<circle
id="circle3"
class="dragable"
cx="300"
cy="100"
r="30"
fill="blue"
fill-opacity="0.7"
/>
</svg>
</body>
<script>
var svg = document.getElementById("example"),
target = null,
startPoint = svg.createSVGPoint(),
curPoint = svg.createSVGPoint();
function refreshPoint(event) {
curPoint.x = event.clientX;
curPoint.y = event.clientY;
}
var dragables = document.getElementsByClassName("dragable");
for (var i = 0; i < dragables.length; i++) {
var dragable = dragables[i];
dragable.addEventListener("mousedown", function (event) {
target = event.target;
refreshPoint(event);
var matrix = target.getCTM();
startPoint.x = curPoint.x - matrix.e;
startPoint.y = curPoint.y - matrix.f;
});
}
svg.addEventListener("mousemove", function (event) {
if (!target) return;
refreshPoint(event);
var newX = curPoint.x - startPoint.x;
var newY = curPoint.y - startPoint.y;
target.setAttributeNS(
null,
"transform",
"translate(" + newX + "," + newY + ")",
);
});
svg.addEventListener("mouseup", function (event) {
if (!target) return;
target = null;
});
</script>
</html>
WebFrontend SVG
2017-11-25
- svg 标签
xmlns
viewBox
- 形状
- 矩形
rect
- 圆形
circle
- 椭圆
ellipse
- 线条
line
- 多边形
polygon
- 折线
polyline
- 路径
path
- 通用属性
stroke
: 边框颜色
stroke-width
: 边框宽度
fill
: 填充颜色
style
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>Document</title>
</head>
<body style="background-color:beige;width:800px;margin:0 auto;">
<svg id="example" xmlns="https://www.w3.org/2000/svg" viewBox="0 0 800 800">
<!--
-->
<rect
x="0"
y="0"
width="100%"
height="100%"
fill="none"
stroke="rgb(99,99,99)"
stroke-width="2"
/>
<line
x1="800"
y1="0"
x2="0"
y2="800"
style="stroke:rgb(99,99,99);stroke-width:2"
/>
<line
x1="0"
y1="0"
x2="800"
y2="800"
style="stroke:rgb(99,99,99);stroke-width:2"
/>
<circle cx="400" cy="400" r="100" />
<ellipse cx="400" cy="150" rx="120" ry="60" />
<polygon points="250,300 130,520 50,350" />
<polygon points="80,40 120,60 80,80 60,120 40,80 0,60 40,40 60,0 80,40" />
<polyline
points="150,750 170,800 190,750 210,800 230,750"
fill="none"
stroke="rgb(99,99,99)"
stroke-width="2"
/>
<rect x="550" y="325" width="200" height="150" />
<text
xml:space="preserve"
text-anchor="start"
font-family="Helvetica, Arial, sans-serif"
font-size="24"
x="400"
y="600"
fill-opacity="null"
stroke-opacity="null"
stroke-width="0"
stroke="#000"
fill="#000000"
>
@
</text>
<!--
https://editor.method.ac/#move_front
M = moveto
L = lineto
H = horizontal lineto
V = vertical lineto
C = curveto
S = smooth curveto
Q = quadratic Belzier curve
T = smooth quadratic Belzier curveto
A = elliptical Arc
Z = closepath
-->
<path
d="m395.5,698c0,0 1,0 4,0c4,0 8.29361,2.7265 12,7c3.276,3.77728 6.54135,7.7027 8,11c1.66803,3.77063 1.79395,8.08746 4,13c1.83203,4.07965 3,6 3,8c0,2 0,3 0,5c0,2 0.70709,3.29291 0,4c-0.70709,0.70709 -3,1 -4,1c-1,0 -3,0 -4,0c-1,0 -3,0 -4,0c-1,0 -2,0 -3,0c-1,0 -2.186,0.30743 -4,-1c-1.14728,-0.8269 -2,-2 -2,-3c0,-1 -0.22977,-3.02673 0,-4c0.51373,-2.17627 2.07339,-2.93164 3,-4c3.276,-3.77728 6,-7 9,-10c3,-3 4.79489,-5.22021 8,-8c3.77728,-3.276 6.21167,-5.71411 9,-8c2.18735,-1.79321 4.186,-2.69257 6,-4c2.29453,-1.65381 3,-2 4,-2l1,0l2,-1l1,0"
fill-opacity="null"
stroke-opacity="null"
stroke-width="2"
stroke="#000"
fill="none"
/>
</svg>
</body>
</html>
WebFrontend jQuery
2017-11-09
jQuery 上传数组时会在字段名后自动加上 []
,太挫。