BigDecimal num1 = new BigDecimal('0.1');
BigDecimal num2 = new BigDecimal('0.2');
BigDecimal sum = num1.add(num2);
BigDecimal product = num1.multiply(num2);
mysql: innodb和myisam有什么区别?
InnoDB和Myisam是MySQL数据库中两种非常流行的存储引擎,主要存在四大区别:
事务支持能力不同:InnoDB支持ACID事务。所以可以处理高级别的数据完整性和可靠性。而MyISAM不支持事务,所以MyISAM在处理需要高度数据完整性的操作时不如InnoDB可靠。锁定机制不同:InnoDB使用行级别锁定,所以在并发读写操作时性能更好,尤其是对于在线事务处理类型的应用,比如并发量大的实时系统。而MyISAM使用表级锁定。这可能在高并发的情况下导致性能问题,因为当一条记录被修改时,整个表都会被锁定。数据完整性和恢复能力不同:InnoDB提供了外键约束来维护数据完整性,支持崩溃后的自动恢复。但是MyISAM不支持外键,并且在系统崩溃后恢复数据也更加困难。存储结构,InnoDB是把数据存储在表空间中的,所以可以更好地处理大型数据库。而MyISAM是把数据存储在独立的文件里,每个表一个文件,适合读密集型的应用。
总的来说,InnoDB是一个更优秀的存储引擎,提供了事务支持,行级锁定和数据完整性,非常适合需要高并发和高可靠性的系统。
mysql什么是索引,底层原理是什么?
索引是数据库重要的概念之一,用于快速定位和访问数据表中的数据。它类似于书籍的目录,可以加速数据的检索过程,不需要扫描整个数据表,索引基于一个或多个列构建,能提高查询数据的效率。
对于业务系统的查询效率提升有非常大的帮助:
-- customers 表的 customer_id 和 orders 表的 customer_id 都有索引
SELECT customers.customer_id, orders.order_date
FROM customers
JOIN orders ON customers.customer_id = orders.customer_id
WHERE customers.customer_id = 101;
对于业务系统的查询效率提升有非常大的帮助,复杂的查询,比如带有JOIN或WHERE子句的查询,索引可以显著提高查询速度。可以优化UPDATE和DELETE的操作。
UPDATE customers
SET address = '新地址'
WHERE customer_id = 123;
因为这些增删改操作都需要先查找目标数据再进行操作。
如何实现索引:有两种重要的实现方式。B树和B+树。B树是一个平衡的多路搜索树,它的所有叶节点都在同一层。每个节点包含多个键(key),和指向子节点的指针,B树保证了每个节点的键和子节点树,在预定范围内,B+树是B树的变种,所有的数据记录都存储在叶子节点,内部节点仅存储键值,也就是非叶子节点不存储实际数据。仅存储键值。这些键值作为分隔值,指导搜索操作向下走向正确的分支,而叶节点之间以指针相连,形成一个链表。相比于B树,B+树的查询效率更加稳定,因为所有的查询都要到达叶子节点,由于叶子节点形成链表,B+树也特别适合于顺序遍历操作。
事务的四大特性是什么
MySQL事务的四大特性指的就是:原子性,一致性,隔离性,持久性。
原子性:指的就是事务被视为不可分割的最小单元,一个事务的所有操作要么全部提交成功,要么全部失败回滚。回滚可以用回滚日志来实现,回滚日志记录着事务所执行的修改操作。
隔离性指的就是一个事务所做的修改在最终提交一起,对其它事务是不可见的。
一致性指的就是数据库的数据在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。
一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。
系统发生崩溃可以用重做日志进行恢复,从而实现持久性。与回滚日志记录数据的逻辑修改不同,重做日志记录的是数据页的物理修改。
事务的ACID特性,不是很好理解:原子性,一致性,隔离性,持久性。
只有满足一致性,事务的执行结果才是正确的。在无并发的情况下,事务串行执行,隔离性一定能够满足。此时只要能满足原子性,就一定能满足一致性。在并发的情况下,多个事务并行执行,事务不仅要满足原子性,还需要满足隔离性,才能满足一致性。事务满足持久化是为了能应对系统崩溃的情况。
什么是面向对象
面向对象是一种思想,世间万物都可以看做一个对象,Java是一个支持并发、基于类和面向对象的计算机高级编程语言。面向对象软件开发具有的优点有:1. 代码开发模块化,更易维护和修改;2. 代码复用性强;3. 增加代码的可读性。
面向对象有三大特征:封装,继承,多态。
封装就是给对象提供了隐藏内部特性和行为的能力;对象提供一些能被其他对象访问的方法,来改变它内部的数据;在Java当中有4种修饰符:default,public,private,protected。每一种修饰符给其他的位于同一个包或者不同包下面对象,赋予了不同的访问权限。
default: 同包中;public:都可以;protected:不同包,不是继承子类;private:同类中成员
继承就是给对象提供了以基类获取字段和方法的能力。继承提供了代码的重用行,也可以在不修改类的情况下给现存的类添加新特性。
多态是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态类型上的操作,可以应用到其他类型的值上面。
多态中,父类作为形参的方法和子类作为形参的方法都是一样的。形参父类类型可以接收子类对象。这是多态的特性。
DDD到底是什么
三层架构:模型,视图,控制器
业务接口层:Module API业务逻辑层:VO,Service数据访问层:PO,MapperXML,Dao
DDD四层架构:(全称:领域驱动设计,所谓的领域就是特定业务领域的问题和逻辑,驱动指的就是以业务领域的复杂性为核心进行软件设计和开发,和它对比的就是传统的MVC架构),拆分为四层就是表示层,应用层,领域层和基础设施层。
表示层负责与用户交互(处理用户请求)
// 表示层
// Web 控制器:处理HTTP请求
@RestController
public class ArticleController {
private ArticleApplicationService articleApplicationService;
@PostMapping('/articles')
public Article createArticle(@RequestBody ArticleDto articleDto) {
return articleApplicationService.createArticle(articleDto.getTitle(), articleDto.getContent());
}
}
应用层负责业务逻辑的执行,但它不包含业务规则或知识,只协调我们接下来的领域层来实现业务用例
// 领域实体:文章
public class Article {
private Long id; // 值对象
private String title;
private String content;
// 构造函数,getter和setter省略
}
// 领域服务:文章服务
public class ArticleService {
public Article createArticle(String title, String content) {
// 领域事件:创建文章的业务逻辑
return new Article(title, content);
}
}
而领域层就包含业务逻辑的核心部分,是DDD的关键所在。包括实体(Entity)、值对象(Value Object)、领域服务(Domain Service)、领域事件(Domain Event)等。这一层封装了业务逻辑,定义了业务规则和业务行为。
基础设施层:主要用来连接数据库和各种中间件
// 数据访问接口:文章仓储
public interface ArticleRepository {
Article save(Article article);
Article findById(Long id);
}
// 数据访问实现:基于某种数据库的文章仓储实现
public class SqlArticleRepository implements ArticleRepository {
// 实现数据库操作的细节
}
DDD的特点是强调业务逻辑的重要性,也就是领域层逻辑,更加专注业务,减少沟通成本
用户接口层:API,DTO应用层: Application Service领域层:MapperXM Repository Aggregate(Domain Service Entity ValueObject)基础层:Repository AOP (缓存 总线 网关 第三方工具 文件 其它)
image.png
image.png
image.png
image.png
Apache Kafka UI 是一个免费的开源 Web UI,用于监控和管理 Apache Kafka 集群,可方便地查看 Kafka Brokers、Topics、消息、Consumer 等情况,支持多集群管理、性能监控、访问控制等功能。
termQuery("cName.keyword", xxxBO.getCName()):
这是一个精确查询(Term Query),用于匹配 cName.keyword 字段与 depotInfoBO.getCName() 的值相等的文档。
matchPhraseQuery("mobile", xxxBO.getMobile()):
这是一个短语匹配查询(Match Phrase Query),用于匹配 mobile 字段包含与 xxxBO.getMobile() 相等的短语的文档。
termsQuery("xxxId.keyword", xxxBO.getDepotIds()):
这是一个多值查询(Terms Query),用于匹配 xxxId.keyword 字段包含在 xxxBO.getDepotIds() 列表中的文档。
boolQueryBuilder.must(QueryBuilders
.wildcardQuery("cName.keyword", "*" + depotInfoBO.getCName() + "*"));
Netty是一个用于构建网络应用程序的Java框架。Netty提供了一个抽象的Channel接口,它表示一个可以进行I/O操作的通道,例如网络套接字。
Netty的Channel接口是一个抽象的概念,它提供了统一的API,使得可以在不同的传输协议(如TCP、UDP等)上进行操作。在Netty中,你可以通过不同的Channel实现来处理不同类型的网络通信。
在Netty中,常见的一些Channel实现包括:
NioSocketChannel: 基于Java NIO的Socket通道。NioServerSocketChannel: 基于Java NIO的ServerSocket通道。OioSocketChannel: 基于传统的阻塞I/O的Socket通道。OioServerSocketChannel: 基于传统的阻塞I/O的ServerSocket通道。
连接鉴权
image.png
连接的客户端信息在Zookeeper创建的临时节点
image.png
自定义发送心跳包的内容.
image.png
自定义Netty的channel
image.png
客户端连接的clientId和channelId的信息在Redis存储的
image.png
image.png
image.png
客户端请求Netty服务器地址
image.png
定义的Kafka的topic
image.png
基于Netty的websocket消息推送服务器
image.png
image.png
发送心跳间隔以及服务超时剔除
image.png
消息服务系统架构图
image.png
Zookeeper注册的Netty服务器的临时节点
image.png
image.png
image.png
image.png
image.png
sender.addCallback(// 发送成功的回调
result -> log.info("Send success:offset({}),partition({}),topic({})",// 打印成功消息 发送成功:偏移量({}), 分区({}), 主题({})
result.getRecordMetadata().offset(),
result.getRecordMetadata().partition(),
result.getRecordMetadata().topic()),
ex -> log.error("Send fail:{}", ex.getMessage()));// 发送失败的回调
Pipeline 是 Netty 中用于处理和拦截事件的容器。在 Netty 中,所有的处理逻辑被组织成一个由多个 ChannelHandler 组成的 ChannelPipeline。Pipeline 是对这些 ChannelHandler 进行组织和管理的容器。
当数据通过 Channel 时,会经过 ChannelPipeline 中的一系列 ChannelHandler 处理。每个 ChannelHandler 负责处理或者传递事件,这样可以将整个处理逻辑划分为多个小的、可复用的组件。
所以,ChannelPipeline 就是一个处理数据的通道,ChannelHandler 就是处理逻辑的组件。 Netty 的事件模型基于这个概念,通过 ChannelPipeline 将处理逻辑拆分成一系列的 ChannelHandler,方便扩展和管理。
docker pull mrvautin/adminmongo
Installation
Navigate to folder & install adminMongo: git clone https://github.com/mrvautin/adminMongo.git && cd adminMongoInstall dependencies: npm installStart application: npm start or node appVisit http://127.0.0.1:1234 in your browser
Note: Node.js version 4.x or above is required
Electron App
adminMongo can also be used as a cross platform Electron application. Due to the size of Electron it will need to be built manually.
To build for Mac:
$ npm run-script packageOsx
To build for Windows:
$ npm run-script packageWin32
To build for Linux:
$ npm run-script packageLinux
Once built, the executable will be in the /releases folder.
image.png
public enum HttpStatus {
CONTINUE(100, "继续"),
SWITCHING_PROTOCOLS(101, "切换协议"),
PROCESSING(102, "处理中"),
CHECKPOINT(103, "检查点"),
OK(200, "请求成功"),
CREATED(201, "已创建"),
ACCEPTED(202, "已接受"),
NON_AUTHORITATIVE_INFORMATION(203, "非权威信息"),
NO_CONTENT(204, "无内容"),
RESET_CONTENT(205, "重置内容"),
PARTIAL_CONTENT(206, "部分内容"),
MULTI_STATUS(207, "多状态"),
ALREADY_REPORTED(208, "已报告"),
IM_USED(226, "IM Used"),
MULTIPLE_CHOICES(300, "多种选择"),
MOVED_PERMANENTLY(301, "永久移动"),
FOUND(302, "找到"),
/** @deprecated */
@Deprecated
MOVED_TEMPORARILY(302, "临时移动"),
SEE_OTHER(303, "查看其他"),
NOT_MODIFIED(304, "未修改"),
/** @deprecated */
@Deprecated
USE_PROXY(305, "使用代理"),
TEMPORARY_REDIRECT(307, "临时重定向"),
PERMANENT_REDIRECT(308, "永久重定向"),
BAD_REQUEST(400, "错误的请求"),
UNAUTHORIZED(401, "未经授权"),
PAYMENT_REQUIRED(402, "需要付款"),
FORBIDDEN(403, "禁止访问"),
NOT_FOUND(404, "未找到"),
METHOD_NOT_ALLOWED(405, "不允许使用该方法"),
NOT_ACCEPTABLE(406, "不可接受"),
PROXY_AUTHENTICATION_REQUIRED(407, "需要代理身份验证"),
REQUEST_TIMEOUT(408, "请求超时"),
CONFLICT(409, "请求冲突"),
GONE(410, "资源不可用"),
LENGTH_REQUIRED(411, "需要内容长度"),
PRECONDITION_FAILED(412, "先决条件失败"),
PAYLOAD_TOO_LARGE(413, "请求实体过大"),
/** @deprecated */
@Deprecated
REQUEST_ENTITY_TOO_LARGE(413, "请求实体过大"),
URI_TOO_LONG(414, "请求URI过长"),
/** @deprecated */
@Deprecated
REQUEST_URI_TOO_LONG(414, "请求URI过长"),
UNSUPPORTED_MEDIA_TYPE(415, "不支持的媒体类型"),
REQUESTED_RANGE_NOT_SATISFIABLE(416, "请求范围不符合要求"),
EXPECTATION_FAILED(417, "期望失败"),
I_AM_A_TEAPOT(418, "我是一个茶壶"),
/** @deprecated */
@Deprecated
INSUFFICIENT_SPACE_ON_RESOURCE(419, "资源空间不足"),
/** @deprecated */
@Deprecated
METHOD_FAILURE(420, "方法失败"),
/** @deprecated */
@Deprecated
DESTINATION_LOCKED(421, "目标被锁定"),
UNPROCESSABLE_ENTITY(422, "不可处理的实体"),
LOCKED(423, "已锁定"),
FAILED_DEPENDENCY(424, "请求的依赖关系失败"),
TOO_EARLY(425, "操作过早"),
UPGRADE_REQUIRED(426, "需要升级"),
PRECONDITION_REQUIRED(428, "要求先决条件"),
TOO_MANY_REQUESTS(429, "请求过多"),
REQUEST_HEADER_FIELDS_TOO_LARGE(431, "请求头字段太大"),
UNAVAILABLE_FOR_LEGAL_REASONS(451, "因法律原因不可用"),
INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
NOT_IMPLEMENTED(501, "未实现"),
BAD_GATEWAY(502, "网关错误"),
SERVICE_UNAVAILABLE(503, "服务不可用"),
GATEWAY_TIMEOUT(504, "网关超时"),
HTTP_VERSION_NOT_SUPPORTED(505, "HTTP版本不支持"),
VARIANT_ALSO_NEGOTIATES(506, "变体协商"),
INSUFFICIENT_STORAGE(507, "存储空间不足"),
LOOP_DETECTED(508, "检测到循环"),
BANDWIDTH_LIMIT_EXCEEDED(509, "超出
String amount = "10.50";
String amountInCents = new BigDecimal(amount)
.multiply(new BigDecimal("100"))
.toBigInteger()
.toString();
System.out.println(amountInCents); // 输出:1050
new BigDecimal(amount) // 将金额(假设为字符串格式)转换为 BigDecimal 类型
.multiply(new BigDecimal("100")) // 乘以 100,将金额转换为以分为单位的 BigDecimal 类型
.toBigInteger() // 将结果转换为 BigInteger 类型
.toString(); // 将 BigInteger 转换为字符串
Maven项目的POM文件(Project Object Model,项目对象模型)的一部分。
加群联系作者vx:xiaoda0423
仓库地址:https://github.com/webVueBlog/JavaGuideInterview
好文推荐
发表评论