Rust变量与数据类型
Rust 是一种静态类型的语言。 Rust 中的每个值都是某种数据类型。 编译器可以根据分配给它的值自动推断变量的数据类型。
let
使用let关键字声明变量
1 | fn main() { |
- Console
1 | Rust基础语法! |
Rust 是一种静态类型的语言。 Rust 中的每个值都是某种数据类型。 编译器可以根据分配给它的值自动推断变量的数据类型。
使用let关键字声明变量
1 | fn main() { |
1 | Rust基础语法! |
学习下Rust
在知乎上看到一个人对Rust的评论。
首先,Rust 是有点反人类,否则不会一直都不火。然后,Rust 之所以反人类,是因为人类这玩意既愚蠢,又自大,破事还贼多。 你看 C++ 就很相信人类,它要求人类自己把自己 new 出来的东西给 delete 掉。 C++:“这点小事我相信你可以的!” 人类:“没问题!包在我身上!” 然后呢,内存泄漏、double free、野指针满世界飘…… C++:“……”
Java 选择不相信人类,但替人类把事办好。 Java:“别动,让我来,我有gc!” 人类:“你怎么做事这么慢呀?你怎么还 stop the world 了呀?你是不是不爱我了呀?” Java:“……”
Rust 发现唯一的办法就是既不相信人类,也不惯着人类。 Rust:“按老子说的做,不做就不编译!” 人类:“你反人类!” Rust:“滚!”
权限管理是一个几乎所有大中型 B 端系统都会涉及的重要组成部分,其目的是对整个系统进行权限控制,避免造成误操作及数据泄露等风险问题。
权限相关的基本概念:
抽象来看权限体系可以分为如下两类:功能权限 与 数据权限 两部分。
jvm调优是日常工作中经常会使用的技巧,整理下。
为什么要调优,当默认配置参数不能很好的发挥程序性能的时候。
调优的最终目的都是为了令应用程序使用最小的硬件消耗来承载更大的吞吐。jvm调优主要是针对垃圾收集器的收集性能优化,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量。
- 延迟:GC低停顿和GC低频率。
- 低内存占用。
- 高吞吐量。
- 堆内存 = Old + Eden + S0 + S1
- 年轻的 = Eden(新生代) + S0 + S1
- 标准参数(-),所有JVM都必须支持这些参数的功能,而且向后兼容
- 非标准参数(-X),默认JVM实现这些参数的功能,但是并不保证所有JVM实现都满足,且不保证向后兼容。
- 非稳定参数(-XX),此类参数各个JVM实现会有所不同,将来可能会不被支持,需要慎重使用。
1 | -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC |
1 | -XX:MetaspaceSize=128m (元空间默认大小) |
1 | java -XX:+PrintFlagsFinal -XX:+UnlockDiagnosticVMOptions -version | wc -l |
建议 -Xms = 最大内存 * [0.6. ~0.8] 这里需要考虑系统损耗内存、和实际物理内存。
堆内存与堆外内存
必须是1024的倍数,且不能低于2M。
32位机器,最大1G/4G 64位机器最大可以超过 32G/64G
堆外内存一般指 Direct Memory ,不受GC控制,JVM、Netty都可能使用堆外内存。
1 | -XX:MaxDirectMemorySize 限制 |
首先我们需要理解java是如何运行的,为什么需要java虚拟机?
我们常用方式一般是安装java运行环境(jre)用命令行的方式启动或者直接双击jar运行。jre包含的java运行的必要环境。
Java 作为一门高级程序语言,它的语法非常复杂,抽象程度也很高。编译出来的也不是机器可以直接直接运行代码。所以使用面向Java语言的虚拟机运行Java编译以后的特定代码。这里的特定代码指的是Java字节指令码。
1 | -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:/log/heap.log |
开发过程中经常会出现批量写入数据库的操作,特别是后台系统,在导入数据的场景下会对表性能造成一定影响。
SQL插入主要使用INSERT语句,有两种常见的用法。
1 | INSERT INTO `table_data` ('field1','field2') VALUES ('data1','data2'); |
1 | INSERT INTO `table_data` ('field1','field2') VALUES ('data1','data2'),('data1','data2'); |
插入数据有两种实现,foreach、batchExecutor。
1 | <insert id="batchInsert"> |
1 | @Component |
mock
mvc-mock 测试Controller
service-mock 测试 Service
repository-mock 测试 Data
remote-mock 测试 远程接口
Spring Test & Spring Boot Test:为 Spring 和 Spring Boot 框架提供的测试工具。
1 | [INFO] +- org.springframework.boot:spring-boot-starter-test:jar:2.4.5:test |
Redis 中不能直接使用布隆过滤器,Redis 4.0 版本之后提供的 modules(扩展模块)
1 | k≈0.7*(m/n) |
演示情况直接使用docker来安装,免去下载编译过程。
1 | docker run -p 6379:6379 -d redislabs/rebloom:latest |
1 | ➜ docker-run redis-cli |
记录最近在Centos7上面部署jenkens。安装的方法有很多,下面采用最简单的方式安装。
jenkins 是一个协调者的身份,管理和协调了代码库,代码仓库,代码运行环境等。
Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。持续集成(CI)已成为当前许多软件开发团队在整个软件开发生命周期内侧重于保证代码质量的常见做法。它是一种实践,旨在缓和和稳固软件的构建过程。并且能够帮助您的开发团队应对如下挑战:
Spring 有两个web客户端的实现,一个是RestTemplate另一个是spring5的响应代替WebClient。
WebClient是一个以Reactive方式处理HTTP请求的非阻塞客户端。
RestTemplate是阻塞客户端
WebClient是异步、非阻塞的方案。
WebClient将为每个事件创建类似于“任务”的东西。在幕后,Reactive 框架会将这些“任务”排队并仅在适当的响应可用时执行它们。
WebClient是Spring WebFlux库的一部分。因此,我们还可以使用具有反应类型(Mono和Flux的功能性、流畅的 API 作为声明性组合来编写客户端代码。
底层支持的库
关于IDEA开启 Reactive Streams DEBUG