每天一个开发小技巧

尬聊

在日常开发中,不免会遇到自己不熟悉的地方,但是很多时候我们查完用完然后就是技能归还。如果能在这里记录整理收集,那也是一笔宝贵的知识力量。可能有的小技巧并没有太多的实用价值,也有可能有一些奇奇怪怪的奇技淫巧,但这些代码里的精彩的碎片。日拱一卒,积少成多,相信时间的力量。

小技巧

  • Mac校验文件SHA
1
shasum -a 256 ${file}
1
tcpdump -D # 当前可以监听的网卡
  • git tag 重命名
1
2
3
4
daiwei@daiweideMacBook-Pro ~ % git tag [new_name] [old_name]  # 复制原有的tag
daiwei@daiweideMacBook-Pro ~ % git tag -d [old_name] # 删除原有tag
daiwei@daiweideMacBook-Pro ~ % git push origin :refs/tag/v1.0 # 删除远程 tag
daiwei@daiweideMacBook-Pro ~ % git push --tag #推送本地新的tag
  • reflections 反射工具包,内置反射相关操作,简化开发
1
2
3
4
<dependency>
<groupId>org.reflections</groupId>
<artifactId>reflections</artifactId>
</dependency>
  • 不使用 springboot-parent 创建 springboot 项目,方便清晰系统整体继承结构。只需要在依赖的父pom 的 dependencyManagement 中添加 spring-boot-dependencies 依赖即可。
1
2
3
4
5
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
</dependency>
  • 三个有意思的在线的 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
2
3
4
daiwei@daiweideMacBook-Pro ~ % git rm -r --cached .
daiwei@daiweideMacBook-Pro ~ % git add .
daiwei@daiweideMacBook-Pro ~ % git commit -m'update msg'
daiwei@daiweideMacBook-Pro ~ % git push origin main
  • 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
    7
    127.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
    2
    SCRIPT LOAD script # 缓存 lua 脚本
    EVALSHA sha1 numkeys key [key ...] arg [arg ...] # 执行 lua 脚本
    1
    2
    script load "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2], ARGV[3]}"
    "0e8e5b92bfe818cf5eb29a03465e71bd8ef3e95a"
    1
    2
    3
    4
    5
    6
    127.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 协议 ,转载请注明出处!