动态
开发
Redis常见问题及分布式锁解决方案
缓存穿透缓存穿透:是指查询一个不存在的数据,由于缓存无法命中,将去查询数据库,但是数据库也无此记录,并且出于容错考虑,我们没有将这次查询的 null 写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能 DB 就挂掉了,要是有人利用不存在的 key 频繁攻击我们的应用,这就是漏洞。 解决方案:空结果也进行缓存,但它的过期时间不要设置太长,最长不超过五分钟。 缓存击穿缓存击穿: 是指对于一些设置了过期时间的 key,如果这些 key 可能会在某些时间点被超高并发地访问,是一种非常“热点”的数据。这个时候,需要考虑一个问题:如果这个 key 在大量请求同 ...
开发
Apache Lucene的了解与ES查询实现
介绍Elasticsearch 是一个基于 Lucene 的搜索服务器。 ES 中的核心组件 索引:Index(数据库的 Database) 类型:type(数据库的 Table) 域:Field(数据库的 column) 映射:mapping(数据库的建表语句) 文档:documents(数据库的数据 rows) Lucene 是 apache 软件基金会 jakarta 项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文)。Lucene 的目的是为软件开发人员 ...
开发
FastDFS的搭建与简单使用
介绍FastDFS 是一个由 C 语言实现的开源轻量级分布式文件系统。 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。通俗来讲:传统文件系统管理的文件就存储在本机。分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问。 FastDFS 上传的流程 Client通过 Tracker server 查找可用的 Storage server。 Tracker server 向 Client 返回可用的 Storage se ...
开发
knife4j的配置使用
官方文档:点我查看 基于 Spring Boot 项目 引入依赖12345<dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> <version>2.0.2</version></dependency> 添加配置类123456789101112131415161718192021222324252627@Configurat ...
开发
Git版本操作
说明有时候,我们用Git的时候有可能commit提交代码后,发现这一次commit的内容是有错误的,那么有两种处理方法: 修改错误内容,再次commit一次 使用git reset 命令撤销这一次错误的commit 第一种方法比较直接,但会多次一次commit记录。错误的commit没必要保留下来,那么今天来说一下git reset 1git-reset - Reset current HEAD to the specified state 本质上reset是移动HEAD指针,他做了2件事情: 从某个commit节点移动到之前的某个cimmit节点 处理工作空间、暂存区、仓库这3处的 ...
开发
Go语言的基础规则
命名规则Go 的函数、变量、常量、自定义类型、包(package)的命名方式遵循以下规则 任何需要对外暴露的名字必须以大写字母开头,不需要对外暴露的则应该以小写字母开头。 包名称 最好保持package的名字和目录保持一致,尽量不要和标准库冲突。包名应该为小写单词,尽量不要使用下划线。 变量命名 变量名称一般遵循驼峰法,首字母根据访问控制原则大写或者小写 关键字Go 语言中 25 个关键字或保留字 break default func interface select case defer go map struct chan else goto package switch ...
开发
JDK8新特性CompletableFuture
CompletableFuture 简介CompletableFuture 在 Java 里面被用于异步编程,异步通常意味着非阻塞,可以使得我们的任务单独运行在与主线程分离的其他线程中,并且通过回调可以在主线程中得到异步任务的执行状态,是否完成,和是否异常等信息。 CompletableFuture 实现了 Future、CompletionStage 接口 实现了 Future 接口就可以兼容现在有线程池框架,而 CompletionStage 接口才是异步编程的接口抽象,里面定义多种异步方法,通过这两者集合,从而打造出了强大的 CompletableFuture 类。 Future 与 C ...
开发
Fork/Join框架基本使用
Fork/Join 框架简介Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成两件事情: 任务分割:首先 Fork/Join 框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割 执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行完的结果都放在另外一个队列里,启动一个线程从队列里取数据,然后合并这些数据。 在 Java 的 Fork/Join 框架中,使用两个类完成上述操作 ForkJoinT ...
开发
Java8新特性:Stream流
Stream 简介 Java 8 API 添加了一个新的抽象称为流 Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API 可以极大提高 Java 程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到 ...
开发
ThreadPool线程池
线程池简介线程池(英语:thread pool):一种线程使用模式。 线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时,创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。 线程池的优势线程池做的工作只要是控制运行的线程数量,处理过程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量,超出数量的线程排队等候,等其他线程执行完毕,再从队列中取出任务来执行。 它的主要特点为 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的销耗。 提高响应速度:当 ...