令牌桶和漏桶限流算法的 Java 实现
Spring 之 @Async 与线程池的使用
SpringBoot3 基础教程之一快速入门
大纲
- SpringBoot3 基础教程之一快速入门
- SpringBoot3 基础教程之二常规配置
- SpringBoot3 基础教程之三 Web 开发
- SpringBoot3 基础教程之四 Web 开发
- SpringBoot3 基础教程之五基础特性
- SpringBoot3 基础教程之六场景整合
- SpringBoot3 基础教程之七场景整合
- SpringBoot3 基础教程之八场景整合
- SpringBoot3 基础教程之九核心原理
开发环境要求
环境 & 工具 | 版本 |
---|---|
SpringBoot | 3.0.5+ |
IDEA | 2021.2.1+ |
JDK | 17+ |
Maven | 3.5+ |
Tomcat | 10.0+ |
Servlet | 5.0+ |
GraalVM Community | 22.3+ |
Native Build Tools | 0.9.19+ |
Hexo 主题兼容 Pjax
什么是 Pjax
Pjax 通过 Ajax 从服务器获取 HTML 内容,然后用加载到的 HTML 替换页面上容器元素的内容。Pjax 使用 pushState
更新浏览器中的当前 URL,即 pjax = pushState + ajax
。最早的时候,Pjax 是一个基于 jQuery 的插件,后来推出了完全独立的版本,适用更广泛的应用场景。值得一提的是,Pjax 最大的优势在于,可以在网站本身无刷新的情况下,局部刷新页面内容,同时在现代浏览器中支持前进和后退,由于局部加载的数据量极小,加载速度极快,因此可以最大程度地提升用户体验。Pjax 的天生劣势在于,默认配置对 SEO 并不友好,同时非常依赖页面布局的一致性,需要大量改造来优化。
Hexo 引入 Pjax
很多较早使用 Pjax 的 Hexo 主题,都使用了基于 jQuery 的版本。因此如果是新引入,可以使用最新独立版本的 Pjax。
1 | <script src="https://cdn.jsdelivr.net/npm/pjax@VERSION/pjax.min.js"></script> |
Vue 项目中禁用浏览器缓存配置
C++ 网络编程之一网络框架介绍
技术选型
常用的网络框架
Boost.Asio:Boost.Asio 是一个跨平台的 C++ 网络编程库,提供了异步 I/O 操作的抽象。它可以处理 TCP、UDP、SSL 等协议,并提供了丰富的异步操作和事件处理机制。
POCO C++ Libraries:POCO 是一个功能强大的 C++ 类库,其中包含了丰富的网络通信模块,包括 HTTP、SMTP、POP3、FTP 等协议的支持,以及 WebSocket、WebSocket Secure 等高级功能。
cpp-netlib:cpp-netlib 是一个轻量级的 C++ 网络编程库,提供了 HTTP、HTTP client、HTTP server 等模块。它设计简单,易于使用,并提供了现代 C++ 风格的 API。
Muduo:Muduo 是一个基于事件驱动的 C++ 网络库,用于构建高性能的服务器应用。它提供了事件循环、线程池、定时器、TCP/UDP 服务器等模块,可以处理大量的并发连接。
C++ REST SDK:C++ REST SDK 是由微软开发的一个 C++ 库,用于构建基于 HTTP 的服务和客户端。它提供了现代 C++ 风格的 API,并支持异步操作和并发处理。
Crow:Crow 是一个轻量级的 C++ 微型网络框架,用于构建 RESTful 风格的 Web 服务。它简单易用,适合快速开发小型的 Web 应用。
Beast:Beast 是 Boost 库的一部分,提供了现代 C++ 风格的 HTTP 和 WebSocket 功能。它设计简单,易于集成,并且具有高性能和可扩展性。
H2 数据库基础教程之一
Java 多线程编程之九 ThreadLocal 使用
大纲
- Java 多线程编程之一 Java 内存模型浅析
- Java 多线程编程之二 synchronize 锁对象竞争
- Java 多线程编程之三 volatile 与 JMM 内存模型
- Java 多线程编程之四 CAS、ABA 问题、锁
- Java 多线程编程之五 AQS 底层源码深度剖析
- Java 多线程编程之六集合类的线程安全问题
- Java 多线程编程之七队列、线程池、线程通信
- Java 多线程编程之八 Fork/Join 框架使用
- Java 多线程编程之九 ThreadLocal 使用
ThreadLocal 的介绍
- (1) 在 Java 中,ThreadLocal 是为每个线程独立存储变量的机制。它使得每个线程都能拥有一个独立于其他线程的变量副本,这样可以避免线程间的变量共享,从而保证线程安全。ThreadLocal 实例通常是类中的私有静态字段(属性),使用它的目的是希望将状态(例如,用户 ID 或者事务 ID)与线程关联起来。
- (2) ThreadLocal 实现了每一个线程都有自己专属的本地变量副本,主要解决了让每个线程都可以绑定自己的变量值。通过调用 ThreadLocal 的
get()
和set()
方法,获取默认值或将其值更改为当前线程所存的副本的值,从而避免了线程安全问题。如果不使用 ThreadLocal 或者其他手段(比如加锁)来控制共享变量的并发修改,那么就会出现线程安全问题,其根本原因在于 Java 内存模型(JMM) 的结构。