在 Ubuntu 上搭建单机版 Redis
为什么用到 Redis?
最近开发一个类似抢拍的拍卖 App;有个环节是需要秒刷新的,而且多少个商品同时需求秒请求订单数据,这时想想长期以往 MySQL 肯定应付不了, 所以采用了内存数据库的方案,当然就先到 Redis 了;其实 memcached 也是比较好的选择,但后期的数据结构需保留一定的灵活性,所以选择了 Redis。终端请求的数据,生命周 ... 阅读全文
优雅地关闭 Go HTTP 服务
Go 1.8 之后,http.Server 增加了 Shutdown 函数,类似于第三方的 graceful 插件一样,可以平滑的关闭自身 HTTP 服务了,我们看看代码:
package main
import (
"context"
"github.com/urfave/negroni"
"log"
"net/http"
"os"
"os/signal"
"time"
)
func main(){
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.Response ... 阅读全文
Go 定时器 cron 表达式的使用
上次在《Go 定时器 cron 的使用》里说 cron 简单使用方法,如果想更灵活的使用定时,可能会涉及到更复杂的六位表达式的使用方法,如每半小时执行一次:
0 30 * * * *
六位的表达式看起来,有点费解,好比正则表达式一样,我们需要按步骤来理解;
理解六个作用域的意义
0 0 0 1 1 *
0 0 0 1 * *
0 0 0 * * 0
0 0 0 * * *
0 0 * * * *
... 阅读全文
Go 定时器 cron 的使用
cron 是 robfig 开发的一个定时作业库,robfig 总是想的比别人早,给了我们这些 Gopher 不少急需的东西,想当年 revel 的出现也是这样的。看看 cron 的使用,还是一如既往的简洁明了,发现 Go 的世界里,有些产品还是有鲜明的个人特质的,那就是所谓的个人魅力吧?!
总之 robfig 开发的产品都是有一定超前性,比较有理论基础,使用起 ... 阅读全文
Negroni 应用教程系列(二)
在介绍 Negroni 经典实例三大组件:日志 Logger,异常 Recovery,静态文件 Static 之前,需要说说它们采用的底层内幕,那就是中间件。Negroni 负责把一个个中间件链接起来,按照顺序逐一执行,形成一个中间件链。
Negroni 中间件实质是一个接口,名为 Handler,我们看看它的定义:
type Handler interface {
ServeHTTP(rw http.Respon ... 阅读全文
Negroni 应用教程系列(一)
创建一个 Web 服务器
Negroni 本身和 Go 语言哲学是一脉相承的,这是作者的初衷。我们看看怎么创建一个 Web 服务器。
新建一个 server.go 文件,代码如下:
package main
import (
"fmt"
"net/http"
"github.com/urfave/negroni"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *ht ... 阅读全文
Ubuntu 以 APT 方式安装最新的 MySQL
记得上次写了 《
Ubuntu 14.04 安装 64位的 MySQL 5.7.9
》的文章,发现对于一般用户,操作起来还是繁琐,主要是多个包互相的依赖关系造成的,有些人问能不能使用 Ubuntu apt-get install 来安装最新的 MySQL?答案是可以的。
甲骨文官方提供了这种方案,不仔细看,还真不好发现,下面说说步骤:
1: 先到 MySQL 官网上,找到 APT 包 ... 阅读全文
Go 生成合法的 IP
利用 Go 语言,生成合法的 IP,代码如下:
package util
import (
"fmt"
"math/rand"
"time"
)
// 随机生成合法 IP,如: 222.16.123.95
func RandomIp() string {
// IP 范围二维数组
ranges := ipRange()
idx := newRand().Intn(10)
return numToIp(ranges[idx][0] + newRand().Intn(ranges[idx][1]-ranges[idx][0]))
}
// 随机生成 ... 阅读全文
Go 发起 HTTP 请求及获取相关参数
Go 要请求远程网页,可以使用net/http包中的client提供的方法实现。查看了官方网站有一些示例,没有太全面的例子,于是自己整理了一下。
Get 请求
Get 请求可以直接 http.Get 方法,非常简单。
func httpGet() {
resp, err := http.Get("http://www.01happy.com/demo/accept.php?id=1")
if err != nil {
// handle error
}
... 阅读全文
MyBatis 自定义通用 Mapper
Mybatis 提供自动生成 Mapper 的工具,看看生成的 Mapper,不是尽如人意,比如多表关联和返回的数据类型和传入参类型上。一直想写一个通用的 Mapper,传参类型是 Map,返回 Map 类型;大体分两种数据库操作 DDL 和 DML 操作,而且 DML 分别提供获取一条记录和多条,插入一条记录,批量插入记录,更新,删除一条记录。其中 DDL 是参考 ... 阅读全文
JFinal 使用 HikariCP 数据库连接池
看了HikariCP 的源码,比较感兴趣,想在 JFinal 中集成这样的数据库连接池,发现并没有支持的插件,于是自己动手尝试写了 JFinal HikariCPPlugin
插件
,得益于 JFinal 这么简洁的架构,几分钟时间就测试出炉了,肉眼测试,不严谨,如果有什么不妥的地方,希望网友补充斧正吧!
直接上代码,是程序员最喜欢干的事情:
package com.jfi ... 阅读全文
Java Map 按 key 升序排序
最近开发微信和支付宝的
服务端
支付,涉及到字典的排序和 url 参数转换成字典的操作,整理了一个工具类:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.uti ... 阅读全文
移动终端和 Java 服务端数据传输封装类
移动互联时代,常常碰到的是移动终端和服务端数据交互。终端把某种形式的数据传递给服务端,服务端收到数据后,需要根据双方约定的数据格式,取值再做处理。
传递的数据有哪些形式?一般分成三种形式
1:JSON 的流形式
2:纯粹的键值对形式
3:键值对和文件流并存的形式
其实 2-3 可以合并成一种形式来处理,以下将以 Java 服务端情况 ... 阅读全文
让 Ubuntu Nginx 使用 Let's Encrypt SSL 证书
看到 DiamondFsd 在 开源中国发表了《
Let's Encrypt 使用教程,免费的SSL证书,让你的网站拥抱 HTTPS
》,之前使用了腾讯云免费一年的商业 SSL,其中 Certbot 能通过 corn 定时更新证书,算是准永久免费的方案,所以也想试试 Let's Encrypt ,可惜 DiamondFsd 写的是基于 CentOS 服务器的,自己的是 Ubuntu ,所以在上文的基础上作修 ... 阅读全文
Go 查询数据库 Scan Null 字段报错解决办法
Go 语言基本类型都有默认值,比如整型,长整型,浮点型,字符串等等,都会有自己唯一的默认值 0,空字符串"",而不是nil, 这是它自身的特征,因为这个原因,Go 操作数据库,返回结果扫描填充结构体的时候,往往差强人意。当数据库字段是null值的时候,Goscan 数据填充结构体就出错了。
遇到这种情况,部分用户只能使用 sql.Null*** ... 阅读全文
Go 时间中文个性化处理
现在有些时间比较个性化,比如:5年前,11月前,20天前,23小时前,59分钟前,59秒前,刚刚... 等等,Go 语言可没有这些函数处理,我相信多数语言也不会内置处理此类的东西的,现在自己写个方法,首先要算出当前时间和给定的时间差,就是秒差,有了这个秒差,再进一步人工处理。废话少说,贴上代码吧(代码只是瞬间的思路和随手写法, ... 阅读全文
分布式部署一点理解
一个服务器硬件资源足够强(比如 CPU 内存 SSD磁盘 配置都很优秀),也难免有瓶颈的时候,理论上说,一个单机服务器,并发量是有限的,以 Linux 服务器为例,即使 CPU 有无数个,核心顶配,内存同样很大,SSD磁盘很快,最终也会遇到连接数爆棚的时候,这时,以上的配置都没有用武之地了,因为 Linux 服务器是有最大连接数的,同一个时 ... 阅读全文
让远程用户访问 MySQL 的步骤
为了安全,MySQL 数据库默认安装是不支持外网 ip 访问的,如果项目需要,可以配置外网 IP 访问,配置很很简单,只需两步完成配置。
以下的配置,可能会带来安全隐患,需要谨慎考虑。我的项目,由于采用了分布式的部署,服务器并不在一个内网段里,不得已只能开放外部访问了,同时我希望 MySQL 既能外部 IP 访问,也能 使用 127.0.0.1 ... 阅读全文
Ubuntu 14.04 搭建 vsftpd 服务器
需要搭建一个
独立
静态文件服务器,作为源服务器,给阿里云做 CDN 文件分发,我没有选择阿里云的 OSS 作为源存储,而是用自己的服务器。
多个应用程序选择 FTP 上传文件,到源文件服务器上。而放弃了挂载的方式,一来是集中管理,二来担心挂载出现问题,所以决定配置 FTP 服务器的方式做。我不能确定这种方式是否是最好的,在我这边 ... 阅读全文
Markdown 写接口文档不错
一直使用 Windows 作为开发环境,有一天切换到 OSX 有点不适应,另外发现使用 word 写接口文档,有点后悔,OSX 下office 难用不说,开始要找合适的代替品也有点困难,干脆寻找另类的产品试试,要求不高,就是写一些 标题 正文 和表格,有些示例,偶尔加点代码。
这些要求也许直接写html 比较好,但总不能上sublime text 吧,有点太原 ... 阅读全文