0%

首先建议大家好好阅读一下官方文章,如何利用incr命令实现一些应用模式(Pattern)。
INCR命令的介绍与应用

本文不对原文进行大段翻译,主要讲下自己的理解。

模式:计数器

Redis原子性自增操作,最明显的应用就是计数器了,类似Java的AtomicInteger。
可以结合EXPIRE,INCRBY,GET,SET,DECR等操作做很多很多事情。
多命令的情况下要注意事务或者使用Lua script哦。

模式:Rate limiter 限流器

限流器的应用

限流器的应用非常广泛,比如Github对外提供了非常丰富的API,但考虑到数据安全和系统资源,对匿名用户和经过认证的用户的请求API频率都是要有限制的。
可以看看Github API的Rate limiting
认证的用户每小时请求次数是5000,没认证的用户每小时只能请求60次,依靠原始IP来区分未认证用户。

上面介绍了一个很典型的应用场景,如果一个系统对我提供服务,开放API的话,为了防刷和系统资源的平衡,限流器的应用是很有必要的。
调用Github API返回结果的时候,response的Header里面都会带有限流的信息,这是一个非常好的设计,大致如下:

1
2
3
4
5
6
7
curl -i https://api.github.com/users/octocat
HTTP/1.1 200 OK
Date: Mon, 01 Jul 2013 17:27:06 GMT
Status: 200 OK
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 56
X-RateLimit-Reset: 1372700873

我在做网关设计中也借鉴过这种设计方式,另外也参考过spring-cloud-zuul微服务网关中的一个API限流库的代码,里面Filter的设计还是很不错的。

阅读全文 »

问题背景

在一个应用中会产生大量的业务数据,这些数据往往需要一个ID来标记,在关系型数据库中,主键往往就是这个作用。
在大多数数据库中,自增的64bit long类型主键,就是用来解决这个问题的。有时,我们必须在应用层控制ID的生成,
这时我们就要缓存下最近生成的ID是多少,以此来跟踪生成的序列。

如果数据库中的数据做了分片(shard,分库分表),那么在一个表中自增的64bit long主键显然不能适用,多个节点下
必然会发生碰撞问题。与此类似,当应用分布在多个节点运行的时候,简单在内存缓存最近的一个ID,也同样不能满足需要。

阅读全文 »

对于分布式唯一ID的生成,有几种比较好的思路,划分命名空间并行生成,是现在比较流行的一种方式,例如Twitter提出的非常有名的
Snowflake算法。与之类似的是,在很早之前,MongoDB的ObjectId生成算法就是类似的这种思路,在MongoDB的0.9.10(2009年8月24日发布)版本中就已经采用。

在最新的MongoDB-Java-Driver文档中,可以看到ObjectId的相关API说明。参考资料如下:
Class ObjectId
Source code - ObjectId.java

阅读全文 »

经常使用Jackson的同学肯定知道这个注解,
@JsonPropertyOrder(alphabetic = true)
放在类定义上,可以在该类对象序列化的时候,字段按照字母序排序。
全局的话,可以这样配置Jackson的mapper:

1
2
MAPPER.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true);
MAPPER.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS, true);

问题来了,
如果类中的字段是不确定类型的(或者说是Object类型),该类型的字段中又可以嵌套其他不确定类型,这样就不好办了,
而我要达到的需求是,所有嵌套结构内部也要按照字母序,或者叫严格的字母序。

经验证,在不使用JsonNode的情况下,MAPPER的configure可以满足大多数需求。那么,为什么要用JsonNode呢?

在数据交换的时候,例如反序列化的时候,不知道某个字段的具体类型,是否有嵌套等,用JsonNode会比Map这种好很多,Map不太好处理嵌套的情况。
也有同学提出直接使用Object也可以呀,那就会丢失太多的类型信息,内部字段和深层嵌套就更没法处理了。
使用JsonNode可以构建出树状结构,很方便的获取属性值。

1
2
3
JsonNode node = MAPPER.valueToTree(obj);
final Object obj = MAPPER.treeToValue(node, Object.class);
String json = MAPPER.writeValueAsString(obj);

参考文档:
https://stackoverflow.com/questions/18952571/jackson-jsonnode-to-string-with-sorted-keys#

鉴于生产环境的上线部署,都依赖于镜像构建、制作、部署上线运行等操作,作为一名合格的RD,当然不能只局限于在上线平台上进行一顿鼠标操作了,一定要弄懂这些基础设施内部到底在干嘛。因此,对Docker的相关学习也是很有必要的。

基础信息

http://dockone.io/article/783

http://merrigrove.blogspot.com/2015/10/visualizing-docker-containers-and-images.html

两篇文章分别是中文和英文原版,建议初学者多读几遍,收获非常大。
尤其是对镜像只读层和读写层的理解,非常重要,还有docker各个命令对各层的影响。

阅读全文 »

新建页面

执行
hexo new page 404

修改source/404/index.md

一些老的页面会出现问题,因为启用了Https后,去加载Http的样式表和JS会失败,所以要使用以下的页面代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
---
title: 404
date: 2018-08-30 14:40:55
---
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8" />
<title>404</title>
</head>
<body>
<script type="text/javascript" src="//qzonestyle.gtimg.cn/qzone/hybrid/app/404/search_children.js" homePageName="返回宝贝回家" homePageUrl="https://www.baobeihuijia.com"></script>
</body>
</html>

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

阅读全文 »

工作一年多以来,学了不少东西,也尝试了许多新东西,也成长了不少,也许只是一个粗略的记录,也希望提醒自己,还是取得了一些成绩吧,但不能骄傲,还有许多不足之处,技术永无止境,还需要更多的努力。

阅读全文 »

在国内使用Gradle的时候,由于依赖管理时经常需要从mavenCentral(maven中央仓库)和jCenter中下载lib,速度不稳定,有时还会导致build长时间卡住,有一种方法是使用Gradle的Offline模式,但前提是你已经cache了项目的依赖在本地,不然可能会Build失败,另外就是使用代理服务器,也是一种不错的选择。

在Gradle中使用代理服务器的方法:

  1. 使用以下命令行参数指定代理服务器。
    gradle -Dhttp.proxyHost=yourProxy -Dhttp.proxyPort=yourPort -Dhttp.proxyUser=usernameProxy -Dhttp.proxyPassword=yourPassoword
    阅读全文 »

最近在尝试使用一些项目管理工具,之前的文章里提到的代码质量分析工具SonarQube,比较符合使用的期望,效果也不错,还有比较早使用的持续集成工具Jenkins,

然后是缺陷跟踪工具,Bug Tracker System,比较常用的有:

  1. Redmine http://www.redmine.org/ 网站本身就是Redmine示例。
  2. Mantis http://www.mantisbt.org/ demo:http://www.mantisbt.org/bugs/my_view_page.php
  3. Atlassian JIRA https://www.atlassian.com/software/jira/ 应用广泛,有云服务版。
  4. Bugzilla https://www.bugzilla.org/
    类似的工具还有许多,可以查看wiki百科汇总 https://en.wikipedia.org/wiki/Comparison_of_issue-tracking_systems