IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

后端

共 1964 篇文章

IT 2016-03-07 23:30:48 / 累计浏览 2,383

java8新特性——Lambda表达式

作者从Lambda表达式的定义出发,剖析了这个Java 8中被称为“闭包”的新特性。文章核心在于展示Lambda如何通过表达式直接代替功能接口,并用简洁的`->`语法连接参数列表与函数体,从而大幅提升代码可读性。 文中通过生动的代码对比,直观呈现了Lambda的简化效果:无论是排序任务中用一行表达式替代冗长的匿名内部类,还是在集合转换场景下,结合Stream API使用Lambda进行链式操作,代码都变得极为精炼。文章不仅介绍了基础语法,还具体展示了`java.util.function`包与`java.util.stream`包如何与之配合,实现对集合数据的批量处理。 作者最终总结,Lambda表达式与Stream的结合,是自泛型和注解以来对Java生态影响最深远的变化之一,它让开发者能以更声明式、更简洁的方式编写代码,也为并行类库的编写奠定了基础。

本机暂存
IT 2016-03-06 23:03:32 / 累计浏览 7,665

Java技术路线

这篇讲的是Java开发者从初阶到架构师的成长路线。 作者从一个常见痛点出发:很多开发者感觉需要提升,却不知道从哪里着手,也不清楚自己当前处于什么水平。为了解决这个问题,文章绘制了一张详细的Java技术路线图,并将进阶路径清晰地划分为五个阶段。 路线图从扎实的Java基础开始,涵盖了反射、多线程、IO等核心编程,再到JSP、Servlet这些Web开发基石。接着进入框架时代,梳理了经典的SSH(Struts+Spring+Hibernate)和SSI技术栈。随着经验增长,文章引导开发者走向高级领域,包括分布式开发、开源框架整合,直至最终的系统架构师角色,涉及SOA/云架构、设计模式与UML建模等宏观技能。 这份指南最大的特点是具体和结构化。它没有泛泛而谈,而是针对每个阶段都列出了必须掌握的关键技术点,比如从JDK命令、Linux部署,到事务管理、负载均衡,再到抽象工厂、观察者模式等。对于想系统规划技术栈、明确学习重点的开发者来说,这份指南提供了一个很清晰的参照框架。

本机暂存
IT 2016-03-03 14:12:05 / 累计浏览 5,063

开启命令行下的社交

这篇文章记录了作者将社交工具搬到命令行终端的一次有趣实践。作者近期沉浸于命令行工作环境,尝试脱离图形界面,探索如何在终端中处理即时通信需求。 核心部分介绍了开源项目 Mojo-Webqq 的安装与使用。这是一个基于 Perl 的非 GUI 框架,能作为 SmartQQ/WebQQ 的命令行客户端。文章详细列出了在 Mac 上通过 cpanm 安装的步骤,以及如何配置一个基础脚本启动 QQ 登录并搭建本地 HTTP 服务,从而通过 curl 等命令实现消息的收发,为 QQ 消息的自动化处理提供了接口基础。 此外,作者还回顾了使用命令行 IRC 客户端(如 Weechat 和 irssi)的经历。文章比较了两者在安装和中文支持上的差异,并分享了通过 `/help` 命令探索使用、配置服务器连接和频道加入的入门路径,展现了 IRC 这个经典技术交流平台在终端下的独特魅力。 整体而言,文章从个人工作流的转变出发,具体演示了如何用工具和脚本在命令行中搭建社交桥梁,为希望摆脱图形界面束缚的开发者提供了一种可能。

本机暂存
IT 2016-03-01 23:46:29 / 累计浏览 1,262

使用docopt轻松实现python命令行参数处理

这篇讲的是如何用Python库docopt优雅地处理命令行参数。作者从一个实际需求出发——需要在命令行中快速添加或删除测试套件(testsuite)和测试用例(testcase),从而发现了这个颇为巧妙的工具。 docopt的核心思想很特别:它直接将程序的使用说明(即__doc__字符串)解析为命令行参数。你只需要按照一定的格式编写文档字符串,例如用“Usage:”部分描述用法,用“Options:”部分列出参数,docopt就能自动完成参数解析。这告别了繁琐的argparse配置,让参数处理与用户文档天然同步。 文章提供了一个完整的demo代码,清晰地展示了从文档字符串定义到参数解析、再到实际逻辑(列表增删)的全过程。执行效果部分也展示了成功操作和错误处理的场景,比如尝试删除一个不存在的测试用例时的反馈。 尽管作者提到docopt已有段时间未更新,但其设计思想在特定场景下依然实用,尤其适合那些希望参数定义与使用文档保持高度一致的轻量级命令行工具。

本机暂存
IT 2016-03-01 23:45:37 / 累计浏览 3,324

PHP 用 curl 读取 HTTP chunked 数据

这篇讲的是在PHP中使用curl处理流式HTTP chunked数据时,遇到的一个实际坑点与解决方法。当需要实时处理服务器推送的每个数据块(比如对接icomet这类服务)时,开发者自然想到使用`CURLOPT_WRITEFUNCTION`回调。但实际会发现,一个逻辑上的chunk数据,回调函数可能会被多次触发,每次只收到大约16k的片段,破坏了数据的完整性。 文章指出了问题的根源:curl底层传输机制导致回调被分割,而非按应用层chunk边界返回。作者给出的解决方案巧妙且实用:在回调函数内维护一个静态缓冲区,将每次收到的片段拼接起来,并以特定分隔符(如`\n`)为界进行分割,确保每次只处理一个完整的应用层数据块。这种方法兼顾了实时性与数据完整性,是处理此类流式接口时一个值得借鉴的细节技巧。

本机暂存
IT 2016-03-01 14:15:37 / 累计浏览 21,966

Java开发岗位面试题归类汇总

这是一篇将Java岗位面试高频知识点进行系统归类的汇总文章。作者从Java基础、IO、Web、JVM、开源框架、多线程、网络通信、数据库、设计模式、算法、并发与性能调优等十二个维度,梳理了上百个经典面试问题。 文章并非单纯罗列题目,而是将问题嵌入具体的技术场景中。例如,在基础部分会追问HashMap底层原理与Hash冲突解决,在多线程部分则围绕线程池、锁机制和并发容器展开,而在性能调优章节,则抛出“每秒5千请求如何设计”这样的实战架构题,引导读者思考从单机到集群的解决方案。 它清晰地勾勒出一名合格Java工程师需要掌握的知识图谱,覆盖了从理论概念到框架原理,再到系统设计的完整链条。对于准备面试或希望系统查漏补缺的开发者来说,这份归类清晰的清单,提供了一个扎实的复习与自检框架。

本机暂存
IT 2016-02-29 23:49:04 / 累计浏览 2,427

Jetty 8长连接上的又一个坑

这篇讲的是 Jetty 8 长连接处理中一个隐蔽的“坑”:超时断开机制只在数据传输阶段生效,一旦数据进入服务端处理环节,就不再检测空闲。作者从 `SelectChannelEndpoint` 类的核心代码入手,解释了连接如何通过 `setCheckForIdle` 和 `notIdle` 方法被标记为“空闲”或“非空闲”,从而控制超时判断。 问题的关键点发生在请求数据收集完毕、即将提交给后端 Servlet 处理的瞬间。在 `AsyncHttpConnection` 的 `handle` 方法中,代码在调用 `_asyncEndp.setCheckForIdle(false)` 后,可能会因为复杂的处理流程和异常路径,导致该标志位未能按预期复位。这使得在后端业务逻辑执行期间,select 线程依然在监测连接的“空闲时间”,一旦处理耗时超过阈值,连接就会被错误地断开——即便业务数据正在处理中。 文章通过代码走读,精准定位了这个因状态管理不严谨导致的并发陷阱。对于使用 Jetty 8 进行长连接服务的开发者来说,理解这一机制尤为重要,尤其是在设计耗时较长的异步处理逻辑时,需要格外注意避免此类意外断连。

本机暂存
IT 2016-02-29 23:41:55 / 累计浏览 1,747

NodeJS的代码调试和性能调优

这篇讲的是NodeJS调试方法的演进与核心实践。作者从NodeJS版本合并的背景切入,指出许多开发者仍停留在`console.log`或`asserts`模块的基础调试阶段,这些方式需要将调试逻辑硬编码进业务代码。为此,文章详细介绍了NodeJS内建的命令行调试器作为更专业的解决方案。 核心方法是通过`node debug`命令启动文件,进入一个提供丰富调试指令的环境。文章清晰地区分了“debug模式”(用于单步执行、设置断点)和“repl模式”(用于实时检查变量状态),并列举了`cont`、`next`、`step`等关键命令。这种调试方式通过TCP与内建模块通信,摆脱了在代码中“埋点”的束缚,让调试过程更干净、高效。 文章最后也点出了调试器的工作原理,并提及IDE集成的图形化调试工具是其更友好的封装。其价值在于,它将调试从一种“破坏性”的辅助操作,转变为一种与代码分离的、系统化的质量保障流程。

本机暂存
IT 2016-02-21 22:57:40 / 累计浏览 3,444

一个Laravel队列引发的报警

作者从一次诡异的服务器报警说起:集群中某台服务器内存飙高,但通过常规命令却查不到内存大户。通过对比不同服务器的进程列表,线索最终指向了 Laravel 队列。 深入排查后发现,问题的根源并非进程自身,而是 Laravel 队列在默认的监听模式下,其子进程会频繁重启。每次重启都会创建并删除大量临时文件,导致 Linux 系统内核中的 dentry 缓存(目录项缓存)被急剧撑大,从而“吃掉”了大量内存。文章通过 strace 跟踪清晰地捕捉到了这一过程。 针对这一问题,作者提供了两个层面的解决方案:一是应用层面,强烈推荐启用 Laravel 队列的守护进程模式,避免不必要的进程重启;二是系统层面,在无法避免频繁文件操作时,可以通过调整内核参数如 `vfs_cache_pressure` 来尝试缓解。整篇文章完整展现了从现象入手,借助工具抽丝剥茧,最终定位到内核缓存层面问题的精彩排查思路。

本机暂存
IT 2016-02-21 22:42:33 / 累计浏览 2,723

[Java基础教程]第十章-Java容器

这篇讲的是如何用“小明打酱油”这个生活化例子,来拆解Java核心容器(List、Set、Map)的用法与区别。作者从重构打酱油流程出发,先让商店用`ArrayList`持有酱油列表,并详细演示了增、删、改、查的基本操作。 很快代码暴露了问题:商店用List卖酱油,居然反复给了小明同一瓶!这个错误生动地引出了`List`有重复、有序的特性。于是,文章引入了`Set`(以`HashSet`为例)来解决去重问题,重构代码后小明终于拿到了正确的5瓶酱油。这部分对比了List与Set在数据结构和适用场景上的关键差异。 文章并未止步于此,它进一步扩展场景:当商店要支持多品牌酱油时,简单的集合不够用了。这时,`Map`(以`HashMap`作为实现)登场,通过“品牌名(key)-酱油列表(value)”的映射关系,优雅地解决了分类存储和查找的需求。整个过程自然融入了泛型、接口与实现类、以及遍历方式(普通循环与foreach)等知识点。 作者通过一步步迭代代码、暴露问题并修复,让读者在贴近生活的业务逻辑中,直观掌握了Java常用容器的核心特性和典型应用场景。

本机暂存
IT 2016-02-21 22:40:23 / 累计浏览 2,505

[Java基础教程]第九章-Java日期处理

这篇讲的是Java日期处理的基础入门。作者从“Java中时间如何表示”这个问题切入,解释了系统以1970年1月1日为基准,用毫秒数记录时间的本质。文章演示了如何通过 `System.currentTimeMillis()` 和 `Date` 类获取当前时间戳,同时也指出了直接打印 `Date` 对象会输出类似“Mon Feb 01 ...”的默认格式,对不熟悉这种表达的开发者来说不够直观。 为了解决这个格式化问题,文章重点介绍了 `DateFormat` 工具类及其常用子类 `SimpleDateFormat`。通过一个具体的代码示例,作者展示了如何用一行简单的格式化模式(如 `"yyyy-MM-dd HH:mm:ss"`)将时间戳转换为我们熟悉的“年-月-日 时:分:秒”格式。文章还附上了一张详尽的表格,列出了从 `G`(纪元)、`y`(年)到 `M`(月)等所有格式化字母的含义与示例,方便读者随时查阅。 对于刚接触Java时间API的开发者,这篇文章清晰地走通了从获取原始时间到输出友好格式的完整路径。它把散落在官方文档中的零散知识点(时间戳、Date类、格式化规则)串联成一个实用的操作流程,帮助读者建立起处理日期时间的第一块基石。

本机暂存
IT 2016-02-21 11:32:24 / 累计浏览 2,343

[Java基础教程]第八章-Java字符串

这篇讲的是Java里无处不在的String类,堪称“第九种基础数据类型”。作者从字符串的初始化开始,对比了直接赋值和通过new关键字创建的区别,并指出前者更为常用。在字符串拼接部分,文章对比了直观的“+”运算符与性能更高的StringBuilder,建议在拼接超过5个字符串时考虑后者。 文章重点厘清了几个常见误区。首先是基本类型与String的相互转换,详细列举了int转String的多种方式,以及String转int的两种常用方法。更关键的一点是字符串比较的陷阱:用“==”比较两个值相同的字符串可能返回false,这是因为涉及到了JVM的存储机制。作者明确指出,必须使用equals()方法来比较字符串的内容,以确保结果符合预期。 此外,文章还快速介绍了length()、substring()、charAt()等常用字符串操作方法,并通过一个统计字母出现次数的练习来巩固知识。整体内容扎实,对于刚接触Java字符串的开发者来说,能有效避开几个初期容易踩的坑。

本机暂存
IT 2016-02-21 11:13:28 / 累计浏览 3,465

DLNA家庭高清视频组网方案

这篇讲的是怎么用DLNA技术,在家庭Wi-Fi环境下,让手机、平板和电视都能流畅播放电脑或硬盘里的高清视频。 作者从最常见的需求出发:视频存在PC或移动硬盘上,想在手机、iPad和智能电视上随时播放,还能控制进度,并且支持AVI、MKV、MP4等常见格式。文章先横向对比了三种主流方案:土豪用NAS一体机,折中选带USB接口的智能路由器,以及最省钱的“穷人方案”——在PC上搭建DLNA服务器。 文章的核心就是详细拆解这个成本最低的PC方案。具体来说,需要在PC端安装像TwonkyMedia server这样的DMS软件,配置好共享视频的目录;然后在手机或iPad上安装支持DLNA的播放器,比如iPad上推荐oPlayer,安卓端推荐VLC。这样,只要PC开机并处于同一网络,移动设备就能发现服务器并播放里面的影片。 作者通过具体的软件配置截图和播放器界面展示,把搭建步骤讲得比较清楚。这个方案的关键在于,它绕过了购买专用硬件的门槛,用一台常用电脑就能搞定家庭影音的无线共享,对预算有限但又想享受便利的用户来说,是个切实可行的起点。

本机暂存
IT 2016-02-20 16:47:13 / 累计浏览 2,203

nodejs文件无刷新上传

这篇讲的是在Node.js环境下如何实现文件无刷新上传,改善传统表单提交带来的页面刷新问题。作者从ExpressJS和multiparty工具包出发,详细拆解了基于RFC1867协议的两种异步上传方案。 第一种方案利用隐藏的iframe接收服务器响应,避免页面跳转,并通过JavaScript跨窗口调用实现结果回传。这种思路兼容性极佳,适合需要覆盖老旧浏览器的场景。第二种方案则拥抱现代Web技术,使用XMLHttpRequest第二版和FormData对象实现真正的Ajax异步上传,但需要浏览器对相关标准有较好支持。 文章并未止步于方案罗列,而是进一步展示了如何通过路由参数合并两种方式的后端逻辑,体现了代码复用的工程思维。无论是对iframe这一“老技术”新用的剖析,还是对前端上传演进思路的梳理,对开发者在实际项目中选择合适方案都有清晰的参考价值。

本机暂存
IT 2016-02-20 16:44:17 / 累计浏览 3,222

使用varnish + nginx + lua搭建网站的降级系统

这篇文章讲的是如何用Varnish、Nginx和Lua脚本搭建一个网站降级系统,核心目标是在数据库等后端服务出现致命故障(如500错误)时,能自动切换到展示缓存的静态页面,从而维持最基本的浏览功能。 作者首先明确了降级方案的三个关键点:只提供基础浏览、数据为非登录状态、支持手动与自动触发。整个系统的存储层由Varnish承担,利用其内存缓存来平衡性能与资源。为了保持缓存数据的时效性,作者设计了一个异步更新机制:通过crond定时任务分析Nginx的access日志,提取出热门请求URL,再主动向Varnish发起请求以刷新对应缓存,从而减轻了主站的压力。 降级的触发与切换逻辑主要通过Nginx结合Lua脚本来实现。在Nginx中,通过Lua脚本检查一个共享内存字典中的降级状态标志。一旦进入降级模式,所有PHP动态请求会被重定向,直接从Varnish获取数据返回给用户。自动降级功能则通过监控后端健康状态来实现,例如,当后端监控脚本返回500错误时,Varnish和Nginx都能自动感知并进入降级状态;恢复正常后,系统也会自动切换回来。管理员还可以通过特定的接口进行手动降级操作。 文章详细给出了从Varnish安装、Lua脚本部署到Nginx配置修改的完整步骤,并提供了相关的配置文件和脚本下载。对于需要保障高可用性的Web服务,这套结合了缓存、负载与动态逻辑切换的降级方案,提供了一个清晰且可落地的实践参考。

本机暂存
IT 2016-02-20 14:17:52 / 累计浏览 1,923

[Java基础教程]第七章-Java流程控制

这篇讲的是Java流程控制,作者从一个特别生活化的场景出发——小明帮妈妈打酱油,根据“有瓶装就买瓶装,否则买袋装”的指令,自然地引入了if-else条件判断。文章没有停留在最基础的语法上,而是通过重构代码,演示了如何用面向对象的方式组织逻辑,并对比了if-else与switch-case这两种处理多分支场景的结构。文章指出,当条件分支增多时,switch-case写法更优雅,但提醒要注意每个case后的break语句,否则会发生“穿透”执行。 接着,文章用“小明家开饭店要批量买酱油”的例子,讲解了while和for两种循环,并对比了它们的结构特点:while更直观,for则将初始化、条件、增量整合在一起,代码更紧凑。在循环控制中,作者还结合预算限制,演示了break提前终止循环和continue跳过本次循环的用法,并顺带说明了比较运算符与逻辑运算符(如&&、||)的配合使用。 最后,文章总结了三种运算符的优先级,并附上了一个“打印5000以内质数”的小练习来巩固所学。整体上,作者把枯燥的语法点融入了一连串的“打酱油”任务中,让流程控制的逻辑显得清晰又实用。

本机暂存
IT 2016-02-20 11:23:45 / 累计浏览 1,883

ghost改掉默认首页

这篇讲的是如何在一个Ghost博客的域名下,同时运行PHP页面并替换默认首页。 作者遇到的实际需求是让同一域名既支持Ghost博客,又能运行PHP,且PHP页面作为首页。他没有选择复杂的插件或二次开发,而是用Nginx反向代理的经典思路巧妙解决:将Ghost改到8080端口运行,Nginx在80端口接收所有请求,并通过配置精准分流——所有`.php`请求交给PHP解释器处理,其余请求则代理回Ghost。 文章给出了完整的Nginx配置文件片段,清晰地展示了`location`块如何通过不同规则实现请求转发。针对如何让Ghost的博客列表出现在新的`/blog/`路径下,作者还演示了利用Ghost Public API和模板引擎的`{{#get}}`助手,新建静态页并修改主题文件来实现的步骤。 这是一份从端口规划、服务部署到前端模板修改的完整操作记录,对需要在同一Web服务器上混合部署不同应用(如Node.js与PHP)的开发者有直接的参考价值。

本机暂存
IT 2016-02-16 20:34:34 / 累计浏览 3,487

三次性能优化经历

这篇分享的是作者在技术生涯中三次重要的性能优化经历,涵盖了Portal、Service和Spark三个不同场景,每次优化都持续数月,充满了挑战与实战心得。 在Portal优化中,作者强调首先厘清前后端交互模型,通过划分页面组件的动态与静态部分来实施缓存策略,并指出统一接口设计对于优化的基础性作用——杂乱无章的交互模型往往成为噩梦。Service优化则聚焦高并发查询场景,尝试了Memcached作为中心缓存以提高命中率,但需处理缓存失效带来的风险和延迟问题;同时探索了计算迁移到客户端和异步预处理,最终将数据源迁移到NoSQL的DynamoDB以减轻数据库压力。Spark优化更为系统化,作者测试了不同实例类型、内存配置和executor数量下的性能表现,评估性价比,并修正代码中的并行化问题;特别关注了异常数据量下的稳健性,如Q4业务暴涨时的处理。 作者通过这些复盘揭示,性能优化的核心始终围绕CPU、内存、网络和并行度的平衡,但具体策略需因地制宜。优化时不仅要关注单一指标,还需考虑整体系统行为,比如缓存失效时的压力转移,或Spark中

本机暂存
IT 2016-02-16 20:34:00 / 累计浏览 2,144

iphp 框架增加 lazyload 特性

这篇讲的是iphp框架如何通过引入lazyload特性来解决一个常见的性能优化问题。 作者从基类设计的便利性出发,指出现实中的痛点:为了使用方便,基类通常会一次性加载所有可能用到的属性到Context对象中。但这会导致不必要的数据库查询,造成性能浪费。为了解决这个问题,作者实现了`Context::lazyload()`方法。 核心思路非常巧妙:它允许开发者声明一个属性,并绑定一个回调函数。这个属性只有在第一次被实际访问时,才会触发回调函数去执行真正的数据加载(比如查询数据库)。如果整个请求流程中该属性从未被使用,则完全不会产生开销。文章通过一个具体的`AppController`示例清晰地展示了这一机制:`account`属性被延迟加载,只有在子类中需要用户账户信息时,才会去查询,否则不会发生任何数据库请求。 通过这种方式,iphp框架将资源的加载控制权交给了实际的使用场景,在保持代码简洁性的同时,显著提升了应用的响应速度和资源利用效率。

本机暂存
IT 2016-02-13 23:39:24 / 累计浏览 1,682

由NodeJieba谈谈Node.js异步实现

这篇文章以NodeJieba这个中文分词库的源码为例,深入浅出地拆解了Node.js异步操作的底层实现原理。作者没有停留在理论层面,而是直接打开`cut`函数的C++实现代码,带领读者一步步看清异步调用的“幕后”。 核心思路非常清晰:当我们在JavaScript中调用异步的`cut`函数时,实际是创建了一个`CutWorker`对象并将其推入`NanAsyncQueueWorker`队列。真正的耗时分词操作`segment.cut()`在后台线程的`Execute`方法中静默执行,完成后则通过`HandleOKCallback`回到主线程触发回调。 文章特别点明了两个巧妙而关键的设计:一是`CutWorker`必须用私有成员变量(如`inputStr`)来保持状态,确保后台线程执行时参数依然有效,即使原栈变量已销毁;二是整个异步非阻塞的魔力,正源于“主线程只负责投递任务,后台线程持续轮询队列并执行”这一经典线程池模型。 通过这个具体的例子,作者揭示了Node.js异步的本质其实并不高深,它无非是“状态保存”与“后台队列执行”两个核心环节的组合,为许多初学者揭开了异步编程的神秘面纱。

本机暂存