读心术
这是一个古老的小游戏,请从以下牌中任意选择一张你喜欢的并把它记在心里,接下来,我会问你几个问题,你只需回答“是”或者“否”,当我问完后即可猜到你心里想的那张牌什么。
ElasticSearch客户端调用
本文将介绍通过java程序调用ES服务的API。
ElasticSearch可视化插件安装
文本介绍2种ElasticSearch可视化插件Kibana和ElasticSearch-Head的安装方法
搭建ElasticSearch集群
1 单点的问题单台服务器,往往都有最大的负载能力,超过这个阈值,服务器性能就会大大降低甚至不可用。单点的elasticsearch也是一样,那单点的es服务器存在哪些可能出现的问题呢?
单台机器存储容量有限
单服务器容易出现单点故障,无法实现高可用
单服务的并发处理能力有限
所以,为了应对这些问题,我们需要对elasticsearch搭建集群。
数据分片首先,我们面临的第一个问题就是数据量太大,单点存储量有限的问题。我们可以把数据拆分成多份,每一份存储到不同机器节点(node),从而实现减少每个节点数据量。
数据备份数据分片解决了海量数据存储的问题,但是如果出现单点故障,那么分片数据就不再完整,这又该如何解决呢?就像大家为了备份手机数据,会额外存储一份到移动硬盘一样。我们可以给每个分片数据进行备份,存储到其它节点,防止数据丢失,这就是数据备份,也叫数据副本(replica)。数据备份可以保证高可用,但是每个分片备份一份,所需要的节点数量就会翻一倍,成本实在是太高了!为了在高可用和成本间寻求平衡,我们可以这样做:
首先对数据分片,存储到不同节点
然后对每个分片进行备份,放到对 ...
ElasticSearch快速入门
1 Elasticsearch介绍和安装1.1 Elasticsearch简介什么是ElasticsearchElaticsearch简称为es,是一个开源的可扩展的全文检索引擎服务器,它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上百台服务器,处理PB级别的数据。es使用Java开发并使用Lucene作为其核心来实现索引和搜索的功能,但是它通过简单的RestfulAPI和javaAPI来隐藏Lucene的复杂性,从而让全文搜索变得简单。
Elasticsearch官网:https://www.elastic.co/cn/products/elasticsearch
ES企业使用场景企业使用场景一般分为2种情况:
已经上线的系统,某些模块的搜索功能是使用数据库搜索实现的,但是已经出现性能问题或者不满足产品的高亮相关度排序的需求时候,就会对系统的搜索功能进行技术改造,使用全文检索,而es就是首选。针对这种情况企业改造的业务流程如下图:
系统新增加的模块,产品一开始就要实现高亮相关度排序等全文检索的功能或者技术分析觉得该模块使用全文检索更适合。针对这种情况企业改造的 ...
薛定谔的猪
问题有1000个瓶子里面装满了水,其中1瓶里面被加入了毒药,但是滴入毒药的水在外观上看和普通水是一模一样的,也就是说这1000个瓶子是分不清哪瓶是装有毒药的,除非把装有毒药的水喝进肚子里。现在有一只可怜的猪可以用来实验,将其中一瓶水喂给这只猪喝,如果猪毒发身亡了,说明这瓶水有毒。猪并不需要喝完整瓶水,只需喝到一小口,毒性就会发作,如果水是有毒的话。
由于只有一只猪,所以我们只能一瓶一瓶的去试验,假如毒发的时间是1分钟,那么我们每喂完一瓶水,就等待一分钟,直到猪死亡。值得注意的是,我们只需喂完999瓶水即可,因为如果猪喝完前面的999瓶水还没有中毒的话,说明最后一瓶一定是有毒的,已经不需要再试验了,同时这只猪也是幸运的,它可以告别死亡的命运。所以,我们最多需要花费999分钟,或者说试验999次才能找到这瓶装有毒药的水。
那么问题来了,如果现在不是1只猪,而是有10只猪可以用来试验,那么你最少可以试验几次能找到这瓶有毒的水?
提示:我们可以将水混合到一起喂给猪喝,无论如何,只要猪喝到有毒的水就会死亡。
答案如果你不熟悉二进制的话,可能会觉得不可思议。不过答案是只需1次,没错,我们只需 ...
二叉树的通用遍历模板
遍历一棵二叉树,主要分为前序遍历、中序遍历和后序遍历三种方式,不同的方式输出的顺序不同:
前序遍历: 根节点->左节点->右节点
中序遍历: 左节点->根节点->右节点
后序遍历: 左节点->右节点->根节点
本文将介绍递归、迭代、标记迭代以及莫里斯迭代四种方式的通用模板,对二叉树分别进行前中后序遍历,以及每种方式的特点。首先先定义二叉树结构:
123456#定义二叉树类型class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None
递归递归是二叉树遍历中最简单的方式:
1234567891011121314151617181920212223242526272829303132333435#前序遍历def preorderTraversal(self, root: TreeNode) -> List[int]: res=[] def dfs(n): if ...
彻底搞懂KMP算法原理
KMP算法是什么? KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)
SpringBoot快速入门
一、SpringBoot简介提起SpringBoot就不得不说Spring,Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。除此之外,项目的依赖管理也是一件耗时耗 ...
Spring的两大核心IOC和AOP
IOCIOC全称Inverse Of Control,中文名控制反转,是spring框架中一种降低程序耦合度(降低程序依赖关系)的设计思想。它的主要目的就是将对象的创建控制权完全交给spring提供的容器处理,由容器统一创建,调用方只需关注对象实现的功能,而无需关注对象是如何创建的。
实现原理
使用反射来创建对象,而避免使用new关键字。
通过读取配置文件来获取要创建的对象全限定类名。
因为是通过反射来创建的,所以编译期不依赖,运行时才依赖。
创建一个生成bean的工厂类BeanFactory,在类加载的时候通过读取配置文件bean.properties,将对象生成好并存放在字典中,此方式每个对象都是一个单例。
1234567891011121314151617181920212223242526272829303132333435363738394041424344public class BeanFactory { //定义一个Properties对象 private static Properties props; //定义一个Map,用于存 ...