转 - 高效的多维空间点索引算法 GeoHash 和 GoogleS2
引子每天我们晚上加班回家,可能都会用到滴滴或者共享单车。打开 app 会看到如下的界面: app 界面上会显示出自己附近一个范围内可用的出租车或者共享单车。假设地图上会显示以自己为圆心,5公里为半径,这个范围内的车。如何实现呢?最直观的想法就是去数据库里面查表,计算并查询车距离用户小于等于5公里的,筛选出来,把数据返回给客户端。 这种做法比较笨,一般也不会这么做。为什么呢?因为这种做法需要对整个表里面的每一项都计算一次相对距离。太耗时了。既然数据量太大,我们就需要分而治之。那么就会想到把地图分块。这样即使每一块里面的每条数据都计算一次相对距离,也比之前全表都计算一次要快很多。 我们也都知道,现在用的比较多的数据库 MySQL、PostgreSQL 都原生支持 B+ 树。这种数据结构能高效的查询。地图分块的过程其实就是一种添加索引的过程,如果能想到一个办法,把地图上的点添加一个合适的索引,并且能够排序,那么就可以利用类似二分查找的方法进行快速查询。 问题就来了,地图上的点是二维的,有经度和纬度,这如何索引呢?如果只针对其中的一个维度,经度或者纬度进行搜索,那搜出来一遍以后还要进行...
RAID技术的对比解析
D. A. Patterson 教授等人于1988年首次在论文 A Case of Redundant Array of Inexpensive Disks 中提出了RAID概念,即廉价冗余磁盘阵列( Redundant Array of Inexpensive Disks )。 RAID 的基本思想是将多个容量较小、相对廉价的磁盘进行有机组合,从而以较低的成本获得与昂贵大容量磁盘相当的容量、性能和可靠性。随着磁盘成本和价格的不断降低, RAID概念中的廉价已经毫无意义。因此, RAID 咨询委员会( RAID Advisory Board, RAB )决定用独立替代廉价 ,于时 RAID 变成了独立磁盘冗余阵列( Redundant Array of Independent Disks )。这里介绍了几种 RAID 的部署结构:RAID 0,RAID 1,RAID 2,RAID 3,RAID 4,RAID 5,RAID 6,RAID 7,RAID 01,RAID 10,RAID 30/53,RAID 50,RAID 60,RAID 100。 D. A. Patters...
BaseX编码规则解析
Base16、Base32、Base64 等其他的 BaseX 编码并不是一种加密方式,它们只是一种编码手段,我们可以借助一些在线的编解码工具还原成明文,因此这类编码方式不适合用于数据加密,但是我们可以使用这种编码很方便的进行数据传输与存储,因此这类编码的使用十分广泛。 一、Base161.1、编码规则:Base16编码使用16个ASCII可打印字符(数字0-9和字母A-F)对任意字节数据进行编码。 获取输入字符串每个字节的二进制值(输入的非ASCII字符,使用UTF-8字符集); 将获得的二进制值串联进来; 按照4比特为一组进行切分(8比特数据按照4比特切分刚好是两组,因此Base16无填充符号=); 将每组二进制数分别转换成十进制; 按照Base16对应的编码表将对应的编码串接起来就是Base16编码; 1.2、编码特征Base16编码后的数据量是原数据的两倍,1000比特数据需要250个字符(即 250*8=2000 比特)。换句话说:Base16使用两个ASCII字符去编码原数据中的一个字节数据。 Base16编码是一个标准的十六进制字符串(注意是...
Ngxin的限流方式
一、简介Nginx的限流的实现,可以保证高并发场景下的服务的可用性,控制网络以及CPU/内存负载,极端场景下还可以减小暴力破解对系统的危害性。Nginx本身自带了几个限流模块 : 对客户端的限流模块: ngx_http_limit_conn_module:按照连接数限流,限制单个IP的并发连接数; ngx_http_limit_req_module:按照请求速率限流,使用漏桶的方式限制请求的处理速率; 对服务端的限流模块: ngx_http_upstream_module:用于定义可以由proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, memcached_pass和 grpc_pass指令引用的服务器组; 二、限流模块2.1、ngx_http_limit_conn_module用于设置单IP最大允许的连接数,当超过该连接数,服务器将返回错误信息(默认错误码为503)。 http { limit_conn_zone $binary_remote_addr zone=one:10m; .....
rsync指令的使用与算法解析 - 每周指令
rsync命令是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。rsync使用所谓的rsync算法来使本地和远程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分,而不是每次都整份传送,因此速度相当快。 rsync是一个功能非常强大的工具,其命令也有很多功能特色选项,我们下面就对它的选项一一进行分析说明。 一、参数解析-v, --verbose 详细模式输出。-q, --quiet 精简输出模式。-c, --checksum 打开校验开关,强制对文件传输进行校验。-a, --archive 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD。-r, --recursive 对子目录以递归模式处理。-R, --relative 使用相对路径信息。-b, --backup 创建备份,也就是对于目的已经存在有同样的文件名时,将老的文件重新命名为~filename。可以使用--suffix选项来指定不同的备份文件前缀。--backup-dir 将备份文件(如~filename)存放在在目录下。-suffix=SUFFIX 定义备份文件...
译 - The rsync algorithm
《The rsync algorithm》这篇发表于 1996 年的论文中介绍了一种名为 rsync 的增量同步算法,它能够快速地将两个文件夹中的内容同步。该算法利用了文件的局部性和差异性,通过计算文件的弱校验和和块校验和来确定文件的相似性,并进行增量同步。该算法具有高效性、可靠性和安全性等优点,在实际应用中被广泛使用。 0、摘要This report presents an algorithm for updating a file on one machine to be identical to a file on another machine. We assume that the two machines are connected by a low-bandwidth high-latency bi-directional communications link. The algorithm identifies parts of the source file which are identical to some part of the destinat...
转/译-Dynamo:Amazon的高可用键值存储
本文翻译自 2007 年 Amazon 的分布式存储经典论文:《Dynamo: Amazon’s Highly Available Key-value Store》),直译为 《Dynamo:Amazon 的高可用键值存储》,这里对排版做了一些调整,以更适合 web 阅读。 Dynamo 是 Amazon 的高可用分布式键值存储(key/value storage)系统。这篇论文发表 的时候(2007)它还只是一个内部服务,现在(改名为 DynamoDB)已经发展成 AWS 最核心 的存储产品(服务)之一,与 S3 等并列。据了解,国内某一线大厂的公有云键值 存储服务,也是参考这篇文章设计和实现的。 现在提到键值存储,大家首先想到的可能是 Redis,那么 Dynamo 和 Redis 是不是竞品, 只是一个开源一个是商业的?不是的,二者针对的场景不同,这里非常粗地列举几方面: 使用场景:Dynamo 定位是永远可写(always writable)的持久文件系统,Redis 主要用作(易失)缓存或内存数据库 存储方式:Dynamo 是磁盘,Redis 是内存 系统规...
正向/反向/透明代理服务器对比
一、正向代理正向代理是一个位于客户端和目标服务器之间的服务器,为了从目标服务器取得内容,客户端需要向代理服务器发送一个请求并指定目标服务器,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。 1.1、特点 用户无法直接访问目标服务器; 客户端明确知道自己访问的是代理服务器; 隐藏真实的客户端IP; 1.2、使用场景 为防火墙(局域网)内的客户端提供访问互联网的途径; 客户端的鉴权; 提供数据缓存,访问加速服务; 1.3、相关软件 Nginx Apache Traffic Server Tinyproxy Squid Cache 二、反向代理反向代理服务器位于客户端与目标服务器之间,但是对于客户端而言,反向代理服务器就相当于目标服务器,即客户端直接访问反向代理服务器就可以获得目标服务器的资源。同时,客户端不需要知道目标服务器的地址,也无须在客户端作任何设定。 2.1、特点 客户端不知道访问的是代理服务器,客户端认为访问的就是实际的目标服务器; 目标服务器不知道访问请求来源于代理服务器。目标服务器认为发送请求的就是普通的客户端; 2.2、使用场景 网络...
Docker多阶段构建的理解与使用
在构建镜像的过程中可能会区分为编译镜像以及运行镜像,我们在编译环境中进行二进制运行文件的构建编译工作,然后将运行文件放置在运行环境中构建体积较小的运行镜像,在这个过程中,我们可能会使用到多阶段构建。 一、简介在Docker的17.05及更高的版本中支持了多阶段构建的方式,多阶段构建的方式极大的减小了需要阶段性构建的复杂度。官方介绍 - multistage-build 二、多阶段构建的前后对比2.1、使用多阶段构建之前构建Docker镜像的过程中,最具挑战性的事情就是如何保证Docker镜像的尺寸能够尽可能的小。但是在编译的过程中,我们可能会产生一些多余的中间件,但是很多情况下我们可能只需要最终的可运行的二进制文件,并不需要编译环境中的多余组件。 实际上,通常只有一个Dockerfile用于开发(包含构建应用程序所需的一切),而精简的Dockerfile用于生产时,它仅包含您的应用程序以及运行它所需的内容。这被称为“构建者模式”。维护两个Dockerfile是不理想的,并且也会十分复杂。 Dockerfile.build:用于开发构建的Dockerfile; Dockerfil...
Git使用技巧
一、分支管理二、提交日志管理 批量替换历史提交日志的用户名和邮箱信息 git filter-branch -f --env-filter 'OLD_NAME="old_name"OLD_EMAIL="old@mail.com"CORRECT_NAME="new_name"CORRECT_EMAIL="new@mail.com"if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"fiif [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]then export GIT_AUTHOR_NAME="$CORREC...

