记录历史:持久化数据结构

文本编辑器里的 "undo" 和 "redo",数据库系统的 MVCC,git 的历史记录,mac 的 Time Machine,等等功能,他们都有一个共同点,就是记录历史。这个功能依赖一种数据结 构:持久化数据结构 (Persistent data structure)。持久化数据结构记录所有历史版本, 你可以读取任…

正则表达式

正则表达式,是计算机科学史上闪闪发光的优秀理论:有好的理论,好的代码, 好的程序,应用广泛。70 年代末,正则表达式已经成为 unix 的关键特性,并 且拥有大量以正则表达式为主要功能的优秀程序: ed, sed, grep, egrep, awk, lex。如今,正则表达式在程序设计中被广泛使用。

leveldb 的缓存结构

Leveldb 实现了key-value形式的缓存,淘汰算法是LRU。实现代码在 leveldb/util/cache.cc,一共400行,非常简洁。我曾以为他提供的一些逻辑是多余的,在 工作中遇到同样需求时尝试精简这个实现,后来发现我是错的,最终只改了注释上的拼写错 误。

leveldb 日常使用

leveldb是个由Google开发key-value数据库,具有很高的写性能,但是读比较慢。现实世界 大多数应用都是写多读少的,所以有人用leveldb作为数据库的存储引擎。直接使用leveldb 的项目比较少见,最常见的是使用 rocksdb,rocksdb是facebook基于leveldb的项目,做了 一些优化…

高可用和数据库冗余实践

在真实世界中,任何电子原件或软件系统都会故障。为了在混乱的世界里寻得一 丝安心,提出了高可用的概念。高可用 (High availability, HA) 是互联网时 代常被提及的词语。在产品设计、开发、发布、交付过程中,通常都会提到一个 系统的可用性,提到系统是否保证高可用。本文介绍高可用的意义,而后演示一 个系统…

doxygen 中文文档生成和 latex 设置

一直使用 doxygen 生成 C 程序库的文档,还是相对简单的,只要按照它的注释格式给每个 符号写注释就可以。 有一个人忽然说要中文的PDF文档,别的格式还不行,确实折腾了一番。 主要是因为 latex 的中文支持我到现在都没明白。 这里把整个支持的过程记录下来,希望 能对有相同需求的朋友提供帮助。

libevent 源码分析:数据缓冲结构 evbuffer

网络程序的开发少不了缓冲区,用来保存即将发送出去的数据,以及已经收到但尚未处理或 解码的数据。实现方法大同小异,libevent 的缓冲区实现也跟其它实现有很多共通之处, 了解它的实现,可以达到举一反三的目的,对今后根据业务需要实现自己的缓冲区也有一些 借鉴作用。

如何处理 SYN

SYN 是 TCP 三次握手的一部分,开发网络应用时通常不会关注,但它与请求中偶发 的长时延 (latency spike) 密切相关,是服务器维护环节中不可忽视的重要部分。如果 SYN 在发送过程中丢包了,通常客户端会在 1s, 3s, 7s, 15s, 31s 后重,这就是长延迟 的来源之一。备受游戏公司困扰的 S…

XSS 攻防实践

本以为 Web 技术发展那么久,XSS、SQL注入、CSRF 这类过去常见的漏洞已经被处理得很好 了。最近工作发现并不是这样的,可能就是因为框架和工具把这些事情做得很好了,大家都 忘记了这些漏洞的存在,及时使用了框架也没有把它们提供的漏洞预防功能使用起来。我觉 得即使是今天,了解常见的安全漏洞类型也是必要的。

一致性哈希的原理和历史

一致性哈希是现代分布式系统最常用的算法,它能让数据节点增减变化时,尽可 能地保持原来再某个节点上的数据仍然还在那个节点上。最初,一致性哈希被应用 peer-to-peer 网络上,最开始是Chord,后来也被用在 BitTorrent 上。如今, 所有的分布式数存储都用了,大概是 Amazon 的 Dynamo 的文章…

JWT 简介、陷阱及建议

JSON Web Token (JWT, 发音为 "jot") 是一个附带签名的字符串,常常作为服务调用的令牌。作为令牌时, 由于 JWT 可以附带 Session 信息,可以简化服务逻辑,在微服务结构盛行的今天应用广泛。 互联网上单点登录和身份管理的通用标准 OpenID Connect 也使用 JWT 作为身份令牌…

以实例说明 OAuth2

OAuth2 是互联网中广泛使用的授权标准,常用于实现单点登录、第三方授权。虽然当前有 更完善的流程,但国内主要还是使用OAuth标准。国内一些服务商的OAuth是自己修改过的, 没有依照标准文档实现,经常发生标准库没办法完成授权的情况,不知意欲何为,使用时还 是需要依照服务商的开发文档。