Guava cache,一个小巧的本地缓存实战案例
完整文章请关注技术号阅读。
**技术号【程猿薇茑】**
推荐 极简代码展示RPC 核心原理
什么是缓存?
想必大家第一次听到“缓存”这个概念,还是在大学的计算机专业课上。学过操作系统原理、计算机组成原理的同学都知道,在计算机系统中,存储层级可按其作用分为高速缓冲存储器(Cache)、主存储器、辅助存储器三级。当然了,这里的“高速缓存”并非本文要讨论的缓存。今天我们要讨论的缓存是软件层面的。而高速缓存是位于CPU内部的物理器件,是主存与CPU之间的一级存储器,通常由静态存储芯片(SRAM)组成,容量很小但速度比主存快得多,接近于CPU的速度。其主要作用就是缓和CPU和内存之间速度不匹配的问题,使得整机处理速度得以提升。 尽管不同于硬件层面的高速缓存,但是缓存的思想本质上是一致的,都是将数据放在离使用者最近的位置以及访问速度较快的存储介质上以加快整个系统的处理速度。软件缓存可以认为是为了缓和客户端巨大的并发量和服务端数据库(通常是关系型数据库)处理速度不匹配的问题。缓存本质上是在内存中维护的一个hash数据结构(哈希表),通常是以的形式存储。由于hash table查询时间复杂度为O(1),因此性能很高。能够有效地加速应用的读写速度,降低后端负载。
自行实现一个缓存需要考虑的基本问题
1)数据结构 首先要考虑的是数据该如何存储,要选择合适的数据结构。在Java编程中,最简单的就是直接用Map集合来存储数据;复杂一点,像redis提供了多种数据结构:哈希,列表,集合,有序集合等,底层使用了双端链表,压缩列表,跳跃表等数据结构;
2)更新/清除策略 缓存中的数据都是有生命周期的,要在指定时间后被删除或更新,这样才能保证缓存空间在一个可控的范围。常用的更新/清除策略有LRU(Least Recently Used最近最少使用)、FIFO( First Input First Output先进先出)、LFU(Least Frequently Used最近最不常用)、SOFT(软引用)、WEAK(弱引用)等策略。
3)线程安全 redis是单线程处理模式,就不存在线程安全问题;而本地缓存往往是可以多个线程同时访问的,所以线程安全不容忽视;线程安全问题是不应该抛给使用者去保证的,因此需要缓存自身支持。
常用的缓存技术有哪些?
1)分布式缓存 Memcached Memcached 是一个开源的、高性能的、分布式的、基于内存的对象缓存系统。它能够用来存储各种格式的数据,包括字符串、图像、视频、文件等。Memcached 把数据全部存在内存之中,断电后会丢失,因此数据不能超过内存大小。且支持的数据结构较为单一,一般用于简单的key-value形式的存储。
Redis Redis是一个开源的基于内存的数据结构存储组件,可用作数据库(nosql)、缓存和消息队列。它支持诸如字符串、散列、列表、集合、带范围查询的有序集合、位图、hyperloglogs、支持半径查询和流的地理空间索引等多种数据结构。Redis具有内置的复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久化特性,并通过Redis 哨兵机制和基于Redis集群的自动分区提供高可用性。 和Memcached 相比,Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等多种数据结构的存储。Redis还支持定期把数据持久化到磁盘。
2)本地缓存 本地缓存,顾名思义就是在应用本身维护一个缓存结构,比如Java中的Map集合就比较适合做缓存。本地应用缓存最大的优点是应用本身和Cache在同一个进程内部,请求缓存非常快速,没有额外的网络I/O开销。本地缓存适合于单应用中不需要集群、各节点无需互相通信的场景。因此,其缺点是缓存跟应用程序耦合,分布式场景下多个独立部署的应用程序无法直接共享缓存,各节点都需要维护自己的单独缓存,既是对物理内存的一种浪费,也会导致数据的不一致性。Guava cache就是一种本地缓存。
话不多说,进入正题,本文主要介绍Google的缓存组件Guava Cache的实战技巧!
Guava Cache实战
1.引入依赖
com.google.guava
guava
28.1-jre
2.Demo1:简单使用,掌握如何创建使用Cache
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.util.concurrent.Callable;
public class CacheService1 {
public static void main(String[] args) throws Exception {
Cache cache = CacheBuilder.newBuilder().build();
// 写入/覆盖一个缓存
cache.put("k1", "v1");
// 获取一个缓存,如果该缓存不存在则返回一个null值
Object value1 = cache.getIfPresent("k1");
System.out.println("value1:" + value1);
// 获取缓存,当缓存不存在时,则通Callable进行加载并返回,该操作是原子的
Object getValue1 = cache.get("k1", new Callable() {
@Override
public Object call() throws Exception {
//缓存加载逻辑
return null;
}
});
System.out.println("getValue1:" + getValue1);
Object getValue2 = cache.get("k2", new Callable() {
/**
* 加载缓存的逻辑
* @return
* @throws Exception
*/
@Override
public Object call() throws Exception {
return "v2";
}
});
System.out.println("getValue2:" + getValue2);
}
}
控制台输出: value1:v1 getValue1:v1 getValue2:v2
上述程序演示了Guava Cache的读和写。Guava的缓存有许多配置选项,为了简化缓的创建,使用了Builder设计模式;Builder使用的是链式编程的思想,也就是每次调用方法后返回的是对象本身,这样可以简化配置过程。 获取缓存值时可以指定一个Callable实例动态执行缓存加载逻辑;也可以在创建Cache实例时直接使用LoadingCache。顾名思义,它能够通过CacheLoader自发的加载缓存。
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
public class CacheService2 {
public static void main(String[] args) throws Exception {
LoadingCache loadingCache = CacheBuilder.newBuilder()
.build(new CacheLoader() {
@Override
public String load(String key) throws Exception {
// 缓存加载逻辑
return "value2";
}
});
loadingCache.put("k1", "value1");
String v1 = loadingCache.get("k1");
System.out.println(v1);
// 以不安全的方式获取缓存,当缓存不存在时,会通过CacheLoader自动加载
String v2 = loadingCache.getUnchecked("k2");
System.out.println(v2);
// 获取缓存,当缓存不存在时,会通过CacheLoader自动加载
String v3 = loadingCache.get("k3");
System.out.println(v3);
}
}
控制台输出: value1 value2 value2
3.Demo2:理解Cache的过期处理机制
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class CacheService3 {
/**
* 通过builder模式创建一个Cache实例
*/
static Cache cache = CacheBuilder.newBuilder()
//设置缓存在写入5秒钟后失效
.expireAfterWrite(5, TimeUnit.SECONDS)
//设置缓存的最大容量(基于容量的清除)
.maximumSize(1000)
//开启缓存统计
.recordStats()
.build();
public static void main(String[] args) throws Exception {
//单起一个线程监视缓存状态
new Thread() {
public void run() {
while (true) {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
System.out.println(sdf.format(new Date()) + " cache size: " + cache.size());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}.start();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
//写入缓存
cache.put(1, "value1");
//读取缓存
System.out.println("write key:1 ,value:" + cache.getIfPresent(1));
Thread.sleep(10000);
// when write ,key:1 clear
cache.put(2, "value2");
System.out.println("write key:2 ,value:" + cache.getIfPresent(2));
Thread.sleep(10000);
// when read other key ,key:2 do not clear
System.out.println(sdf.format(new Date()) + " after write, key:1 ,value:" + cache.getIfPresent(1));
Thread.sleep(2000);
// when read same key ,key:2 clear
System.out.println(sdf.format(new Date()) + " final, key:2 ,value:" + cache.getIfPresent(2));
Thread.sleep(2000);
cache.put(1, "value1");
cache.put(2, "value2");
Thread.sleep(3000);
System.out.println(sdf.format(new Date()) + " write key:1 ,value:" + cache.getIfPresent(1));
System.out.println(sdf.format(new Date()) + " write key:2 ,value:" + cache.getIfPresent(2));
Thread.sleep(3000);
System.out.println(sdf.format(new Date()) + " final key:1 ,value:" + cache.getIfPresent(1));
System.out.println(sdf.format(new Date()) + " final key:2 ,value:" + cache.getIfPresent(2));
Thread.sleep(3000);
}
}
控制台输出: 22:07:17 cache size: 0 write key:1 ,value:value1 22:07:18 cache size: 1 22:07:19 cache size: 1 22:07:20 cache size: 1 22:07:21 cache size: 1 22:07:22 cache size: 1 22:07:23 cache size: 1 22:07:24 cache size: 1 22:07:25 cache size: 1 22:07:26 cache size: 1 22:07:27 cache size: 1 write key:2 ,value:value2 22:07:28 cache size: 1 22:07:29 cache size: 1 22:07:30 cache size: 1 22:07:31 cache size: 1 22:07:32 cache size: 1 22:07:33 cache size: 1 22:07:34 cache size: 1 22:07:35 cache size: 1 22:07:36 cache size: 1 22:07:37 after write, key:1 ,value:null 22:07:37 cache size: 1 22:07:38 cache size: 1 22:07:39 final, key:2 ,value:null 22:07:39 cache size: 0 22:07:40 cache size: 0 22:07:41 cache size: 2 22:07:42 cache size: 2 22:07:43 cache size: 2 22:07:44 write key:1 ,value:value1 22:07:44 write key:2 ,value:value2 22:07:44 cache size: 2 22:07:45 cache size: 2 22:07:46 cache size: 2 22:07:47 final key:1 ,value:null 22:07:47 final key:2 ,value:null 22:07:47 cache size: 0 22:07:48 cache size: 0
运行上述程序,可以得出如下结论: (1)缓存项<1,“value1”>的过期时间是5秒,但经过5秒后并没有被清除,因为还是size=1 (2)发生写操作cache.put(2, “value2”)后,缓存项<1,“value1”>被清除,因为size=1,而不是size=2 (3)发生读操作cache.getIfPresent(1)后,缓存项<2,“value2”>没有被清除,因为还是size=1,即读操作确实不一定触发清除 (4)发生读操作cache.getIfPresent(2)后,缓存项<2,“value2”>被清除,因为读的key就是2
上述机制在Guava Cache中被称为“延迟删除”,即删除总是发生得比较“晚”,并不是真正意义上的定时过期。需要依靠用户请求线程下一次读写缓存才能触发清除/更新。这也是Guava Cache的独到之处。但是这种实现方式也会存在问题:缓存会可能会存活比较长的时间,一直占用着物理内存。如果使用了复杂的清除策略如基于容量的清除,还可能会占用着线程而导致响应时间变长。但优点也是显而易见的,没有启动额外的线程,不管是实现,还是使用都比较简单(轻量)。
如果我们需要尽可能地降低延迟,
完整文章请关注技术号阅读。
**技术号【程猿薇茑】**
**关注阅读技术文章**
你可能感兴趣的:(Java,guava)
工作流程设计 php,php工程狮感知的前端工作流程
三符
工作流程设计 php
这个时代不懂点前端知识,真的没有办法生存。就算不会写,也得了解它的原理吧!最近做了一些总结,之前都是迷迷糊糊,搞不清楚前端之前的相关定位。好好梳理了一下。错误之处请各位指正。本文主要说的是JavaScript工作流程目前前端真的该叫大前端,其越来越细化,越来越复杂。在这种背景下,诞生了很多工具很多前端工作流程。比如热门的:reactvuewebpackbabelgulpnode.jsnpmnvma
前端经典的JavaScript面试知识总结
weixin_33982670
面试 前端 javascript ViewUI
1、使用typeofbar==="object"来确定bar是否是一个对象时有什么潜在的缺陷?这个陷阱如何避免?尽管typeofbar===“object”是检查bar是否是对象的可靠方法,但JavaScript中令人惊讶的问题null也被认为是一个对象!因此,对于大多数开发人员来说,下面的代码会将true(而不是false)打印到控制台:varbar=null;console.log(typeo
03 手把手教你理解Vue Router核心原理(附实战代码)
泯泷
Vue2 快速入门 ui html5 css3 前端 前端框架 Vue vue.js
一、前端路由的魔法原理想象你在一本魔法书中翻页,页面内容会变化但书本本身不会重新印刷。前端路由就是这样的魔法,当我们在单页应用(SPA)中切换页面时:不会触发真正的页面刷新页面内容通过JavaScript动态更新URL会同步变化反映当前状态二、三种路由模式大比拼1.Hash模式(默认模式)工作原理:利用URL中的#符号(锚点)实现路由切换//创建路由实例import{createRouter,cr
最新计算机专业开题报告案例84:基于Springboot框架的校园点餐系统的设计与实现
平姐设计
微信小程序项目实战 java项目实战 计算机毕业设计开题报告100套 spring boot java 校园点餐管理系统 餐厅管理 在线支付 开题报告 国内外研究现状
计算机毕业设计100套微信小程序项目实战java项目实战需要源码可以滴滴我请文末卡片dd我获取更详细的演示视频撰写不易,感谢支持!目录一、研究背景和意义1.1研究背景1.2研究意义二、国内外研究状况2.1后端技术2.1.1基于SpringBoot的校园点餐系统设计与实现2.1.2基于SpringMVC的校园点餐系统设计与实现2.1.3基于Mybatis的校园点餐系统设计与实现2.2前端技术2.2.
JavaScript 中处理 object 对象类型的常见方法
像素检测仪
前端 js javascript 前端 typescript
目录一、对象的基本操作1.创建对象2.访问和修改属性3.添加新属性4.删除属性5.检查属性是否存在二、对象的组合操作1.合并对象2.扩展运算符3.对象解构三、对象的深拷贝1.使用JSON.parse和JSON.stringify2.使用递归函数四、对象的遍历1.for...in循环2.Object.keys()3.Object.entries()五、常用对象方法1.Object.assign()2
性能调优JVM参数优化方案有哪些
Feng.Lee
漫谈测试 jvm 性能优化
目录一、JVM内存模型内存相关参数JVM内存模型如下图二、栈空间入栈出栈示意如下图所示。与栈空间有关的两种异常如下。Java线程的6种状态如下:那么,继续思考如下两个问题。三、堆空间那么,内存如何设置呢?对象进入老年代一般有以下4种可能:四、垃圾回收相关参数五、JIT编译器相关参数六、性能诊断相关参数七、其它常用参数JVM(Java虚拟机)参数优化对于提高Java应用程序的性能至关重要。通过调整J
Java面试题之:sql优化方式
m0_74825565
面试 学习路线 阿里巴巴 java sql 开发语言
Java面试题之:sql优化方式一、索引查询、避免全表扫描二、查询数据尽量避免使用or三、连续查询,能用between就用四、where查询条件,对字段进行表达式操作五、where查询条件,对字段进行函数操作六、多张数据表查询数据,使用innerjoin七、in()和exists()八、使用like进行数据表查询时,能用%就不建议使用双%九、最左优先十、精确类型匹配十一、表越小,查询越快十二、数据
请解释 JavaScript 中的函数式编程,优缺点是什么?
程序员黄同学
前端开发 JavaScript javascript 开发语言 ecmascript
一、对JavaScript函数式编程的理解函数式编程(FunctionalProgramming,FP)是一种编程范式,它将计算视为数学函数的求值,并避免改变状态和可变数据。在JavaScript中,函数式编程具有以下几个关键特性:(一)纯函数纯函数是指对于相同的输入,总是返回相同的输出,并且不会产生任何可观察的副作用。例如://纯函数示例:计算两个数的和functionadd(a,b){retu
探索Node.js的串口通信新世界:Node Serialport
侯深业Dorian
探索Node.js的串口通信新世界:NodeSerialport项目地址:https://gitcode.com/gh_mirrors/no/node-serialport在构建硬件交互或物联网应用时,我们常常需要与设备进行低级别通信,例如通过串行端口(如COM端口)。这就是NodeSerialport发挥作用的地方。这是一个强大的开源库,它为JavaScript开发者提供了跨平台的串行端口访问功
Java语言的软件开发工具
沈韡蕙
包罗万象 golang 开发语言 后端
Java语言的软件开发工具探讨Java是一种广泛使用的编程语言,因其跨平台特性、丰富的库和框架以及活跃的开发社区而备受欢迎。在Java开发过程中,开发工具的选择对开发效率、代码质量、团队协作等方面都起着至关重要的作用。本文将深入探讨一些主流的Java开发工具,包括集成开发环境(IDE)、构建工具、版本控制工具等。一、集成开发环境(IDE)IDE是软件开发的重要工具之一,提供代码编辑、调试、版本控制
Perl语言的区块链
沈韡蕙
包罗万象 golang 开发语言 后端
Perl语言在区块链技术中的应用引言随着区块链技术的迅猛发展,越来越多的编程语言开始在这个领域中发挥重要作用。虽然常见的区块链开发语言例如Solidity和JavaScript广受欢迎,但Perl作为一门成熟且灵活的语言,也在一些特定的应用场景中展现出其独特的优势。本文将探讨Perl语言在区块链技术中的应用,包括其特点、在区块链中的实现、案例分析以及未来展望。Perl语言的特点Perl是一种强大的
最全面的 Node.js 资源汇总推荐
程序员小英
node.js
原文来源于:程序员成长指北;作者:前哨君原文:https://github.com/jobbole/awesome-nodejs-cn如有侵权,联系删除【导读】:Node.js是一个开源、跨平台的,用于编写服务器和命令行的JavaScript运行时工具。awesome-nodejs是sindresorhus发起维护的Node.js资源列表,内容包括:命令行工具、日志、调试、HTTP、构建工具、文件
Linux 系统中 Java 程序被强制杀掉?这些日志帮你快速定位原因!
夜里慢慢行456
java linux java
文章目录一、为什么Java程序会被强制杀掉?二、如何通过日志定位问题?(一)检查系统日志(二)检查Java应用程序日志(三)使用journalctl查看日志(四)监控系统资源(五)检查操作系统限制(六)检查JVM参数和配置(七)排查OOMKiller三、实战案例案例1:Java程序因内存不足被杀案例2:Java程序因超时被杀在Linux系统中,Java程序可能会因为各种原因被系统强制杀掉。这种情况
如何利用Spring的@Value注解实现配置信息的动态注入与管理?
码农技术栈
spring spring cloud spring boot java 微服务
@Value注解在Spring中的作用,就像是一个“传话员”,它负责把配置文件中的值或者其他来源的值传递给Java对象中的属性。想象一下,你有一个装满各种设置的小盒子(配置文件),里面记录了各种信息,比如数据库的连接信息、应用的端口号等。现在,你有一个Java对象,它需要一个属性值,比如数据库的连接字符串。这时候,@Value注解就像是一个“传话员”,它跑到小盒子(配置文件)那里,找到对应的值,然
Filter概述、执行流程、拦截路径配置及过滤器链
夏志121
Java基础+进阶+核心技术 java 开发语言 前端 intellij idea 服务器
目录一、Filter概述二、Filter入门案例三、Filter执行流程四、Filter拦截路径配置五、过滤器链一、Filter概述概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能过滤器一般完成一些通用的操作,比如:权限控制,统一编码处理,敏感字符处理等等....二、Filter入
Executors 的详细用法及与 ThreadPoolExecutor 的关系
java
一、Executors工具类概述Executors是Java并发包(java.util.concurrent)中的一个工具类,提供了一系列静态工厂方法,用于快速创建不同类型的线程池。这些方法内部封装了ThreadPoolExecutor或ScheduledThreadPoolExecutor的配置,简化了线程池的创建过程。二、Executors提供的线程池类型及用法工厂方法线程池类型核心参数配置适
Java进阶篇之线程的创建和运行
code2cat
Java Java进阶 java 开发语言 intellij-idea eclipse ide
引言在前面的文章中,我们介绍了多线程(Java进阶篇之多线程)。在开发高效的并发应用时,线程的创建与运行是我们需要掌握的基本技能。线程能够让我们同时处理多个任务,充分利用多核CPU提高程序的执行效率。Java提供了多种方式来创建和启动线程,从简单的继承Thread类到实现Runnable接口,再到使用现代的ExecutorService,每种方式都有其适用的场景。今天,我们就来聊一聊Java中线程
能不能解释一下本地方法栈?思维导图 代码示例(java 架构)
用心去追梦
java 架构 开发语言
本地方法栈(NativeMethodStack)本地方法栈是JVM运行时数据区的一部分,类似于Java虚拟机栈,但用于支持本地方法(通常是用C/C++编写的)的调用。本地方法栈主要用于存储本地方法的信息,如局部变量、操作数栈等。特点线程私有:每个线程都有自己的本地方法栈,互不影响。生命周期:本地方法栈的生命周期与线程相同,线程启动时创建,线程结束时销毁。栈帧:每个本地方法调用时都会创建一个栈帧,方
Java NIO基础与实战:如何提升IO操作性能
薛伟同学
Netty:高性能网络编程技巧 java nio
JavaNIO概述JavaNIO(新I/O)是Java提供的一个更为高效的I/O处理框架。JavaNIO(NewI/O)是对传统I/O(java.io)模型的改进,它引入了非阻塞I/O操作和面向缓冲区的数据读写方式,解决了传统I/O模型中的性能瓶颈。NIO的设计目标是使I/O操作更加高效,特别是在大数据量、高并发情况下,能够充分利用操作系统的底层I/O多路复用机制。JavaNIO的核心概念包括:B
Java 循环结构进阶
m0_74824483
面试 学习路线 阿里巴巴 java
二重循环1.一个循环体内又包含另一个完整的循环结构2.外城循环变量变化一次,内层循环变量要变化一遍。二重循环-冒泡排序
Java--IO流详解 (上)--字符流
不修×蝙蝠
IO流 JavaSE 输入流 输出流 字节流 字符流
目录IO流的概念字符流输入流Reader核心方法1.close()2.mark(intreadAheadLimit)3.markSupported()4.read()5.read(char[]cbuf)6.read(char[]cbuf,intoff,intlen)7.read(CharBuffertarget)8.ready()9.reset()10.skip(longn)Reader的常用子类
JavaScript 中内存泄漏的几种情况是什么,如何避免?
程序员黄同学
前端开发 JavaScript Java面试题 javascript 前端 开发语言
一、全局变量泄漏(高频考点)问题场景:未使用var/let/const声明变量,或意外挂载到window对象//错误示例(创建全局变量)functioninitData(){cache=newArray(1000000)//隐式全局变量}//正确方案(严格模式+局部变量)'usestrict'functionsafeInit(){constlocalCache=[]//局部变量自动回收}防御建议:
自定义公式校验规则、常用的JavaScript正则公式合法校验、自定义公式合集、前端校验规则、字符串校验
a_dream(前端)
前端 javascript 正则表达式
vue开发中,会使用到自定义公式校验合法性,判断公式是否符合逻辑,整理个人使用过的自定义公式页面保存时对输入的字符串进行校验的一套规则(文章最后有完整代码)目录1.正则判断2.校验数字(输入数字不超过十位数,不超过两位小数)3.校验括号(嵌套括号是否符合要求)4.(完整代码文件)1.正则判断constre=/[^0-9\(\)\+\-\×\÷\.\#\{\}]{1,}///判断输入字符合法性的正则
IDEA配置JSTL
阿俊仔(摸鱼版)
intellij-idea java tomcat
IDEA配置JSTL下载JSTL官网下载地址:https://tomcat.apache.org翻到下面找到:点击,download下载下面内容:(就Impl和Spec)配置JSTL将两个下好的jar包放在lib文件夹下ctrl+shift+alt+s打开ProjectStructure左侧找到Modules->右侧选择Dependences->点击➕号Library->点击java->选中WEB
javax.imageio.IIOException: Can‘t read input file
阿俊仔(摸鱼版)
眼盲心不瞎的憨憨bug日记 intellij-idea
问题描述根据路径地址读取图片存入数据库时,提示我没法读取图片。原因分析:大致就是各种情况导致路径不对或者文件不对路径格式写错了(windows路径分隔符是\,Linux是/)文件格式写错(文件名写错或者文件后缀写错)该路径下此文件不存在(复制路径去本地找找核对一下)解决方案:先看报错信息检查出错的语句(那边没什么问题),然后我又检查了所有写了文件路径的语句,发现我写入数据库的那个文件的路径没把文件
MVC和react
吃蛋糕的居居
javascript css node.js html
MVC1.MVC是一种使用MVC(ModelViewController模型-视图-控制器)设计创建Web应用程序的模式.(1)Model(模型)表示应用程序核心(比如数据库记录列表).(2)View(视图)显示数据(数据库记录).(3)Controller(控制器)处理输入(写入数据库记录).2.MVC模式同时提供了对HTML、CSS和JavaScript的完全控制.(1)Model(模式)是应
海南大学--学习资料--网络应用开发java web(胡祝华)-第3次作业解析(学长整理)
创创大帝(水印很浅-下载的文档)
海南大学--学习资料--PHP HTML java web 前端 java html
海南大学–学习资料–网络应用开发javaweb(胡祝华)-第3次作业解析(学长整理)海南大学–学习资料–网络应用开发javaweb(胡祝华)-第3次作业解析(学长整理)海南大学–学习资料–网络应用开发javaweb(胡祝华)-第3次作业解析(学长整理)表单验证:1.在表单的源码中head部分用script导入了script/regcheckdata.js文件2.当点击提交按钮时,onSubmit=
手把手教你给 windows装个vmware虚拟机
python算法小白
附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读书籍书单大全:书单导航页(点击右侧极客侠栈即可打开个人博客):极客侠栈①【Java】学习之路吐血整理技术书从入门到进阶最全50+本(珍藏版)②【算法数据结构+acm】从入门到进阶吐血整理书单50+本(珍藏版)③【数据库】从入门到进阶必读18本技术书籍网盘吐血整理网盘(珍藏版)④【Web前端】从HTML到JS到AJ
github提示 Filename too long
JavaGameServer
# git rocketmq
gitconfig--globalcore.longpathstrueerror:open("chapter13/rocketmq-externals-master/rocketmq-externals-master/rocketmq-connect/rocketmq-connect-runtime/src/test/java/org/apache/rocketmq/connect/runtime
利用IDEA将Java.class文件反编译为Java文件:原理、实践与深度解析
.猫的树
Java反编译 IDEA技巧 逆向工程
文章目录引言:当.class文件遇到源代码缺失第一章:反编译技术基础认知1.1Java编译执行原理1.2反编译的本质1.3法律与道德边界第二章:IDEA内置反编译工具详解2.1环境准备2.2三步完成基础反编译2.3高级反编译技巧2.3.1调试模式反编译2.3.2Lambda表达式处理2.3.3泛型类型恢复第三章:Fernflower反编译引擎深度配置3.1引擎参数调优3.2多文件批量反编译3.3结
jdk tomcat 环境变量配置
Array_06
java jdk tomcat
Win7 下如何配置java环境变量
1。准备jdk包,win7系统,tomcat安装包(均上网下载即可)
2。进行对jdk的安装,尽量为默认路径(但要记住啊!!以防以后配置用。。。)
3。分别配置高级环境变量。
电脑-->右击属性-->高级环境变量-->环境变量。
分别配置 :
path
&nbs
Spring调SDK包报java.lang.NoSuchFieldError错误
bijian1013
java spring
在工作中调另一个系统的SDK包,出现如下java.lang.NoSuchFieldError错误。
org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.l
LeetCode[位运算] - #136 数组中的单一数
Cwind
java 题解 位运算 LeetCode Algorithm
原题链接:#136 Single Number
要求:
给定一个整型数组,其中除了一个元素之外,每个元素都出现两次。找出这个元素
注意:算法的时间复杂度应为O(n),最好不使用额外的内存空间
难度:中等
分析:
题目限定了线性的时间复杂度,同时不使用额外的空间,即要求只遍历数组一遍得出结果。由于异或运算 n XOR n = 0, n XOR 0 = n,故将数组中的每个元素进
qq登陆界面开发
15700786134
qq
今天我们来开发一个qq登陆界面,首先写一个界面程序,一个界面首先是一个Frame对象,即是一个窗体。然后在这个窗体上放置其他组件。代码如下:
public class First { public void initul(){ jf=ne
Linux的程序包管理器RPM
被触发
linux
在早期我们使用源代码的方式来安装软件时,都需要先把源程序代码编译成可执行的二进制安装程序,然后进行安装。这就意味着每次安装软件都需要经过预处理-->编译-->汇编-->链接-->生成安装文件--> 安装,这个复杂而艰辛的过程。为简化安装步骤,便于广大用户的安装部署程序,程序提供商就在特定的系统上面编译好相关程序的安装文件并进行打包,提供给大家下载,我们只需要根据自己的
socket通信遇到EOFException
肆无忌惮_
EOFException
java.io.EOFException
at java.io.ObjectInputStream$PeekInputStream.readFully(ObjectInputStream.java:2281)
at java.io.ObjectInputStream$BlockDataInputStream.readShort(ObjectInputStream.java:
基于spring的web项目定时操作
知了ing
java Web
废话不多说,直接上代码,很简单 配置一下项目启动就行
1,web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="h
树形结构的数据库表Schema设计
矮蛋蛋
schema
原文地址:
http://blog.csdn.net/MONKEY_D_MENG/article/details/6647488
程序设计过程中,我们常常用树形结构来表征某些数据的关联关系,如企业上下级部门、栏目结构、商品分类等等,通常而言,这些树状结构需要借助于数据库完成持久化。然而目前的各种基于关系的数据库,都是以二维表的形式记录存储数据信息,
maven将jar包和源码一起打包到本地仓库
alleni123
maven
http://stackoverflow.com/questions/4031987/how-to-upload-sources-to-local-maven-repository
<project>
...
<build>
<plugins>
<plugin>
<groupI
java IO操作 与 File 获取文件或文件夹的大小,可读,等属性!!!
百合不是茶
类 File
File是指文件和目录路径名的抽象表示形式。
1,何为文件:
标准文件(txt doc mp3...)
目录文件(文件夹)
虚拟内存文件
2,File类中有可以创建文件的 createNewFile()方法,在创建新文件的时候需要try{} catch(){}因为可能会抛出异常;也有可以判断文件是否是一个标准文件的方法isFile();这些防抖都
Spring注入有继承关系的类(2)
bijian1013
java spring
被注入类的父类有相应的属性,Spring可以直接注入相应的属性,如下所例:1.AClass类
package com.bijian.spring.test4;
public class AClass {
private String a;
private String b;
public String getA() {
retu
30岁转型期你能否成为成功人士
bijian1013
成长 励志
很多人由于年轻时走了弯路,到了30岁一事无成,这样的例子大有人在。但同样也有一些人,整个职业生涯都发展得很优秀,到了30岁已经成为职场的精英阶层。由于做猎头的原因,我们接触很多30岁左右的经理人,发现他们在职业发展道路上往往有很多致命的问题。在30岁之前,他们的职业生涯表现很优秀,但从30岁到40岁这一段,很多人
【Velocity四】Velocity与Java互操作
bit1129
velocity
Velocity出现的目的用于简化基于MVC的web应用开发,用于替代JSP标签技术,那么Velocity如何访问Java代码.本篇继续以Velocity三http://bit1129.iteye.com/blog/2106142中的例子为基础,
POJO
package com.tom.servlets;
public
【Hive十一】Hive数据倾斜优化
bit1129
hive
什么是Hive数据倾斜问题
操作:join,group by,count distinct
现象:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成;查看未完成的子任务,可以看到本地读写数据量积累非常大,通常超过10GB可以认定为发生数据倾斜。
原因:key分布不均匀
倾斜度衡量:平均记录数超过50w且
在nginx中集成lua脚本:添加自定义Http头,封IP等
ronin47
nginx lua csrf
Lua是一个可以嵌入到Nginx配置文件中的动态脚本语言,从而可以在Nginx请求处理的任何阶段执行各种Lua代码。刚开始我们只是用Lua 把请求路由到后端服务器,但是它对我们架构的作用超出了我们的预期。下面就讲讲我们所做的工作。 强制搜索引擎只索引mixlr.com
Google把子域名当作完全独立的网站,我们不希望爬虫抓取子域名的页面,降低我们的Page rank。
location /{
java-3.求子数组的最大和
bylijinnan
java
package beautyOfCoding;
public class MaxSubArraySum {
/**
* 3.求子数组的最大和
题目描述:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4,
Netty源码学习-FileRegion
bylijinnan
java netty
今天看org.jboss.netty.example.http.file.HttpStaticFileServerHandler.java
可以直接往channel里面写入一个FileRegion对象,而不需要相应的encoder:
//pipeline(没有诸如“FileRegionEncoder”的handler):
public ChannelPipeline ge
使用ZeroClipboard解决跨浏览器复制到剪贴板的问题
cngolon
跨浏览器 复制到粘贴板 Zero Clipboard
Zero Clipboard的实现原理
Zero Clipboard 利用透明的Flash让其漂浮在复制按钮之上,这样其实点击的不是按钮而是 Flash ,这样将需要的内容传入Flash,再通过Flash的复制功能把传入的内容复制到剪贴板。
Zero Clipboard的安装方法
首先需要下载 Zero Clipboard的压缩包,解压后把文件夹中两个文件:ZeroClipboard.js
单例模式
cuishikuan
单例模式
第一种(懒汉,线程不安全):
public class Singleton { 2 private static Singleton instance; 3 pri
spring+websocket的使用
dalan_123
一、spring配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.or
细节问题:ZEROFILL的用法范围。
dcj3sjt126com
mysql
1、zerofill把月份中的一位数字比如1,2,3等加前导0
mysql> CREATE TABLE t1 (year YEAR(4), month INT(2) UNSIGNED ZEROFILL, -> day
Android开发10——Activity的跳转与传值
dcj3sjt126com
Android开发
Activity跳转与传值,主要是通过Intent类,Intent的作用是激活组件和附带数据。
一、Activity跳转
方法一Intent intent = new Intent(A.this, B.class); startActivity(intent)
方法二Intent intent = new Intent();intent.setCla
jdbc 得到表结构、主键
eksliang
jdbc 得到表结构、主键
转自博客:http://blog.csdn.net/ocean1010/article/details/7266042
假设有个con DatabaseMetaData dbmd = con.getMetaData(); rs = dbmd.getColumns(con.getCatalog(), schema, tableName, null); rs.getSt
Android 应用程序开关GPS
gqdy365
android
要在应用程序中操作GPS开关需要权限:
<uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS" />
但在配置文件中添加此权限之后会报错,无法再eclipse里面正常编译,怎么办?
1、方法一:将项目放到Android源码中编译;
2、方法二:网上有人说cl
Windows上调试MapReduce
zhiquanliu
mapreduce
1.下载hadoop2x-eclipse-plugin https://github.com/winghc/hadoop2x-eclipse-plugin.git 把 hadoop2.6.0-eclipse-plugin.jar 放到eclipse plugin 目录中。 2.下载 hadoop2.6_x64_.zip http://dl.iteye.com/topics/download/d2b
如何看待一些知名博客推广软文的行为?
justjavac
博客
本文来自我在知乎上的一个回答:http://www.zhihu.com/question/23431810/answer/24588621
互联网上的两种典型心态:
当初求种像条狗,如今撸完嫌人丑
当初搜贴像条犬,如今读完嫌人软
你为啥感觉不舒服呢?
难道非得要作者把自己的劳动成果免费给你用,你才舒服?
就如同 Google 关闭了 Gooled Reader,那是
sql优化总结
macroli
sql
为了是自己对sql优化有更好的原则性,在这里做一下总结,个人原则如有不对请多多指教。谢谢!
要知道一个简单的sql语句执行效率,就要有查看方式,一遍更好的进行优化。
一、简单的统计语句执行时间
declare @d datetime ---定义一个datetime的变量set @d=getdate() ---获取查询语句开始前的时间select user_id
Linux Oracle中常遇到的一些问题及命令总结
超声波
oracle linux
1.linux更改主机名
(1)#hostname oracledb 临时修改主机名
(2) vi /etc/sysconfig/network 修改hostname
(3) vi /etc/hosts 修改IP对应的主机名
2.linux重启oracle实例及监听的各种方法
(注意操作的顺序应该是先监听,后数据库实例)
&nbs
hive函数大全及使用示例
superlxw1234
hadoop hive函数
具体说明及示例参 见附件文档。
文档目录:
目录
一、关系运算: 4
1. 等值比较: = 4
2. 不等值比较: <> 4
3. 小于比较: < 4
4. 小于等于比较: <= 4
5. 大于比较: > 5
6. 大于等于比较: >= 5
7. 空值判断: IS NULL 5
Spring 4.2新特性-使用@Order调整配置类加载顺序
wiselyman
spring 4
4.1 @Order
Spring 4.2 利用@Order控制配置类的加载顺序
4.2 演示
两个演示bean
package com.wisely.spring4_2.order;
public class Demo1Service {
}
package com.wisely.spring4_2.order;
public class