gaojingsong http://doc.okbase.net/gaojingsong 【分布式跟踪系统Zipkin 介绍】 http://doc.okbase.net/gaojingsong/archive/265955.html gaojingsong 2018/2/4 21:20:20

zipkin为分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪。

 

Zipkin 是 Twitter 的一个开源项目,允许开发者收集 Twitter 各个服务上的监控数据,并提供查询接口。

 

Zipkin is a distributed tracing system. It helps gather timing data needed to troubleshoot latency problems in microservice architectures. It manages both the collection and lookup of this data. Zipkin’s design is based on the Google Dapper paper.

This project includes a dependency-free library and a spring-boot server. Storage options include in-memory, JDBC (mysql), Cassandra, and Elasticsearch.

 

 

zipkin主要涉及四个组件 collector storage search web UI

Collector接收各service传输的数据

Cassandra作为Storage的一种,也可以是mysql等,默认存储在内存中,配置cassandra可以参考这里

Query负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用

Web 提供简单的web界面

 

Zipkin 使用 Apache Cassandra 做为数据存储系统,使用 Apache ZooKeeper – the Hadoop configuration management software – for coordination, and Facebook's Scribe data aggregation system as the logging framework to transport the trace data.

 

zipkin作用

全链路追踪工具(根据依赖关系)

查看每个接口、每个service的执行速度(定位问题发生点或者寻找性能瓶颈)

 

zipkin工作原理

创造一些追踪标识符(tracingId,spanId,parentId),最终将一个request的流程树构建出来

 

zipkin架构



 

其中:

Collector接收各service传输的数据;

Cassandra作为Storage的一种,也可以是mysql等,默认存储在内存中,配置cassandra可以参考这里;

Query负责查询Storage中存储的数据,提供简单的JSON API获取数据,主要提供给web UI使用;

Web 提供简单的web界面;

 

zipkin分布式跟踪系统的目的:

zipkin为分布式链路调用监控系统,聚合各业务系统调用延迟数据,达到链路调用监控跟踪;

zipkin通过采集跟踪数据可以帮助开发者深入了解在分布式系统中某一个特定的请求时如何执行的;

假如我们现在有一个用户请求超时,我们就可以将这个超时的请求调用链展示在UI当中;我们可以很快度的定位到导致响应很慢的服务究竟是什么。如果对这个服务细节也很很清晰,那么我们还可以定位是服务中的哪个问题导致超时;

zipkin系统让开发者可通过一个Web前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。

  • 大小: 94.1 KB
]]> 【Redis内存策略】 http://doc.okbase.net/gaojingsong/archive/265949.html gaojingsong 2018/2/4 21:19:41

Redis最大内存的设置是通过设置maxmemory来完成的,格式为maxmemory bytes ,当目前使用的内存超过了设置的最大内存,就要进行内存释放了, 当需要进行内存释放的时候,需要用某种策略对保存的的对象进行删除。Redis有六种策略(默认的策略是noeviction)

 

Redis最大内存设置

默认情况下,在32位OS中,Redis最大使用3GB的内存,在64位OS中则没有限制。

在使用Redis时,应该对数据占用的最大空间有一个基本准确的预估,并为Redis设定最大使用的内存,

否则在64位OS中Redis会无限制地占用内存(当物理内存被占满后会使用swap空间),容易引发各种各样的问题。

通过如下配置控制Redis使用的最大内存:

maxmemory 100mb

 

在内存占用达到了maxmemory后,再向Redis写入数据时,Redis会:

1)根据配置的数据淘汰策略尝试淘汰数据,释放空间

2)如果没有数据可以淘汰,或者没有配置数据淘汰策略,那么Redis会对所有写请求返回错误,但读请求仍然可以正常执行

 

 maxmemory <bytes>

 

# MAXMEMORY POLICY: how Redis will select what to remove when maxmemory

# is reached. You can select among five behaviors:

#

# volatile-lru -> remove the key with an expire set using an LRU algorithm

# allkeys-lru -> remove any key accordingly to the LRU algorithm

# volatile-random -> remove a random key with an expire set

# allkeys-random -> remove a random key, any key

# volatile-ttl -> remove the key with the nearest expire time (minor TTL)

# noeviction -> don't expire at all, just return an error on write operations

#

# Note: with any of the above policies, Redis will return an error on write

#       operations, when there are not suitable keys for eviction.

#

#       At the date of writing this commands are: set setnx setex append

#       incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd

#       sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby

#       zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby

#       getset mset msetnx exec sort

#

# The default is:

#

# maxmemory-policy noeviction

 

 

 

 

Redis提供了下面几种淘汰策略供用户选择,其中默认的策略为noeviction策略:

1)noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。

2)allkeys-lru:在主键空间中,优先移除最近未使用的key。

3)volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。

4)allkeys-random:在主键空间中,随机移除某个key。

5)volatile-random:在设置了过期时间的键空间中,随机移除某个key。

6)volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。

 

 

淘汰策略的选择可以通过下面的配置指定:

# maxmemory-policy noeviction

]]>
【Linux之truncate 命令用法】 http://doc.okbase.net/gaojingsong/archive/265947.html gaojingsong 2018/2/4 21:19:26

truncate相关命令

用法:truncate 选项... 文件...

将文件缩减或扩展至指定大小

 

如果指定文件不存在则创建。

 

如果指定文件超出指定大小则超出的数据将丢失。

如果指定文件小于指定大小则用0 补足。

 

长选项必须使用的参数对于短选项时也是必需使用的。

  -c, --no-create 不创建文件

  -o, --io-blocks 将SIZE 视为IO 块数而不使用字节数

  -r, --reference=文件   使用此文件的大小

  -s, --size=大小 使用此大小

      --help 显示此帮助信息并退出

      --version 显示版本信息并退出

 

SIZE 可以是一个可选的整数,后面跟着以下单位中的一个:

KB 1000,K 1024,MB 1000*1000,M 1024*1024,还有 G、T、P、E、Z、Y。

 

 

指定大小也可使用以下前缀修饰:

"+" 增加,"-" 减少,"<" 至多,">" 至少,

"/" 小于等于原尺寸数字的指定数字的最小倍数,"%" 大于等于原尺寸数字的指定数字的最大倍数。

译者注:当输入值为m,参考值为n 时,

"/" 运算的数学计算式为 m / n * n;

"%" 运算的数学计算式为( m + n - 1 ) / n * n

 

 

请注意-r 和-s 是互斥的选项。

 

Linux文件清空方法总结

1、使用重定向的方法

[root@centos7 ~]# du -h test.txt 

4.0K test.txt

[root@centos7 ~]# > test.txt 

[root@centos7 ~]# du -h test.txt 

0 test.txt

 

2、使用true命令重定向清空文件

[root@centos7 ~]# du -h test.txt 

4.0K test.txt

[root@centos7 ~]# true > test.txt 

[root@centos7 ~]# du -h test.txt 

0 test.txt

 

3、使用cat/cp/dd命令及/dev/null设备来清空文件

[root@centos7 ~]# du -h test.txt 

4.0K test.txt

[root@centos7 ~]# cat /dev/null > test.txt 

[root@centos7 ~]# du -h test.txt 

 test.txt

###################################################

[root@centos7 ~]# echo "Hello World" > test.txt 

[root@centos7 ~]# du -h test.txt 

4.0K test.txt

[root@centos7 ~]# cp /dev/null test.txt 

cp:是否覆盖"test.txt"? y

[root@centos7 ~]# du -h test.txt 

 test.txt

##################################################

[root@centos7 ~]# echo "Hello World" > test.txt 

[root@centos7 ~]# du -h test.txt 

4.0K test.txt

[root@centos7 ~]# dd if=/dev/null of=test.txt 

记录了0+0 的读入

记录了0+0 的写出

0字节(0 B)已复制,0.000266781 秒,0.0 kB/秒

[root@centos7 ~]# du -h test.txt 

 test.txt

 

4、使用echo命令清空文件

[root@centos7 ~]# echo "Hello World" > test.txt 

[root@centos7 ~]# du -h test.txt 

4.0K test.txt

[root@centos7 ~]# echo -n "" > test.txt ==>要加上"-n"参数,默认情况下会"\n",也就是回车符

[root@centos7 ~]# du -h test.txt 

0 test.txt

 

5、使用truncate命令清空文件

[root@centos7 ~]# du -h test.txt 

4.0K test.txt

[root@centos7 ~]# truncate -s 0 test.txt -s参数用来设定文件的大小,清空文件,就设定为0;

[root@centos7 ~]# du -h test.txt 

0 test.txt

]]>
【区块链技术实现】 http://doc.okbase.net/gaojingsong/archive/265875.html gaojingsong 2018/1/19 9:28:55

区块链技术, 简称BT(Blockchain technology),也被称之为分布式账本技术,是一种互联网数据库技术,其特点是去中心化、公开透明,让每个人均可参与数据库记录

 

基本原理

交易(Transaction):一次操作,导致账本状态的一次改变,如添加一条记录;

区块(Block):记录一段时间内发生的交易和状态结果,是对当前账本状态的一次共识;

链(Chain):由一个个区块按照发生顺序串联而成,是整个状态变化的日志记录。

如果把区块链作为一个状态机,则每次交易就是试图改变一次状态,而每次共识生成的区块,就是参与者对于区块中所有交易内容导致状态改变的结果进行确认。

 



 

区块链技术的特征

1、开放,共识

任何人都可以参与到区块链网络,每一台设备都能作为一个节点,每个节点都允许获得一份完整的数据库拷贝。节点间基于一套共识机制,通过竞争计算共同维护整个区块链。任一节点失效,其余节点仍能正常工作。

2、去中心,去信任

区块链由众多节点共同组成一个端到端的网络,不存在中心化的设备和管理机构。节点之间数据交换通过数字签名技术进行验证,无需互相信任,只要按照系统既定的规则进行,节点之间不能也无法欺骗其它节点。

3、交易透明,双方匿名

区块链的运行规则是公开透明的,所有的数据信息也是公开的,因此每一笔交易都对所有节点可见。由于节点与节点之间是去信任的,因此节点之间无需公开身份,每个参与的节点都是匿名的。

4、不可篡改,可追溯

单个甚至多个节点对数据库的修改无法影响其他节点的数据库,除非能控制整个网络中超过51%的节点同时修改,这几乎不可能发生。区块链中的每一笔交易都通过密码学方法与相邻两个区块串联,因此可以追溯到任何一笔交易的前世今生。

  • 大小: 151.6 KB
]]> 【TLS协议】 http://doc.okbase.net/gaojingsong/archive/265874.html gaojingsong 2018/1/19 9:28:44

TLS:安全传输层协议

TLS:Transport Layer Security

安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。

该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)

 

概况

安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。该协议由两层组成: TLS 记录协议(TLS Record)和 TLS 握手协议(TLS Handshake)。较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面,与具体的应用无关,所以,一般把TLS协议归为传输层安全协议。

协议结构

TLS协议包括两个协议组―― TLS 记录协议和 TLS 握手协议――每组具有很多不同格式的信息。

TLS 记录协议是一种分层协议。每一层中的信息可能包含长度、描述和内容等字段。记录协议支持信息传输、将数据分段到可处理块、压缩数据、应用 MAC 、加密以及传输结果等。对接收到的数据进行解密、校验、解压缩、重组等,然后将它们传送到高层客户机。

TLS 连接状态指的是TLS 记录协议的操作环境。它规定了压缩算法、加密算法和 MAC 算法。

TLS 记录层从高层接收任意大小无空块的连续数据。密钥计算:记录协议通过算法从握手协议提供的安全参数中产生密钥、 IV 和 MAC 密钥。TLS 握手协议由三个子协议组构成,允许对等双方在记录层的安全参数上达成一致、自我认证、例示协商安全参数、互相报告出错条件。

记录协议

TLS记录协议位于TLS握手协议的下面,在可靠的传输协议(如TCP/IP)上面。TLS记录协议的一条记录包含长度字段、描述字段和内容字段。TLS记录协议处理数据的加密,即记录协议得到要发送的消息之后,将数据分成易于处理的数据分组,进行数据压缩处理(可选),计算数据分组的消息认证码MAC,加密数据然后发送数据;接收到的消息首先被解密,然后校验MAC值,解压缩,重组,最后传递给协议的高层客户。记录协议有四种类型的客户:握手协议、警告协议、改变密码格式协议和应用数据协议。通常使用一个对称算法,算法的密钥由握手协议提供的值生成。

TLS 记录协议提供的连接安全性具有两个基本特性:

私有――对称加密用以数据加密(DES 、RC4 等)。对称加密所产生的密钥对每个连接都是唯一的,且此密钥基于另一个协议(如握手协议)协商。记录协议也可以不加密使用。

可靠――信息传输包括使用密钥的 MAC 进行信息完整性检查。安全哈希功能( SHA、MD5 等)用于 MAC 计算。记录协议在没有 MAC 的情况下也能操作,但一般只能用于这种模式,即有另一个协议正在使用记录协议传输协商安全参数。

TLS 记录协议用于封装各种高层协议。作为这种封装协议之一的握手协议允许服务器与客户机在应用程序协议传输和接收其第一个数据字节前彼此之间相互认证,协商加密算法和加密密钥。

握手协议

TLS握手协议处理对等用户的认证,在这一层使用了公共密钥和证书,并协商算法和加密实际数据传输的密钥,该过程在TLS记录协议之上进行。TLS握手协议是TLS协议中最复杂的部分,它定义了10种消息,客户端和服务器利用这10种消息相互认证,协商哈希函数和加密算法并相互提供产生加密密钥的机密数据。TLS记录协议会在加密算法中用到这些加密密钥,从而提供数据保密性和一致性保护。

TLS 握手协议提供的连接安全具有三个基本属性:

1.可以使用非对称的,或公共密钥的密码术来认证对等方的身份。该认证是可选的,但至少需要一个结点方。

2.共享加密密钥的协商是安全的。对偷窃者来说协商加密是难以获得的。此外经过认证过的连接不能获得加密,即使是进入连接中间的攻击者也不能。

3.协商是可靠的。没有经过通信方成员的检测,任何攻击者都不能修改通信协商。

TLS握手协议:

1.改变密码规格协议

2.警惕协议

3.握手协议

综述

TLS 的最大优势就在于:TLS 是独立于应用协议。高层协议可以透明地分布在 TLS 协议上面。然而,TLS 标准并没有规定应用程序如何在 TLS 上增加安全性;它把如何启动 TLS 握手协议以及如何解释交换的认证证书的决定权留给协议的设计者和实施者来判断。

TLS包含三个基本阶段:

1.对等协商支援的密钥算法

2.基于私钥加密交换公钥、基于PKI证书的身份认证

3.基于公钥加密的数据传输保密

 



 

不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。

(1) 切听风险(eavesdropping):第三方可以获知通信内容。

(2) 篡改风险(tampering):第三方可以修改通信内容。

(3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。

SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

(1) 所有信息都是加密传播,第三方无法切听

(2) 具有校验机制,一旦被篡改,通信双方会立刻发现。

(3) 配备身份证书,防止身份被冒充。

 

 

 

SSL协议提供的服务主要有:

  1)认证用户和服务器,确保数据发送到正确的客户机和服务器;

  2)加密数据以防止数据中途被窃取;

  3)维护数据的完整性,确保数据在传输过程中不被改变。

SSL协议的工作流程:

  服务器认证阶段:

  1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;

  2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;

  3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;

  4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

  • 大小: 43.2 KB
]]> 【SQL注入原理】 http://doc.okbase.net/gaojingsong/archive/265868.html gaojingsong 2018/1/19 9:26:21

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意的)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

 

 

原理

SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

根据相关技术原理,SQL注入可以分为平台层注入和代码层注入。前者由不安全的数据库配置或数据库平台的漏洞所致;后者主要是由于程序员对输入未进行细致地过滤,从而执行了非法的数据查询。基于此,SQL注入的产生原因通常表现在以下几方面:①不当的类型处理;②不安全的数据库配置;③不合理的查询集处理;④不当的错误处理;⑤转义字符处理不合适;⑥多个提交处理不当。

 

攻击

当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

 

 

防护

归纳一下,主要有以下几点:

1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和

双"-"进行转换等。

2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。

3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。

4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。

5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装

6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。

 

 

语句特征

1.判断有无注入点

; and 1=1 and 1=2

2.猜表一般的表的名称无非是admin adminuser user pass password 等..

and 0<>(select count(*) from *)

and 0<>(select count(*) from admin) ---判断是否存在admin这张表

3.猜帐号数目 如果遇到0< 返回正确页面, 1<返回错误页面,说明帐号数目就是1个

and 0<(select count(*) from admin)

and 1<(select count(*) from admin)

4.猜解字段名称 在len( ) 括号里面加上我们想到的字段名称.

and 1=(select count(*) from admin where len(*)>0)--

and 1=(select count(*) from admin where len(用户字段名称name)>0)

and 1=(select count(*) from admin where len(密码字段名称password)>0)

5.猜解各个字段的长度 猜解长度就是把>0变换 直到返回正确页面为止

and 1=(select count(*) from admin where len(*)>0)

and 1=(select count(*) from admin where len(name)>6) 错误

and 1=(select count(*) from admin where len(name)>5) 正确 长度是6

and 1=(select count(*) from admin where len(name)=6) 正确

and 1=(select count(*) from admin where len(password)>11) 正确

and 1=(select count(*) from admin where len(password)>12) 错误 长度是12

and 1=(select count(*) from admin where len(password)=12) 正确

6.看服务器打的补丁=出错了打了SP4补丁

and 1=(select @@VERSION)--

7.看数据库连接账号的权限,返回正常,证明是服务器角色sysadmin权限。

and 1=(SELECT IS_SRVROLEMEMBER(sysadmin))--

8判断连接数据库帐号。(采用SA账号连接 返回正常=证明了连接账号是SA)

and sa=(SELECT System_user)--

and user_name()=dbo--

and 0<>(select user_name()--

]]>
【Sphinx 介绍】 http://doc.okbase.net/gaojingsong/archive/265867.html gaojingsong 2018/1/19 9:26:14

Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。Sphinx特别为一些脚本语言设计搜索API接口,如PHP,Python,Perl,Ruby等,同时为MySQL也设计了一个存储引擎插件。

Sphinx 单一索引最大可包含1亿条记录,在1千万条记录情况下的查询速度为0.x秒(毫秒级)。Sphinx创建索引的速度为:创建100万条记录的索引只需 3~4分钟,创建1000万条记录的索引可以在50分钟内完成,而只包含最新10万条记录的增量索引,重建一次只需几十秒。

Sphinx的主要特性包括:

高速索引 (在新款CPU上,近10 MB/秒); 高速搜索 (2-4G的文本量中平均查询速度不到0.1秒); 高可用性 (单CPU上最大可支持100 GB的文本,100M文档); 提供良好的相关性排名 支持分布式搜索; 提供文档摘要生成; 提供从MySQL内部的插件式存储引擎上搜索 支持布尔,短语, 和近义词查询; 支持每个文档多个全文检索域(默认最大32个); 支持每个文档多属性; 支持断词; 支持单字节编码与UTF-8编码;

 

 

Sphinx的工作原理

Sphinx的整个工作流程就是Indexer程序到数据库里面提取数据,对数据进行分词,然后根据生成的分词生成单个或多个索引,并将它们传递给searchd程序。然后客户端可以通过API调用进行搜索。

 

 

为什么使用Sphinx

遇到一个类似这样的需求:用户可以通过文章标题和文章搜索到一片文章的内容,而文章的标题和文章的内容分别保存在不同的库,而且是跨机房的。

 

可选方案

A、直接在数据库实现跨库LIKE查询

优点:简单操作 缺点:效率较低,会造成较大的网络开销

 

B、结合Sphinx中文分词搜索引擎

优点:效率较高,具有较高的扩展性 缺点:不负责数据存储

 

使用Sphinx搜索引擎对数据做索引,数据一次性加载进来,然后做了所以之后保存在内存。这样用户进行搜索的时候就只需要在Sphinx服务器上检索数据即可。而且,Sphinx没有MySQL的伴随机磁盘I/O的缺陷,性能更佳。

其他典型使用场景

1、快速、高效、可扩展和核心的全文检索

数据量大的时候,比MyISAM和InnoDB都要快。 能对多个源表的混合数据创建索引,不限于单个表上的字段。 能将来自多个索引的搜索结果进行整合。 能根据属性上的附加条件对全文搜索进行优化。

 

2、高效地使用WHERE子句和LIMIT字句

当在多个WHERE条件做SELECT查询时,索引选择性较差或者根本没有索引支持的字段,性能较差。sphinx可以对关键字做索引。区别是,MySQL中,是内部引擎决定使用索引还是全扫描,而sphinx是让你自己选择使用哪一种访问方法。因为sphinx是把数据保存到RAM中,所以sphinx不会做太多的I/O操作。而mysql有一种叫半随机I/O磁盘读,把记录一行一行地读到排序缓冲区里,然后再进行排序,最后丢弃其中的绝大多数行。所以sphinx使用了更少的内存和磁盘I/O。

 

3、优化GROUP BY查询

在sphinx中的排序和分组都是用固定的内存,它的效率比类似数据集全部可以放在RAM的MySQL查询要稍微高些。

 

4、并行地产生结果集

sphinx可以让你从相同数据中同时产生几份结果,同样是使用固定量的内存。作为对比,传统SQL方法要么运行两个查询,要么对每个搜索结果集创建一个临时表。而sphinx用一个multi-query机制来完成这项任务。不是一个接一个地发起查询,而是把几个查询做成一个批处理,然后在一个请求里提交。

 

5、向上扩展和向外扩展

向上扩展:增加CPU/内核、扩展磁盘I/O 向外扩展:多个机器,即分布式sphinx

 

6、聚合分片数据

适合用在将数据分布在不同物理MySQL服务器间的情况。 例子:有一个1TB大小的表,其中有10亿篇文章,通过用户ID分片到10个MySQL服务器上,在单个用户的查询下当然很快,如果需要实现一个归档分页功能,展示某个用户的所有朋友发表的文章。那么就要同事访问多台MySQL服务器了。这样会很慢。而sphinx只需要创建几个实例,在每个表里映射出经常访问的文章属性,然后就可以进行分页查询了,总共就三行代码的配置。

]]>
【纠错算法之单词拼写错误场景】 http://doc.okbase.net/gaojingsong/archive/265797.html gaojingsong 2017/12/24 12:08:31

/**

 * http://gaojingsong.iteye.com/

 * @author gaojingsong

 * 单词拼写错误的几种基本场景:

 * 例如 father

 * 1、fther   漏掉字母           -->补救措施:插入字母

 * 2、faather 多写一个字母 -->补救措施:删除字母

 * 3、ftaher  字母写反          -->补救措施:交换字母

 * 4、fcther  字母写错          -->补救措施:替换字母

 */

参考代码如下

package cn.com.test.mathoutDemo;

import java.util.HashSet;
import java.util.Set;
/**
 * http://gaojingsong.iteye.com/
 * @author gaojingsong
 * 单词拼写错误的几种基本场景:
 * 例如 father
 * 1、fther   漏掉字母           -->补救措施:插入字母
 * 2、faather 多写一个字母 -->补救措施:删除字母
 * 3、ftaher  字母写反          -->补救措施:交换字母
 * 4、fcther  字母写错          -->补救措施:替换字母
 */
public class SpellCorrect {

    private static String alphabet = "abcdefghijklmnopqrstuvwxyz";

    public static Set edit(String word) {
        if (word == null)
            return null;
        Set out = new HashSet();
        // delete
        for (int i=0; i<word.length(); ++i) {
            String wd = word.substring(0,i) + word.substring(i+1,word.length());
            out.add(wd);
        }
        // insert
        for (int i=0; i<=word.length(); ++i) {
            for (int j=0; j<alphabet.length(); ++j) {
                char c = alphabet.charAt(j);
                String wd = word.substring(0,i) + c + word.substring(i,word.length());
                out.add(wd);
            }
        }
        // replace
        for (int i=0; i<word.length(); ++i) {
            for (int j=0; j<alphabet.length(); ++j) {
                char c = alphabet.charAt(j);
                String wd = word.substring(0,i) + c + word.substring(i+1,word.length());
                out.add(wd);
            }
        }
        // transpose
        for (int i=1; i<word.length(); ++i) {
            char c1 = word.charAt(i-1);
            char c2 = word.charAt(i);
            String wd = word.substring(0,i-1) + c2 + c1 + word.substring(i+1,word.length());
            out.add(wd);
        }

        return out;
    }

    public static void main(String[] args) {
    	/**
    	 * http://gaojingsong.iteye.com/
    	 * @author gaojingsong
    	 * 单词拼写错误的几种基本场景:
    	 * 例如 father
    	 * 1、fther   漏掉字母           -->补救措施:插入字母
    	 * 2、faather 多写一个字母 -->补救措施:删除字母
    	 * 3、ftaher  字母写反          -->补救措施:交换字母
    	 * 4、fcther  字母写错          -->补救措施:替换字母
    	 */
        String word = "tao";
        System.out.println( edit(word) );
    }
}


 

 
  • 大小: 59.2 KB
  • 大小: 66.2 KB
]]> 【activiti工作流数据库表详细介绍】 http://doc.okbase.net/gaojingsong/archive/265778.html gaojingsong 2017/12/24 11:44:21

Activiti的后台是有数据库的支持,所有的表都以ACT_开头。 第二部分是表示表的用途的两个字母标识。 用途也和服务的API对应。

 

ACT_RE_*: 'RE'表示repository 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。

ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。

ACT_ID_*: 'ID'表示identity 这些表包含身份信息,比如用户,组等等。

ACT_HI_*: 'HI'表示history 这些表包含历史数据,比如历史流程实例, 变量,任务等等。

ACT_GE_*: 通用数据, 用于不同场景下,如存放资源文件。

 

 

资源库流程规则表

1) act_re_deployment 部署信息表

2) act_re_model  流程设计模型部署表

3) act_re_procdef  流程定义数据表

 

运行时数据库表

1) act_ru_execution运行时流程执行实例表

2) act_ru_identitylink运行时流程人员表,主要存储任务节点与参与者的相关信息

3) act_ru_task运行时任务节点表

4) act_ru_variable运行时流程变量数据表

5) act_ru_event_subscr    throwEvent、catchEvent时间监听信息表

 

6) act_ru_job   运行时定时任务数据表

 

历史数据库表

1) act_hi_actinst 历史节点表

2) act_hi_attachment历史附件表

3) act_hi_comment历史意见表

4) act_hi_identitylink历史流程人员表

5) act_hi_detail历史详情表,提供历史变量的查询

6) act_hi_procinst历史流程实例表

7) act_hi_taskinst历史任务实例表

8) act_hi_varinst历史变量表

 

组织机构表

1) act_id_group用户组信息表

2) act_id_info用户扩展信息表

3) act_id_membership用户与用户组对应信息表

4) act_id_user用户信息表

这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足

 

通用数据表

1) act_ge_bytearray二进制数据表

2) act_ge_property属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,

 

]]>
【纠错算法】 http://doc.okbase.net/gaojingsong/archive/265764.html gaojingsong 2017/12/24 11:40:16

纠错算法(Error correction algorithm)是建立在概率统计的基础上的:出现2个差错的概率远小于出现1个差错的概率,而出现3个差错的概率又远小于出现2个差错的概率。从而有理由认为:当接收到的代码是一个非法的代码时,它的正确代码应该是在逻辑空间中离它最近的有效代码。

 

工作原理

汉明码

如果某种编码的合法代码之间的最小码距为1(所有的顺序编码都是如此),显然没有检错能力,更没有纠错能力。要想使得其具有纠错能力,必须进行改造,或者按某种纠错码格式重新编码,或者在原编码的基础上附加一部分代码,使其满足纠错码的条件。后一种方法比较方便,只是在发送时临时附加一部分代码,接收端利用它进行纠错处理后就舍弃,使原代码部分维持不变,汉明码就是这一类型的纠错码。

 

检二纠一码

包含4位有效信息的汉明码只能发现并纠正一个差错,如果出现两个差错,就会被它强行“纠正”成另外一个合法代码,造成不被发现的错误。例如发方将十六进制数6按7位汉明码66H发出,在接收过程中如果出现两个差错而变成60H,经纠错处理使得到68H,还原后就成为十六进制数8,这就产生了错误。能否进一步提高编码的性能,使它在出现两个差错时能够及时发现而不乱加纠正呢?根据检错理论,只要将有效编码之前的最小码距加大到4就可以达到这个目的,这就是“检二纠一码”。

7位汉明码在实际使用中是用1字节来表示的,如果把浪费了的1位也利用起来,无疑会进一步提供抗干扰性能。

要想在不加大码距的前提下,纠正连续多位差错,提供抵抗突发干扰的能力,方法就是将编码后的汉明码重新进行组织排列。以16位的汉明码为例,把11字节的数据编码为16字节的汉明码后再按高低字节分成两组。把每组字节8个汉明码的第1位分别取出,组成1字节;然后再把这8字节吗的第2位取出,组成第2字节;依此类推,将这组8字节汉明码处理完毕,得到新的8字节编码。只要在纠错前把受干扰的编码恢复原来正常的排列顺序,就可通过计算校验码完成差错的定位及纠错

 

 

 常见的英文单词纠错法有:,主要有误拼词典法、词形距离法、最小编辑距离法、相似键法、骨架键法、N-gram法、基于规则的技术、词典及神经网络技术。

(1)误拼字典法。收集大规模真实文本中拼写出错的英文单词并给出相应的正确拼写,建造一个无歧义的误拼字典。在进行英文单词拼写检查时,查找误拼字典,如命中,则说明该单词拼写有误,该词的正确拼写字段为纠错建议。该方法的特点是侦错和纠错一体化,效率高。但英文拼写错误具有随机性,很难保证误拼字典的无歧义性和全面性,因此查准率低、校对效果差。

(2)词形距离法。这是一种基于最大相似度和最小串间距离的英文校对法。其核心思想是构造单词的似然性函数,如该单词在词典中,则单词拼写正确;否则,按照似然性函数,在词典中找到一个与误拼单词最相似的词作为纠错候选词。该方法的特点是节省存储空间,能反映一定的常见拼写错误统计规律,是一种模糊校对法。

(3)最小编辑距离法。通过计算误拼字符串与词典中某个词间的最小编辑距离来确定纠错候选词。所谓最小编辑距离是指将一个词串转换为另一个词串所需的最少的编辑操作次数(编辑操作是指插入、删除、易位和替换等)。还有人提出了反向最小编辑距离法,这种方法首先对每个可能的单个错误进行交换排列,生成一个候选集,然后,通过查词典看哪些是有

效的单词,并将这些有效的单词作为误拼串的纠错建议。

(4)相似键法。相似键技术是将每个字符串与一个键相对应。使那些拼写相似的字符串具有相同或相似的键。当计算出某个误拼字符串的键值之后,它将给出一个指针。指向所有与该误拼字符串相似的单词,并将它们作为给误拼字符串的纠错建议。

(5)骨架键法。通过构建骨架键词典,在英文单词出现错误时,先抽取出该错误单词的骨架键,然后再去查骨架键词典,将词典中与该单词具有相同骨架键的正确单词作为该单词的纠错建议。

(6)N-gram法。基于n元文法,通过对大规模英文文本的统计得到单词与单词问的转移概率矩阵。当检测到某英文单词不在词典中时。查转移概率矩阵,取转移概率大于某给定阈值的单词为纠错建议。

(7)基于规则的技术。利用规则的形式将通常的拼写错误模式进行表示,这些规则可用来将拼写错误蛮换为有效的单词。对于一个误拼字符串,应用所有合适的规则从词典中找到一些与之对应的单词作为结果,并对每个结果根据事先赋予生成它的规则的概率估计计算一个数值,根据这个数值对所有候选结果排序。

]]>