Solr 初探(3)——配置 IK 分词器
Solr 配置第三方分词器也是十分简单,这里以IK分词器为例。点击下载我自编译的 IK 分词器,支持到 JDK 1.8 + Lucene 6.6.2。
Step1: 将 IK 分词器的jar包放到 D:\apache-tomcat-8.5.16\webapps\solr\WEB-INF\lib 目录下。
Step2: 将 IK 分词器的配置文件放到 D:\apache-tomcat-8.5.16\webapps\solr\WEB-INF\classes 文件夹下,文件夹如果不存在手动创建:
这三个配置文件作用及内容不再赘述,查看文章:《Lucene初探——基于Lucene 6.6.2》
Step3: 在 managed-schema 配置文件中添加IK分词器的类型,以及创建使用 IK 分词器的域:
12345678<!-- IK分词器 --><fieldType name="text_ik" class="solr.TextField"> <analyzer class="org.wltea.analy ...
Solr 初探(2)——域管理
在上一节中,我们已经成功搭建了 Solr 后台,并且在后台中新建了一个核(core),本节将介绍Solr配置域。
我们在后台系统中选择 core1,点击 Documents,在里面添加一个 Document(文档),内容如下:
1{"id":"1","name":"jitwxs"}
点击 Submit 按钮执行成功:
然后选择 Query,查询条件设为 *.*,即查询所有,就可以看见我们刚刚插入的 Doucment:
在《Lucene 初探——基于 Lucene 6.6.2》这篇文章中,我们已经知道了一个 Document 中可以有多个域(field),这里的 id 和 name 就是这个文档的域。
我们打开 core1 的 conf 文件夹,其中有两个重要的配置文件需要我们掌握,一个是 managed-schema,一个是 solrconfig.xml,其中是 managed-schema 就是 Solr 对域的配置文件。
一、field 和 fieldType
打开 man ...
Redis 初探(8)——Redis 的实际应用
在《Redis初探(7)——Jedis操纵集群》中,我们已经学会了搭建 Redis 集群,以及使用策略模式,在xml文件中灵活切换单机版和集群版。
本章将演示在宜立方商城项目中使用 Redis,项目地址:e3mall。
一、功能需求
商城首页访问量巨大,因为首页的大轮播图是从数据库查询获取的,每次访问都要查询一次数据库,数据库压力巨大,亟需缓存。
二、功能实现
实现之前首先思考 Redis 是要加在 Service 层还是 Web 层。理论上来说都可以,但是加在 Web 层的话,其他 Web 去调用 Service 还是得去查数据库,因此我们加在 Service 层。
其次思考使用什么数据类型,我们使用哈希类型,field 为类别的 id,value 为对应查询的查询内容。
2.1 配置文件 cfg.properties
首先在配置文件中加入 Redis 相关的信息,最后一项 redis.CONTENT_KEY 为我们首页轮播图缓存的 key 值:
cfg.properties123456789101112131415161718192021#Redis单机redis.stan ...
Redis 初探(7)——Jedis 操纵集群
在《Redis 初探(2)——Jedis 的使用》中,我们已经学会了Jedis操纵单机Redis的简单使用,本章将继续深入,介绍Jedis对集群的操纵。
一、Jedis 连接单机
在开始介绍 Jedis 连接集群之前,先简单回顾下连接单机的使用。
1.1 简单使用
123456789101112@Testpublic void testJedis() { // 1.获得连接对象。参数为redis所在的服务器地址及端口号 Jedis jedis = new Jedis("192.168.30.155", 6379); // 2.获得数据 String age = jedis.get("age"); System.out.println(age); jedis.close();}
1.2 使用连接池
123456789101112131415161718192021222324@Testpublic void testJedisPool() { //1. 创建Jedis连接 ...
Redis 初探(6)——Redis 集群
之前我们所学习的都是 Redis 的单机版,我们知道 Redis 之所以读取速度快是因为它是存储在内存中的。内存的容量是有限的,单台 Redis 会碰到性能瓶颈,这就需要使用 Redis集群(Redis-cluster)。
一、集群原理
1.1 集群架构
如上图所示,每一个蓝色圆圈就是一个 Redis 节点,这些节点组成了一个 Redis集群(Redis-cluster)。节点之间使用 Ping——Pong 机制进行互联,其内部用二进制协议优化传输速度和带宽。
Redis客户端和节点直接连接即可,无需中间件,一台客户端连接一个节点即可,Client 访问时直接访问任意一个Redis节点即可。
1.2 负载均衡
当我们搭建了集群后,其是如何实现负载均衡的呢?
Redis 集群中内置了 16384 个哈希槽(slot),它会把所有的物理节点都映射到**[0,16383]**的slot上。
当我们需要在Redis集群中放置了个 key-value 时,Redis 先对 key 使用 crc16 算法得出一个结果,然后将结果对16384取余,这样每一个 key 都会对应一个编号在0 ~ ...
最长上升子序列(LIS)算法
理解:该子序列中后一项都比前一项大,例如有序列2 7 1 5 6 4 3 8 9,则最长上升子序列为2 5 6 8 9。
**具体应用:**用于确定一个代价最小的调整方案,使一个序列变为升序。只需要固定LIS中的元素,调整其他元素即可。
动态规划实现 O(n2)
我们将序列存入数组a中,定义一个dp数组,存放最大长度。
2 7 1 5 6 4 3 8 9
我们能够得出一个规律:
dp[i] = 前面value值中小于当前value值的dp最大值+1。
i
value
dp
0
2
dp[0] = 1
1
7
dp[1] = dp[0] + 1 = 2
2
1
dp[2] = dp[0] = 1
3
5
dp[3] = dp[0] + 1 = 2
4
6
dp[4] = dp[3] + 1 = 3
5
4
dp[5] = dp[0] + 1 = 2
6
3
dp[6] = dp[0] + 1 = 2
7
8
dp[7] = dp[4] + 1 = 4
8
9
dp[8] = dp[7] + 1 = 5
根据规律,可以推出上表,最终 ...
最长公共子序列(LCS)算法
一、最长公共字串与最长公共子序列
1.1 最长公共子串(Longest Common Substirng)
子串是串的一个连续的部分,子串中字符的位置必须连续。
例如:有两个字符串**ABCBDAB **和 BDCABA,则它们的最长公共子串是:AB。
1.2 最长公共子序列(Longest Common Subsequence,LCS)
子序列是从串中去掉任意的元素而获得新的序列,子串中字符的位置不必连续。
例如:有两个字符串**ABCBDAB **和 BDCABA,则它们的最长公共子序列是:BCAB。
二、LCS算法
2.1 生成矩阵
创建一个大小为str1_len×str2_len的矩阵,其中str1_len和str2_len分别为串str1和串str2的长度,初始化为0。
按照以下规则生成矩阵:
i和j分别从1开始,i++,j++循环:
如果str1[i] == str2[j],则L[i,j] = L[i - 1, j -1] + 1;
如果str1[i] != str2[j],则L[i,j] = max{L[i,j - 1],L[i - 1, j] ...
最小生成树(Prim)算法
算法思想
假设G=<V,E>是连通图,TE是G上最小生成树中边的集合。
算法从U={u0}(u0∈V),TE={ }开始,任取一个顶点u0作为开始点。
重复执行下述操作:在所有u∈U, v∈V-U的边(u,v)∈E中找一条代价最小的边(u0,v0)并入集合TE,同时v0并入U,直至U=V为止。
注意: 选择最小边时,可能有多条同样权值的边可选,此时任选其一。
代码实现
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364public class Prim{ /** * 最小生成树的PRIM算法 * @param graph 图 * @param start 开始节点 * @param n 图中节点数 */ public static void PRIM(double [][] g ...
最短路径(Dijkstra)算法
一、算法功能
给定一个出发点(单源点)和一个有向网G=(V, E), 求出源点到其它各顶点之间的最短路径。
二、算法思想
(1)把图中顶点集合分成两组,第一组为集合S,存放已求出其最短路径的顶点,第二组为尚未确定最短路径的顶点集合是V-S(令W=V-S),其中V为网中所有顶点集合。
(2)按最短路径长度递增的顺序逐个把W中的顶点加到S中,直到S中包含全部顶点,而W为空。
(3)在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到W中任何顶点的最短路径长度。
(4)此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,W中的顶点的距离从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
三、实现步骤
(1)初始时,S只包含源点,S={v},v的距离为0。U包含除v外的其他顶点,U中顶点的距离为顶点的权或∞ 。
(2)从U中选取一个距离最小的顶点k,把k加入到S中。
(3)以k 作为新考虑的中间点,修改U中各顶点的距离。
(4)重复步骤(1)、(2)直到所有顶点都包含在S中。
四、举例
求v0到其它各点的最短路径:
答:最短路径 ...
Java 反序列化漏洞分析
2015年11月6日FoxGlove Security安全团队的@breenmachine 发布了一篇长博客,阐述了利用Java反序列化和Apache Commons Collections这一基础类库实现远程命令执行的真实案例,各大Java Web Server纷纷躺枪,这个漏洞横扫WebLogic、WebSphere、JBoss、Jenkins、OpenNMS的最新版。而在将近10个月前, Gabriel Lawrence 和Chris Frohoff 就已经在AppSecCali上的一个报告里提到了这个漏洞利用思路。
目前,针对这个"2015年最被低估"的漏洞,各大受影响的Java应用厂商陆续发布了修复后的版本,Apache Commons Collections项目也对存在漏洞的类库进行了一定的安全处理。但是网络上仍有大量网站受此漏洞影响。
一、认识Java序列化与反序列化
1.1 定义
序列化就是把对象的状态信息转换为字节序列(即可以存储或传输的形式)过程。
反序列化即逆过程,由字节流还原成对象。
注: 字节序是指多字节数据在计算机内存中存储或者网络传 ...