Elvin's blog

陈文强的博客


  • 首页

  • 分类

  • 归档

  • 搜索

用SQL高效的取每组最大记录

发表于 2021-10-05 | 分类于 tech

给定以下用户登录的记录表,为user表的子表,主键id自增,user_id为索引,表中有7k多条数据,每个user_id有10条数据

1
2
3
4
5
6
7
CREATE TABLE `user_signin_record`  (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL,
`active_at` datetime NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE,
INDEX `IDX_user_signin_record_user_id`(`user_id`) USING BTREE
);

如何用SQL高效的取user_id为1、2、3、4、5,每个用户对应的最近的登录记录?以下是4种解法及其变种,以及对应的性能测试

阅读全文 »

编写可正常运行yum的CentOS 6 Dockerfile

发表于 2021-03-30 | 分类于 tech

2020年11月30日,CentOS 6到达了EOL(End of Lifetime)日期,yum官方源随即被归档,第三方源随后也停止提供服务。
图1

阅读全文 »

解决iptables和Docker冲突的问题

发表于 2021-02-26 | 分类于 tech

在一台装有Docker的服务器上,需要利用iptables作为防火墙限制外部访问
图1
如上图,192.168.0.1/3这3台服务器上分布式部署了Web Service,通过容器的7901端口,对外开放80/443端口,192.168.0.1上还部署了Redis示例,开放6379端口。有以下要求:

  • 80/443端口不受限
  • 192.168.0.1/3网段内的主机互相访问6379端口不受限
  • 出站访问不受限
    其他一律不允许。

使用iptables -L命令查看当前iptables设置,发现一些诸如DOCKER之类的Chain,呃…感觉不妙。

阅读全文 »

在Go中实现限制读取命令行执行的结果长度

发表于 2021-01-09 | 分类于 tech

某产品遇到问题,随机的内存暴涨导致频繁OOM,甚至影响到服务器的正常运行。经查,原来是命令行执行外部程序,返回的数据太大,而这些数据都被读到了Go程序的内存。

原程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
func Run(name string, args ...string) ([]byte, error) {
cmd := exec.Command(name, args...)
var buf bytes.Buffer
cmd.Stdout = &buf
if err := cmd.Start(); err != nil {
return nil, err
}
if err := cmd.Wait(); err != nil {
return nil, err
}
return buf.Bytes(), nil
}

当然,以上代码也可以用exec.Command(name, args...).Output()来实现,这样写是为了方便下文展开。

当然我们应该首先修改这个外部程序,但是有没有一种安全的方式让我们放心的读取命令行执行的结果呢?

阅读全文 »

应用strace排查程序内部问题

发表于 2020-12-03 | 分类于 tech

隔壁组发来一个SDK程序,需要集成到现有Go项目中。这个SDK目测是C/C++编写的,编译成.so(动态链接库)文件,需要由CGO调用。
然而实际测试过程中发现一个奇怪的现象:程序在虚拟机的Linux系统中运行正常,但在Docker容器中总是报出error exit status 127的错误。由于该项目负责人正在休假,我的工作也无法继续进行了。有没有一种办法可以查看程序内部的详细执行过程信息呢?

阅读全文 »

如何以固定容量切分Slice

发表于 2019-03-21 | 分类于 tech

假设有一个长度为1000的Slice,里面存了很多数据,为了高效地处理这些数据,我需要将它重新分割为10个长度为100的Slice,然后开10个Goroutine来并行处理。那么,如何以固定容量切分这个Slice呢?

简单写法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type T struct {
V int
}

func IntChunk(origins []T, limit int) [][]T {
var v [][]T
for i := 0; i < len(origins); i += limit {
end := i + limit
if end > len(origins) {
end = len(origins)
}
v = append(v, origins[i:end])
}
return v
}

但这种写法并不高效:由于没有提前分配v的容量,执行append时如果v的容量不够,会自动将v的容量翻倍,这就导致了内存的重新分配以及多余的内存占用,而内存的分配相对而言是非常耗时的。

阅读全文 »

搭建Mac全栈开发环境(续)

发表于 2018-12-31 | 分类于 tech

这篇是对之前的 搭建Mac全栈开发环境 的补充

1 同时安装Python2和Python3

① 使用brew安装python3、pip3

1
brew install python

② 由于Mac自带了Python2但版本比较低,且不带pip,所以可以使用brew安装新版python2

1
brew install python@2

也可只安装pip2

1
sudo easy_install pip

阅读全文 »

API多版本开发实践

发表于 2018-01-15 | 分类于 tech

为什么需要API多版本开发?

如果把云服务看做产品,那么API就是这个产品面向顾客的一种最基本的形态。产品需要逐渐演进,API也就不可避免的出现参数、返回值等的变化。如果是定制产品,我们也许还可以和顾客一起协商修改API的调用方式,但现在,我们面向的是多样化,不固定的顾客,我们不可能要求每一个顾客都能按我们的要求,在指定的时间内修改调用方式。这就促使我们探索一套多版本API的开发方式。

采用哪种形式区分不同版本?

1 Header版本控制

此方法需要客户端将指示资源版本的自定义Header添加到请求中,如果省略了此Header,按默认值(一般是最新版)处理。

1
2
3
4
5
6
7
8
9
# Request
GET http://adventure-works.com/customers/3
Custom-Header: api-version=1

# Response
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"id":3,"name":"Contoso LLC","address":"1 Microsoft Way Redmond WA 98053"}

阅读全文 »

React下的登录信息处理

发表于 2017-02-03 | 分类于 tech

不同于传统的前端项目,React + React Router架构的SPA(Single Page Application)网站在不同的路由间共享一个状态集合,这就需要我们重新考虑登录验证的整体设计。

Q:登录信息保存在哪儿?

A:一般来说浏览器的数据存储有3种方法:Cookie、localStorage、sessionStorage,它们的异同如下:

特性 Cookie localStorage sessionStorage
数据的生命期 可设置失效时间,默认是关闭浏览器后失效 除非被清除,否则永久保存 仅在当前会话下有效,关闭页面或浏览器后被清除
存放数据大小 4K左右 一般为5MB 一般为5MB
与服务器端通信 每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题 仅在客户端(即浏览器)中保存,不参与和服务器的通信 仅在客户端(即浏览器)中保存,不参与和服务器的通信
易用性 需要程序员自己封装,源生的Cookie接口不友好 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持 源生接口可以接受,亦可再次封装来对Object和Array有更好的支持
兼容性 所有现代浏览器 IE8+、Chrome4+ IE8+、Chrome5+

如果保存在sessionStorage中,在同一浏览器的不同Tab间无法共享状态信息,显然不能满足要求。由于localStorage兼容性尚可(即使需要兼容IE8以下浏览器也可以通过polyfill使用userData实现),而且具有较好的性能表现,故我们采用localStorage作为登录信息的保存方法。

阅读全文 »

WCS项目汇报演讲稿

发表于 2017-01-01 | 分类于 tech

WCS,作为公司云化迁移改革的首个盈利项目,应该说整体上是比较成功的。首次作为项目负责人,我在这3个月中成长了太多太多。12月23日,我对公司全体员工做了WCS的项目汇报演讲,以下是经过整理的讲稿。

幻灯片1

阅读全文 »
123
Elvin Chan

Elvin Chan

If you rest, you rust

27 日志
1 分类
32 标签
RSS
GitHub 微博
Links
  • BestUCloud
© 2014 — 2023 Elvin Chan
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4
Hosted by Coding Pages