Redisson是Redis官方推荐的Java版的Redis客户端。它提供的功能非常多,也非常强大,此处我们只用它的分布式锁功能。关于基本的用法不做赘述,简单看一下用法就好
https://github.com/redisson/redisson
添加redisson的配置和maven依赖
org.redisson
redisson
3.12.0
@Bean
RedissonClient redissonClient(){
Config config=new Config();
config.useSingleServer().setAddress("redis://127.0.0.1:6379");
// config.useClusterServers();//用于集群的配置
//config.useSentinelServers();//用于哨兵的配置
return Redisson.create(config);
}
@Autowired
RedissonClient redisson;
@GetMapping("/lock")
public String testStu() {
RLock lock = redisson.getLock("lock");
lock.lock();
try {
System.out.println("加锁完毕,业务中:");
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return "ok";
}
我们知道用redisson的一个好处就是,它可以通过redis来进行对分布式系统下的多线程进行lock控制。比如它的加锁阶段,自动续期, 自动解锁阶段。
对于加锁阶段,是有两个方法可以采用
lock.lock();
lock.lock(2,TimeUnit.SECONDS);
意为一个是采用系统默认,一个是自定义了锁时间过期的时间。下面主要看看不同之处。
最简单的一点就是,如果不设置过期时间,那会采用默认的30s的时间来过期(当然这个时间也可以通过设置看门狗时间来更改默认的30s)。然后当程序运行时候,会有一种自动续期的策略,即为到某个时间点然后会将时间再变为30s。一直等到程序运行完成调用unlock()方法就解锁。如果程序宕机获取其他原因中断,因为有过期时间的存在,也会自动删除redis中的key,不会造成死锁问题。这就是他的看门狗机制。watchDog。
如果设置了锁的超时时间,那就简单了。直接通过lua脚本去执行程序。。这里有一个问题就是,例如程序运行了3s,但是过期时间设置的是1s,那在释放锁unlock()的时候回报错 java.lang.IllegalMonitorStateException: attempt to unlock lock, not locked by current thread by node id: 5dd94211-69eb-4853-8d9c-6bb1e6c33c7a thread-id: 1188。类似于这种。这是因为
@Override
public RFuture unlockAsync(long threadId) {
RPromise result = new RedissonPromise();
RFuture future = unlockInnerAsync(threadId);
future.onComplete((opStatus, e) -> {
if (e != null) {
cancelExpirationRenewal(threadId);
result.tryFailure(e);
return;
}
if (opStatus == null) {
IllegalMonitorStateException cause = new IllegalMonitorStateException("attempt to unlock lock, not locked by current thread by node id: "
+ id + " thread-id: " + threadId);
result.tryFailure(cause);
return;
}
cancelExpirationRenewal(threadId);
result.trySuccess(null);
});
return result;
}
就相当于是,之前的锁已经过期不存在了,再当我要去尝试解锁释放的时候,肯定就找不到这个锁了,所以才会报错。可以不用unlock()方法让它自己过期就好了。 下面看看lock.lock();就这个原生方法的实现理解
在RedissonLock类中有这样做一个方法lock(),
lock(long leaseTime, TimeUnit unit, boolean interruptibly),如果没有传值的话,默认
lock(-1, null, false);是这种
在lock方法里面调用tryAcquire,下面继续调用tryAcquireAsync
private RFuture tryAcquireAsync(long leaseTime, TimeUnit unit, long threadId) {
// 这里就是刚刚说的如果用lock.lock()传时间的话,leaseTime 就是自己设置的值
if (leaseTime != -1) {
return tryLockInnerAsync(leaseTime, unit, threadId, RedisCommands.EVAL_LONG);
}
//这里是采用的默认的,getLockWatchdogTimeout()返回的就是默认或者通过设置的时间
RFuture ttlRemainingFuture = tryLockInnerAsync(commandExecutor.getConnectionManager().getCfg().getLockWatchdogTimeout(), TimeUnit.MILLISECONDS, threadId, RedisCommands.EVAL_LONG);
ttlRemainingFuture.onComplete((ttlRemaining, e) -> {
if (e != null) {
return;
}
// lock acquired
if (ttlRemaining == null) {
// 这里就是进行自动续期时间的操作
scheduleExpirationRenewal(threadId);
}
});
return ttlRemainingFuture;
}
在lock()里面有这样一段代码
1.表示一直循环,尝试去查看当前锁的情况
2.就是我们开始上面看的那个方法,也是看门狗的实现
3.就是说,当锁已过期或者是任务结束则自动就去结束循环,不然也会导致死循环的
看到这个方法scheduleExpirationRenewal(threadId);
private void scheduleExpirationRenewal(long threadId) {
ExpirationEntry entry = new ExpirationEntry();
//这里有一个ConcurrentMap EXPIRATION_RENEWAL_MAP
ExpirationEntry oldEntry = EXPIRATION_RENEWAL_MAP.putIfAbsent(getEntryName(), entry);
if (oldEntry != null) {
oldEntry.addThreadId(threadId);
} else {
// 因为我们是第一次进行加锁的操作,所以此时map里面是没值的。putIfAbsent返回只能是null
entry.addThreadId(threadId);
//这里的方法就是进行延迟重试的方式
renewExpiration();
}
}
主要看我进行注释的地方,就是判断有无对象,然后启动时间轮,延时时间为watchdog的三分之一。
private void renewExpiration() {
// 因为在上面的时候已经用了putIfAbsent,所以放进了一个ExpirationEntry 对象
ExpirationEntry ee = EXPIRATION_RENEWAL_MAP.get(getEntryName());
if (ee == null) {
return;
}
// 这里就启动了时间轮,然后进行循环,启动的时间就是进行延时internalLockLeaseTime / 3
Timeout task = commandExecutor.getConnectionManager().newTimeout(new TimerTask() {
@Override
public void run(Timeout timeout) throws Exception {
ExpirationEntry ent = EXPIRATION_RENEWAL_MAP.get(getEntryName());
if (ent == null) {
return;
}
Long threadId = ent.getFirstThreadId();
if (threadId == null) {
return;
}
RFuture future = renewExpirationAsync(threadId);
future.onComplete((res, e) -> {
if (e != null) {
log.error("Can't update lock " + getName() + " expiration", e);
return;
}
if (res) {
// 只要是连接未停止,即线程任务还未结束,则进行自旋的方式
renewExpiration();
}
});
}
}, internalLockLeaseTime / 3, TimeUnit.MILLISECONDS);
ee.setTimeout(task);
}
RFuture future = renewExpirationAsync(threadId);上面代码中的这一句就是在进行续期的操作,里面实现
protected RFuture renewExpirationAsync(long threadId) {
return commandExecutor.evalWriteAsync(getName(), LongCodec.INSTANCE, RedisCommands.EVAL_BOOLEAN,
"if (redis.call('hexists', KEYS[1], ARGV[2]) == 1) then " +
"redis.call('pexpire', KEYS[1], ARGV[1]); " +
"return 1; " +
"end; " +
"return 0;",
Collections.singletonList(getName()),
internalLockLeaseTime, getLockName(threadId));
}
/**
internalLockLeaseTime就是我们的看门狗时间,当我们通过上面的时间轮来重复执行这个lua脚本的时候,会重置这个过期时间。又因为此时是同一个threadId,所以操作的也就是这同一个当前线程对象和同一个锁对象
**/
你可能感兴趣的:(java基础学习,java,redis,缓存)
2024华为OD机试真题-免单统计(C++/Java/Python)-E卷-100分
2024剑指offer
华为od c++ python java
2024华为OD机试题库-(E卷+C卷+D卷)-(JAVA、Python、C++)目录题目描述输入描述输出描述用例1用例2用例3考点题目解析代码c++javapython题目描述华为商城举办了一个促销活动,如果某顾客是某一秒内最早时刻下单的顾客(可能是多个人),则可以获取免单。请你编程计算有多少顾客可以获取免单。输入描述输入为n行数据,每一行表示一位顾客的下单时间以(年-月-日时-分-秒.毫秒)形
javascript的六种继承方式
javascript前端
1.原型链式继承functionParent(){this.name='Parent';}Parent.prototype.introduce=function(){console.log(this.name);};functionChild(){this.name='Child';}Child.prototype=newParent();constchildren=newChild();chil
Hadoop:分布式计算平台初探
dccrtbn6261333
大数据 运维 java
Hadoop是一个开发和运行处理大规模数据的软件平台,是Apache的一个用java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算。Hadoop框架中最核心设计就是:MapReduce和HDFS。MapReduce提供了对数据的计算,HDFS提供了海量数据的存储。MapReduceMapReduce的思想是由Google的一篇论文所提及而被广为流传的,简单的一句话解释M
Cache在嵌入式处理器中的使用问题
zhtek
Operating System cache 嵌入式 存储 嵌入式操作系统 出版 工作
Cache在嵌入式处理器中的使用问题作者:西北工业大学王艳吴旭光赵勋峰随着嵌入式计算机应用的发展,嵌入式CPU的主频不断提高,这就造成了慢速系统存储器不能匹配高速CPU处理能力的情况。为了解决这个问题,许多高性能的嵌入式处理器内部集成了高速缓存Cache。其中,三星公司的S3C44B0X内部就集成了8KB空间统一的指令和数据Cache。Cache即高速缓冲存储器,是位于CPU与主存之间一种容量较小
后端面试八股文骚套路之Redis
CS指南
java redis
本期推出八股文骚套路之Redis,目前Redis也是后端技术栈中的一员大将,后端面试过程中对Redis的考察也越来越多。不过在后端面试过程中对Redis的要求没有像MySQL那么高(就是面试官问你Redis,你直接否定三连,这是啥?没听说过!我不会!问题也不是太大)。不过还是我在之前面试八股文系列的文章中所提到的,大家在准备后端面试时,后端技术栈中除了Java基础外至少还要有两到三项做到熟悉,作为
Java Stream reduce()详解
Ben_F
java
reduce()是JavaStreamAPI中的一个终端操作,它用于将流中的元素逐个结合起来,生成一个值。换句话说,reduce()通过对流中的元素应用二元运算(一个接收两个输入参数并返回一个结果的操作),将多个元素“归约”成一个值。1.reduce()方法的作用reduce()用于从流中生成单一结果,常见的用途有:计算总和、乘积计算最大值、最小值将字符串、对象等组合成一个结果reduce()操作
Redisson:Redis界的变形金刚,会变身还会唱跳Rap!
五行星辰
业务系统应用技术 redis 数据库 缓存 java
各位被Java折磨的秃头少年们!今天带你们解锁Redis的究极形态——Redisson!这货不是普通的客户端,是自带机甲还能合体的高达!(00后请自行替换为"量子计算机"理解)准备好见证从单车变飞船的魔法了吗?第一幕:连接姿势の哲学Configconfig=newConfig();config.useSingleServer().setAddress("redis://127.0.0.1:6379
Redis的线程模型
IT小锅巴
redis 数据库 缓存
Redis的线程模型Redis的原子性是如何保证的?Redis是一个非常快的内存数据库,它的操作默认是原子性的,意思是每个操作要么完全成功,要么完全不做,中间不会被打断或停止。也就是说,每次操作要么完全按计划执行完,要么什么都不做,这样可以保证数据的一致性和完整性。Redis的原子性主要靠这几个机制:单线程模型:Redis每次只做一个操作,确保操作按顺序执行,不会被其他操作打断。事务机制(MULT
大数据实战:Spark + Hive 逐笔计算用户盈亏
WuJiWeb3
区块链链上数据分析 从0到1搭建区块链大数据平台 spark hive 大数据 web3 区块链 hadoop
简介本文将通过使用Spark+Hive实现逐笔计算区块链上用户交易数据的盈亏需求。由于我们是进行离线计算,所以我们的数据源是Hive表数据,Sink表也是Hive表,即Spark读取Hive表数据进行批计算之后写回到Hive表并供后续使用。通过本文你将会学到:如何使用SparkSQLAPI读取Hive数据源如何通过读取配置文件进行传参执行SQL如何将SparkSQL转换为JavaRDD进行处理如何
德鲁伊连接池
Java 顶针
oracle 数据库
德鲁伊连接池(DruidConnectionPool)是一个开源的Java数据库连接池项目,用于提高数据库连接的性能和可靠性。德鲁伊连接池通过复用数据库连接、定时验证连接的可用性、自动回收空闲连接等机制,有效减少了数据库连接的创建和销毁开销,提升了应用程序对数据库的访问效率。德鲁伊连接池具有很好的监控和统计功能,可以监控连接池的状态、连接的使用情况、性能指标等,帮助开发人员及时发现和解决数据库连接
解决 Redis 热 Key 问题的方法
阿贾克斯的黎明
java redis
在Redis中,热Key是指被频繁访问的键。热Key问题可能会导致Redis性能下降,甚至影响整个系统的稳定性。以下是一些解决Redis热Key问题的方法:一、使用本地缓存1.原理-在客户端或应用服务器层面使用本地缓存,将热Key的值缓存到本地内存中。当再次访问该Key时,先从本地缓存中获取,如果本地缓存中没有,再从Redis中获取。-这样可以减少对Redis的访问次数,降低Redis的负载。2.
python之迭代
mumux183
python # 基础 python 开发语言
什么叫做迭代?比如在Java中,我们通过List集合的下标来遍历List集合中的元素,在Python中,给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历就是迭代。可是,Python的for循环抽象程度要高于Java的for循环的,为什么这么说呢?因为Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。也就是说,只要是
HTTP协议详解(一)
凉菜凉凉
http 网络协议 网络
GET和POST的请求的区别Post和Get是HTTP请求的两种方法,其区别如下:应用场景:GET请求是一个幂等的请求,一般Get请求用于对服务器资源不会产生影响的场景,比如说请求一个网页的资源。而Post不是一个幂等的请求,一般用于对服务器资源会产生影响的情景,比如注册用户这一类的操作。是否缓存:因为两者应用场景不同,浏览器一般会对Get请求缓存,但很少对Post请求缓存。发送的报文格式:Get
记一次Redis热Key,大Key引发的线上事故
kkBDserver
junit
前言前些日子遇到一次生产环境下的redis热key,大key问题,导致用户疯狂投诉,汗流浃背了,排查过程倒是不难,不过挡不住是临近下班的时候。。。事故背景影响线上:crm.prod.baidu.comcrmprod.baidu.comidg-console.baidu.comerp-uat.baidu.comidgsvc.baidu.com某日,公司某系统的用户突然反映系统响应变得异常缓慢。经初步
深入理解CPU缓存:性能优化的关键
深度Linux
Linux内存管理 C/C++全栈开发 性能优化 linux C/C++
CPU作为计算机的核心部件,其缓存结构犹如一座高效的数据桥梁,在提升计算机性能方面发挥着关键作用。而原子操作,则以其独特的不可分割性,为程序的正确性和稳定性提供了坚实的保障。在接下来的时间里,我们将逐步揭开CPU缓存结构的神秘面纱,深入了解其工作原理和设计理念。同时,我们也将一同探寻原子操作的奥秘,明白它在多线程编程等场景中的重要意义。让我们共同开启这场充满智慧与挑战的科技之旅。一、初识CPU缓存
【Redis 系列】Redis 常问简单面试题
msbQQ
java redis 经验分享
咱们一起来看看redis常问常用的面试题Redis是个啥?http://www.redis.cn/redis中文网给了很明确且清晰的定义[图片上传失败...(image-ff92fa-1650460734395)]Redis是一个开源(BSD许可)的,内存中的数据结构存储系统Redis可以用作数据库、缓存和消息中间件支持的数据结构有8种字符串(strings),散列(hashes),列表(list
Redis常问八股(一)
华东设计之美
java学习 redis 数据库 缓存
1.什么是缓存穿透?怎么解决?答:缓存穿透是指查询一个一定不存在的数据,由于存储层查不到数据因此不写入缓存,这将导致这个不存在的数据每次请求都要到DB去查询,可能导致DB挂掉。这种情况大概率是遭到了攻击。解决方案的话,通常都会用布隆过滤器来解决它。2.你能介绍一下布隆过滤器吗?答:布隆过滤器主要是用于检索一个元素是否在一个集合中。可以使用Redisson实现的布隆过滤器。它的底层原理是,先初始化一
CefSharp 文件下载和保存功能-监听前端事件
Ben_F
CefSharp 前端
重点在启用文件下载和通过JavaScript调用C#保存文件:1.添加文件下载处理器(DownloadHandler)在VueFormService类中,添加一个实现IDownloadHandler接口的类,用于处理文件下载到本地。//新增的DownloadHandler类publicclassDownloadHandler:IDownloadHandler{publicvoidOnBeforeD
redis热key
杏花春雨江南
redis redis 数据库 缓存
在Redis中,热Key(HotKey)是指被频繁访问的Key,可能会导致以下问题:性能瓶颈:单个Redis实例的CPU或网络带宽被耗尽。数据倾斜:在Redis集群中,热Key可能导致某个节点的负载过高。缓存击穿:热Key过期或被删除时,大量请求直接打到数据库,导致数据库压力骤增。以下是处理热Key的常见方法和最佳实践:1.检测热Key1.1使用Redis自带的命令redis-cli--hotke
Java基础语法以及面试技巧(三)
self-discipline634
java 开发语言
Java流程控制核心指南(面试重点)上期面试题解答上文链接:https://blog.csdn.net/weixin_73492487/article/details/1461290581.i++与++i的实现原理区别?2.短路运算符的实际应用场景?3.如何不用临时变量交换两个整数?1.i++与++i的实现原理区别?答:字节码层面,i++先加载值再自增,++i先自增再加载值2.短路运算符的实际应用
Java泛型03:通配符的使用和泛型的继承
金士曼
JavaSE java jvm 开发语言
泛型的使用和在继承方面的注意事项文章目录泛型的使用和在继承方面的注意事项1、泛型在继承方面的体现2、通配符的使用3、通配符的使用:有限制的通配符1、泛型在继承方面的体现基本知识如果B是A的一个子类型(子类或者子接口),而G是具有泛型声明的类或接口,G并不是G的子类型!比如:String是Object的子类,但是List并不是List的子类。类A是类B的父类,G和G二者不具备子父类关系,是并列关系代
自动文摘的METEOR评价指标
Shirveon
自动文摘
参考METEOR下载详细文档$java-Xmx2G-jarmeteor-*.jarexample/xray/system1.hypexample/xray/reference-norm-writeAlignments-fsystem1####exactmatch####java-Xmx2G-jarmeteor-*.jardecodedreference-norm-writeAlignments-f
JavaWeb开发与代码的编写(十九)
wespten
Spring全家桶 微信小程序 Java全栈开发
JavaWeb开发与代码的编写(十九)监听器(Listener)监听器的概念监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动。监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。监听器案例——监听window窗口
JavaEE07 定时器的使用和模拟实现
秋秋睡不醒
JavaEE java
前言前面我们聊了很多关于阻塞队列,单例模式等的应用,今天我们就来聊聊定时器的功能和模拟实现,其实定时器的实现在我们的日常生活中也很常见,比如说平常创建一些定时任务,定时开关机,定时去发表一篇qq空间等等,今天我们就来简单实现一个定时器.1.JVM提供的定时器的使用在自己实现之前,让我们先去看看JVM给我们提供好的定时器是如何使用的吧以下是一个简单的实例我们首先创建了一个定时器对象,定时器对象里面有
JavaEE定时器
nnn9223643
packagecom.ovi.poi.tool;importjava.util.Timer;//定时器类importjavax.servlet.ServletContextEvent;importjavax.servlet.ServletContextListener;publicclassSysContextListenerimplementsServletContextListener{pri
设计高并发系统:从理论到实践
专业WP网站开发-Joyous
学习 架构 java 系统架构
设计高并发系统:从理论到实践在现代互联网应用中,高并发系统设计成为了一个关键课题。随着用户数量的增长和业务需求的增加,高并发系统需要处理大量的请求,确保系统稳定、高效地运行。本文将深入探讨高并发系统的设计,从理论到实践,提供全面的技术指导。目录高并发系统概述系统架构设计核心技术与实现线程模型异步处理缓存策略数据库优化分布式系统设计消息队列与事件驱动负载均衡与反向代理性能测试与监控实际应用案例总结1
Selenium 库的爬虫实现
叱咤少帅(少帅)
Python从入门到高手 selenium
Selenium是什么?Selenium是一个用于自动化Web应用程序测试的工具。它提供了一个用于测试网站的框架,可以模拟用户在浏览器中的操作,如点击链接、填写表单、提交数据等。Selenium可以在多种浏览器和操作系统上运行,并且支持多种编程语言,如Python、Java、JavaScript等。通过编写测试脚本,开发人员可以使用Selenium来自动化执行各种Web应用程序的测试,以确保它们在
关于使用Java语言编写打地鼠游戏
倾听一世,繁花盛开
Java语言打地鼠游戏 开发语言 eclipse spring
用Java语言书写打地鼠游戏关于游戏的介绍《打地鼠游戏》Java代码的实现PlayMouse.javaStartGame.javaMusicPlay.javaMusicPlayTest.java游戏所需图片运行效果结言关于游戏的介绍打地鼠游戏是一款非常受欢迎的敏捷类游戏,它的基本规则简单易懂,同时又充满了挑战性和趣味性。在游戏中,玩家通常需要在一个方形区域内,面对多个地洞,这些地洞中会不定时地冒出
如何查看Linux服务器的硬件配置
Ray.1998
各种命令 服务器 linux 运维
Linux系统提供了多种命令和工具来查看硬件配置信息。下面是一些常用的方法:1.CPU信息lscpu:提供CPU的详细统计信息,包括型号、核心数、线程数、缓存大小等。Bashlscpu/proc/cpuinfo:包含每个CPU核心的详细参数,如型号、频率、缓存等。Bashcat/proc/cpuinfo2.内存信息free:显示系统内存的使用情况。Bashfree-m/proc/meminfo:提
【华为OD机考真题】- 路灯照明(Java)
敲击Time
华为od java 链表
输入描述第一行为一个数N,表示路灯个数:1100,70+20100&&lightCoverArea[index]+100100&&lightCoverArea[index]+100>preVal){preVal=lightCoverArea[index];}elseif(preVal100){preVal=lightCoverArea[index];}judgeUnCover(num,lightC
Java实现的基于模板的网页结构化信息精准抽取组件:HtmlExtractor
yangshangchuan
信息抽取 HtmlExtractor 精准抽取 信息采集
HtmlExtractor是一个Java实现的基于模板的网页结构化信息精准抽取组件,本身并不包含爬虫功能,但可被爬虫或其他程序调用以便更精准地对网页结构化信息进行抽取。
HtmlExtractor是为大规模分布式环境设计的,采用主从架构,主节点负责维护抽取规则,从节点向主节点请求抽取规则,当抽取规则发生变化,主节点主动通知从节点,从而能实现抽取规则变化之后的实时动态生效。
如
java编程思想 -- 多态
百合不是茶
java 多态详解
一: 向上转型和向下转型
面向对象中的转型只会发生在有继承关系的子类和父类中(接口的实现也包括在这里)。父类:人 子类:男人向上转型: Person p = new Man() ; //向上转型不需要强制类型转化向下转型: Man man =
[自动数据处理]稳扎稳打,逐步形成自有ADP系统体系
comsci
dp
对于国内的IT行业来讲,虽然我们已经有了"两弹一星",在局部领域形成了自己独有的技术特征,并初步摆脱了国外的控制...但是前面的路还很长....
首先是我们的自动数据处理系统还无法处理很多高级工程...中等规模的拓扑分析系统也没有完成,更加复杂的
storm 自定义 日志文件
商人shang
storm cluster logback
Storm中的日志级级别默认为INFO,并且,日志文件是根据worker号来进行区分的,这样,同一个log文件中的信息不一定是一个业务的,这样就会有以下两个需求出现:
1. 想要进行一些调试信息的输出
2. 调试信息或者业务日志信息想要输出到一些固定的文件中
不要怕,不要烦恼,其实Storm已经提供了这样的支持,可以通过自定义logback 下的 cluster.xml 来输
Extjs3 SpringMVC使用 @RequestBody 标签问题记录
21jhf
springMVC使用 @RequestBody(required = false) UserVO userInfo
传递json对象数据,往往会出现http 415,400,500等错误,总结一下需要使用ajax提交json数据才行,ajax提交使用proxy,参数为jsonData,不能为params;另外,需要设置Content-type属性为json,代码如下:
(由于使用了父类aaa
一些排错方法
文强chu
方法
1、java.lang.IllegalStateException: Class invariant violation
at org.apache.log4j.LogManager.getLoggerRepository(LogManager.java:199)at org.apache.log4j.LogManager.getLogger(LogManager.java:228)
at o
Swing中文件恢复我觉得很难
小桔子
swing
我那个草了!老大怎么回事,怎么做项目评估的?只会说相信你可以做的,试一下,有的是时间!
用java开发一个图文处理工具,类似word,任意位置插入、拖动、删除图片以及文本等。文本框、流程图等,数据保存数据库,其余可保存pdf格式。ok,姐姐千辛万苦,
php 文件操作
aichenglong
PHP 读取文件 写入文件
1 写入文件
@$fp=fopen("$DOCUMENT_ROOT/order.txt", "ab");
if(!$fp){
echo "open file error" ;
exit;
}
$outputstring="date:"." \t tire:".$tire."
MySQL的btree索引和hash索引的区别
AILIKES
数据结构 mysql 算法
Hash 索引结构的特殊性,其 检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢
JAVA的抽象--- 接口 --实现
百合不是茶
抽象 接口 实现接口
//抽象 类 ,方法
//定义一个公共抽象的类 ,并在类中定义一个抽象的方法体
抽象的定义使用abstract
abstract class A 定义一个抽象类 例如:
//定义一个基类
public abstract class A{
//抽象类不能用来实例化,只能用来继承
//
JS变量作用域实例
bijian1013
作用域
<script>
var scope='hello';
function a(){
console.log(scope); //undefined
var scope='world';
console.log(scope); //world
console.log(b);
TDD实践(二)
bijian1013
java TDD
实践题目:分解质因数
Step1:
单元测试:
package com.bijian.study.factor.test;
import java.util.Arrays;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import com.bijian.
[MongoDB学习笔记一]MongoDB主从复制
bit1129
mongodb
MongoDB称为分布式数据库,主要原因是1.基于副本集的数据备份, 2.基于切片的数据扩容。副本集解决数据的读写性能问题,切片解决了MongoDB的数据扩容问题。
事实上,MongoDB提供了主从复制和副本复制两种备份方式,在MongoDB的主从复制和副本复制集群环境中,只有一台作为主服务器,另外一台或者多台服务器作为从服务器。 本文介绍MongoDB的主从复制模式,需要指明
【HBase五】Java API操作HBase
bit1129
hbase
import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.ha
python调用zabbix api接口实时展示数据
ronin47
zabbix api接口来进行展示。经过思考之后,计划获取如下内容: 1、 获得认证密钥 2、 获取zabbix所有的主机组 3、 获取单个组下的所有主机 4、 获取某个主机下的所有监控项
jsp取得绝对路径
byalias
绝对路径
在JavaWeb开发中,常使用绝对路径的方式来引入JavaScript和CSS文件,这样可以避免因为目录变动导致引入文件找不到的情况,常用的做法如下:
一、使用${pageContext.request.contextPath}
代码” ${pageContext.request.contextPath}”的作用是取出部署的应用程序名,这样不管如何部署,所用路径都是正确的。
Java定时任务调度:用ExecutorService取代Timer
bylijinnan
java
《Java并发编程实战》一书提到的用ExecutorService取代Java Timer有几个理由,我认为其中最重要的理由是:
如果TimerTask抛出未检查的异常,Timer将会产生无法预料的行为。Timer线程并不捕获异常,所以 TimerTask抛出的未检查的异常会终止timer线程。这种情况下,Timer也不会再重新恢复线程的执行了;它错误的认为整个Timer都被取消了。此时,已经被
SQL 优化原则
chicony
sql
一、问题的提出
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统
java 线程弹球小游戏
CrazyMizzz
java 游戏
最近java学到线程,于是做了一个线程弹球的小游戏,不过还没完善
这里是提纲
1.线程弹球游戏实现
1.实现界面需要使用哪些API类
JFrame
JPanel
JButton
FlowLayout
Graphics2D
Thread
Color
ActionListener
ActionEvent
MouseListener
Mouse
hadoop jps出现process information unavailable提示解决办法
daizj
hadoop jps
hadoop jps出现process information unavailable提示解决办法
jps时出现如下信息:
3019 -- process information unavailable3053 -- process information unavailable2985 -- process information unavailable2917 --
PHP图片水印缩放类实现
dcj3sjt126com
PHP
<?php
class Image{
private $path;
function __construct($path='./'){
$this->path=rtrim($path,'/').'/';
}
//水印函数,参数:背景图,水印图,位置,前缀,TMD透明度
public function water($b,$l,$pos
IOS控件学习:UILabel常用属性与用法
dcj3sjt126com
ios UILabel
参考网站:
http://shijue.me/show_text/521c396a8ddf876566000007
http://www.tuicool.com/articles/zquENb
http://blog.csdn.net/a451493485/article/details/9454695
http://wiki.eoe.cn/page/iOS_pptl_artile_281
完全手动建立maven骨架
eksliang
java eclipse Web
建一个 JAVA 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=App
[-Dversion=0.0.1-SNAPSHOT]
[-Dpackaging=jar]
建一个 web 项目 :
mvn archetype:create
-DgroupId=com.demo
-DartifactId=web-a
配置清单
gengzg
配置
1、修改grub启动的内核版本
vi /boot/grub/grub.conf
将default 0改为1
拷贝mt7601Usta.ko到/lib文件夹
拷贝RT2870STA.dat到 /etc/Wireless/RT2870STA/文件夹
拷贝wifiscan到bin文件夹,chmod 775 /bin/wifiscan
拷贝wifiget.sh到bin文件夹,chm
Windows端口被占用处理方法
huqiji
windows
以下文章主要以80端口号为例,如果想知道其他的端口号也可以使用该方法..........................1、在windows下如何查看80端口占用情况?是被哪个进程占用?如何终止等. 这里主要是用到windows下的DOS工具,点击"开始"--"运行",输入&
开源ckplayer 网页播放器, 跨平台(html5, mobile),flv, f4v, mp4, rtmp协议. webm, ogg, m3u8 !
天梯梦
mobile
CKplayer,其全称为超酷flv播放器,它是一款用于网页上播放视频的软件,支持的格式有:http协议上的flv,f4v,mp4格式,同时支持rtmp视频流格 式播放,此播放器的特点在于用户可以自己定义播放器的风格,诸如播放/暂停按钮,静音按钮,全屏按钮都是以外部图片接口形式调用,用户根据自己的需要制作 出播放器风格所需要使用的各个按钮图片然后替换掉原始风格里相应的图片就可以制作出自己的风格了,
简单工厂设计模式
hm4123660
java 工厂设计模式 简单工厂模式
简单工厂模式(Simple Factory Pattern)属于类的创新型模式,又叫静态工厂方法模式。是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
maven笔记
zhb8015
maven
跳过测试阶段:
mvn package -DskipTests
临时性跳过测试代码的编译:
mvn package -Dmaven.test.skip=true
maven.test.skip同时控制maven-compiler-plugin和maven-surefire-plugin两个插件的行为,即跳过编译,又跳过测试。
指定测试类
mvn test
非mapreduce生成Hfile,然后导入hbase当中
Stark_Summer
map hbase reduce Hfile path实例
最近一个群友的boss让研究hbase,让hbase的入库速度达到5w+/s,这可愁死了,4台个人电脑组成的集群,多线程入库调了好久,速度也才1w左右,都没有达到理想的那种速度,然后就想到了这种方式,但是网上多是用mapreduce来实现入库,而现在的需求是实时入库,不生成文件了,所以就只能自己用代码实现了,但是网上查了很多资料都没有查到,最后在一个网友的指引下,看了源码,最后找到了生成Hfile
jsp web tomcat 编码问题
王新春
tomcat jsp pageEncode
今天配置jsp项目在tomcat上,windows上正常,而linux上显示乱码,最后定位原因为tomcat 的server.xml 文件的配置,添加 URIEncoding 属性:
<Connector port="8080" protocol="HTTP/1.1"
connectionTi