每天一个开发小技巧
尬聊
在日常开发中,不免会遇到自己不熟悉的地方,但是很多时候我们查完用完然后就是技能归还。如果能在这里记录整理收集,那也是一笔宝贵的知识力量。可能有的小技巧并没有太多的实用价值,也有可能有一些奇奇怪怪的奇技淫巧,但这些代码里的精彩的碎片。日拱一卒,积少成多,相信时间的力量。
小技巧
- Mac校验文件SHA
1 |
|
1 |
|
- git tag 重命名
1 |
|
- reflections 反射工具包,内置反射相关操作,简化开发
1 |
|
- 不使用 springboot-parent 创建 springboot 项目,方便清晰系统整体继承结构。只需要在依赖的父pom 的 dependencyManagement 中添加 spring-boot-dependencies 依赖即可。
1 |
|
三个有意思的在线的 playgroud
redis 在线的web shell try redis ,可以执行一些 redis cmds。
docker 的在线 docker lab,登录后提供一个时长四个小时的 session,过期需要重新登录,登录需要 docker hub 的账号,在 session 中可以操作多个docker实例,正如这个 lab 的名字一样~paly with docker。
git 在线学习网站 learn-git-branch,在这个网站通过完成一个个任务学习命令操作可视化的git节点到达学习 git 的目的,就很nice~
.gitignore 文件不生效的问题,清理 git 的本地的缓存,然后重新 add commit 就可以了
1 |
|
linux 查看端口,每次都要查,每次都记不住😫
netstat 命令 用于查看 tcp 和 udp 的端口占用情况
- -t (tcp) 仅仅显示 tcp 相关
- -u(udp) 仅仅显示 udp 相关
- -n 拒绝显示别名,能显示数字的全部转化为数字
- -l 仅列出在Listen(监听)的服务状态
- -p 显示建立相关链接的程序名
所以我全都要 所以命令就是 -nptul (牛批吐了)😏
1
netstat -nptul | grep <port>
注意这个命令 mac 上就是另外一套参数了,mac 上可以使用 lsof - i:port
redis 中 lua 脚本的编写的基本方法
从 redis 2.6.0 开始内置支持 lua 脚本,可以通过 lua 脚本实现执行多条命令的原子性,典型的使用场景有 分布式锁 和 分布式扣减等。基本的操作命令如下
1
127.0.0.1:6379> EVAL script numkeys key [key...] arg [arg...]
参数 解释 script 脚本内容 numkeys key 的个数(只是 key 的个数和 argv 没有关系) key [key…] key列表,键名通过全局变量 KEYS 数组,用 1 为基址的形式访问( KEYS[1] , KEYS[2] ,以此类推) arg [arg…] 参数列表,参数通过全局变量 ARGV 数组,用 1 为基址的形式访问( ARGV[1] , ARGV[2] ,以此类推) 1
2
3
4
5
6
7127.0.0.1:6379> eval "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2], ARGV[3]}" 2 key1 key2 avg1 avg2 avg3
## 输出
1) "key1"
2) "key2"
3) "avg1"
4) "avg2"
5) "avg3"还可以通过 script load 命令缓存命令,并通过 evalsha 命令执行
1
2SCRIPT LOAD script # 缓存 lua 脚本
EVALSHA sha1 numkeys key [key ...] arg [arg ...] # 执行 lua 脚本1
2script load "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2], ARGV[3]}"
"0e8e5b92bfe818cf5eb29a03465e71bd8ef3e95a"1
2
3
4
5
6127.0.0.1:6379> evalsha 0e8e5b92bfe818cf5eb29a03465e71bd8ef3e95a 2 hello word arg1 arg2 arg3
1) "hello"
2) "word"
3) "arg1"
4) "arg2"
5) "arg3"几个常用的 redis lua 脚本
分布式锁
1
2
3
4--lock
if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then redis.call('expire', KEYS[1], ARGV[2]) return 'true' else return 'false' end
-- unlock
if redis.call('get', KEYS[1]) == ARGV[1] then redis.call('del', KEYS[1]) end return 'true' 分布式计数器
1
if redis.call('EXISTS', KEYS[1]) == 1 and redis.call('GET', KEYS[1]) > ARGV[1] then redis.call('decr', KEYS[1]) return 'true' else return 'false' end
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!