postgres时间戳转换工具

postgres时间戳转换工具, 记录一下方便使用

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
-- from unixtimestamp, convert to timestamp
create function from_us(ts bigint)
returns timestamp as $$
begin
return abstime(ts::int);
end;
$$ language plpgsql;


-- from unixtimestamp, convert to timestamp
create function from_us(ts integer)
returns timestamp as $$
begin
return abstime(ts);
end;
$$ language plpgsql;


-- to unix timestamp, from a string, convert to int4
create function to_uts(date varchar)
returns int4 as $$
begin
return extract(epoch from to_timestamp(date, 'yyyy-MM-dd'));
end;
$$ language plpgsql

shell下使用脚本自动填充密码

一般,当需要ssh到一个服务器时, 会输入

1
2
ssh xxx@xxx
#enter password

当使用脚本自动化时,往往不想要输入密码,此时选择可以使用ssh的public key authentication,或者使用sshpass工具, 再或者,使用下面这段脚本

1
2
3
4
5
6
7
8
9
10
11
#!/usr/bin/expect

set timeout 20

set cmd [lrange $argv 1 end]
set password [lindex $argv 0]

eval spawn $cmd
expect "assword:"
send "$password\r";
interact

将其放在/usr/bin/exp文件中,添加权限,然后使用

1
2
3
exp <password> ssh <anything>
exp <password> scp <anysrc> <anydst>
exp <password> zssh <anything>

选自stackoverflow Automatically enter SSH password with script

一波简单的订单优化

背景

系统中,下单流程较长,业务逻辑复杂,再加上分布式锁的使用,导致下单效率很低,耗时较长,但由于对接的OTA要求500ms以内

而我负责的目的地系统下单只是其中的一个环节,所以必须控制在300ms以内,于是有了这一波优化

系统使用hibernate jpa

开始

要优化,自然先找出耗时较长的函数调用,简单的方法是使用System.currentMilliseconds()函数打印时间。

更进一步,使用切面,对Service层的方法调用做切面,在切面里打印每一个函数调用时间

实际时两种方法混用

redis源码阅读3-AOF(Append Only File)

redis虽然是一个内存数据库,但是也存在着数据的持久化. 这一次就准备好好看看,一直以为神秘而又复杂的文件存储在redis中是如何高效实现的

在redis中,存在着两种与持久化相关的方案

  • RDB 存储某个时间点的完整备份
  • AOF(Append only file) 存储修改数据的命令, 可以认为是增量日志, 存储格式即redis命令协议的格式

RDB还没怎么看,所以先从AOF开始

git-cheat-sheet

HEAD

将 HEAD 想象为当前分支的别名

git log

git log -p 显示差异
git log –stat
git log -2
git log –graph 图形显示
git log -Ssearchtext 搜索
git log –grep=text in commit comment 搜索提交信息
git log –since=2016-07-01
git log –author
git log –pretty=online 格式,有很多

git reset

git reset HEAD file1 file2… 移除通过git add添加到暂存区中的修改

git checkout

git checkout – file1 file2… 恢复修改
git checkout -b branchname tagname 检出标签到新建的branchname分支上
git checkout branch_name 检出分支

git fetch & git pull

git fetch 拉取,不和并
git pull 拉取,并尝试合并

git push

git push origin tag_name 推送一个标签
git push origin –tags 推送所有标签
git push origin branch_name 推送分支到远程分支
git push origin local_branch_name:remote_branch_name 推送分支到远程分支
git push origin –delete serverfix 删除远程分支

git remote

git remote
git remote add shortname url
git remote remove name
git remote rename oriname newname

git tag

git tag
git tag -l ‘vx.x.x*’
git tag -a vx.x.y -m ‘comment’
git tag vx.x.z
git tag -a vx.x.a commit_check_sum
git show vx.x.y

alias

git config –global alias.new_command git_command(eg:checkout, branch, reset HEAD –…)
git config –global alias.last ‘log -1 HEAD’

git branch

git branch
git branch new_branch_name 创建分支
git branch -d branch_name 删除分支
git branch -v
git branch –merged/–no-merged 已经合并或未合并到当前分支的分支
git branch -u origin/serverfix 使当前分支跟踪上游分支

git merge

git merge branch_name
git merge origin/branch_name
冲突时:

1
2
3
1. git status查看冲突文件
2. 手动修改冲突文件
3. git add filename标记为冲突已解决

git mergetool –tool vimdiff filename 使用vimdiff合并

git rebase

订单锁

业务情况如下:
订单大致存在三处修改的地方,分别为

  • 下单
  • 分车
  • 订单状态流转

前两处都涉及到车辆的分配,即库存
第三处,当订单失效时,涉及到已分配库存的回收

所以,针对同一产品(线路) 的库存修改,必须保证原子性。原子性可用队列单线程,也可对产品库存加锁实现

而因为一些原因,直接选择加锁。由于可能存在部署多个实例的情况,所以采用分布式锁

本文的重点在于,锁的使用(即,在哪里,什么时候加锁),而非分布式锁的实现。

由于资源的复杂度远小于线路,所以后面只讨论购买一个线路的情况

redis源码阅读1-开始

前段时间看到一篇文章说阅读源码,最好就是从那种麻雀虽小,五脏俱全的项目入手,作者又提到了redis就是这样一个开源项目。想想平时也有使用redis,那么久从它开始好了

这一系列文章主要是自己的一个读书笔记,同时希望能一个较清晰的思路,从头开始阅读redis源码

,