在网上一直流传着一个争论不休的话题:金额到底是用Long还是用BigDecimal?这个话题一出在哪都会引起异常无比激烈的讨论。。。。比如说这个观点:算钱用BigDecimal是常识 有支持用Long的,将金额的单位设计为分,然后乘以100,使用Long进行存储以及计算,这样不用担心小数点问题。并且一些银行系统就会选择用Long还有,最最最牛逼的万能大法:用String 成年人不做选择题,Long跟BigDecimal都用。。。还有一种就是封装一个金额的基类,对金额进行统一处理。 排除float和double 当然,对于金额,首先我们要排除的就是float和double。它们不适合用于精确的...

  J6X4jGS7eKRb   13天前   16   0   0 Java

引言 Redis作为一款高效的内存数据存储系统,凭借其优异的读写性能和丰富的数据结构支持,被广泛应用于缓存层以提升整个系统的响应速度和吞吐量。尤其是在与关系型数据库(如MySQL、PostgreSQL等)结合使用时,通过将热点数据存储在Redis中,可以在很大程度上缓解数据库的压力,提高整体系统的性能表现。 然而,在这种架构中,一个不容忽视的问题就是如何确保Redis缓存与数据库之间的双写一致性。所谓双写一致性,是指当数据在数据库中发生变更时,能够及时且准确地反映在Redis缓存中,反之亦然,以避免出现因缓存与数据库数据不一致导致的业务逻辑错误或用户体验下降。尤其在高并发场景下,由于网络延迟、...

  J6X4jGS7eKRb   15天前   26   0   0 Java

引言 在当今互联网领域,尤其在大型电商平台如淘宝这样的复杂分布式系统中,数据的高效管理和快速访问至关重要。面对数以千万计的商品、交易记录以及其他各类业务数据,如何在MySQL等传统关系型数据库之外,借助内存数据库Redis的力量,对部分高频访问数据进行高效的缓存处理,是提升整个系统性能的关键一环。 比如淘宝,京东,拼多多等电商系统每日处理的订单量级庞大,其数据库中存储的商品、用户信息及相关交易数据可达数千万条。为了降低数据库查询的压力,加速数据读取,Redis常被用于搭建二级缓存系统,以容纳部分最为活跃的“热点数据”。然而,在资源有限的情况下,如何确保仅有的20万条缓存数据精准匹配到系统中的热...

  J6X4jGS7eKRb   16天前   15   0   0 NoSQL

引言 SpringBoot提供了许多便捷的功能和特性,使得开发者可以更加轻松地构建强大、高效的应用程序。然而,在应用程序启动时执行一些初始化操作是至关重要的,它可以确保应用程序在启动后处于预期的状态,从而提供更好的用户体验和稳定性。 在应用程序启动时执行初始化操作有许多好处。首先,它可以确保应用程序在启动后的初始状态是正确的,避免了在应用程序运行时出现意外情况。其次,它可以在应用程序准备好接受请求之前完成一些必要的设置,例如加载配置、建立数据库连接、缓存预热等。总的来说,执行初始化操作可以确保应用程序以正确的方式启动,并为后续操作提供一个稳定的基础。 监听ApplicationContext...

  J6X4jGS7eKRb   20天前   18   0   0 Java

引言 在现代软件开发领域,多线程并发编程已经成为提高系统性能、提升用户体验的重要手段。然而,多线程环境下的数据同步与资源共享问题也随之而来,处理不当可能导致数据不一致、死锁等各种并发问题。为此,Java语言提供了一种内置的同步机制——synchronized关键字,它能够有效地解决并发控制的问题,确保共享资源在同一时间只能由一个线程访问,从而维护程序的正确性与一致性。 synchronized作为Java并发编程的基础构建块,其简洁易用的语法形式背后蕴含着复杂的底层实现原理和技术细节。深入理解synchronized的运行机制,不仅有助于我们更好地利用这一特性编写出高效且安全的并发程序,同时也...

  J6X4jGS7eKRb   23天前   32   0   0 Java

引言 在传统的Java应用程序开发和部署场景中,开发者往往需要经历一系列复杂的步骤才能将应用成功部署到生产环境。例如,对于基于Servlet规范的JavaWeb应用,开发完成后通常会被打包成WAR格式,然后部署到像ApacheTomcat、Jetty这样的Web容器中。这一过程中,不仅要管理应用本身的编译产物,还需要处理各种第三方依赖库的版本和加载顺序,同时在服务器端进行相应的配置以确保应用正常运行。 随着SpringBoot产生,它以其开箱即用、约定优于配置的理念彻底改变了Java应用的开发体验。其中一个标志性特征便是SpringBoot应用可以被打包成一个可直接运行的jar文件,无需外部容...

  J6X4jGS7eKRb   27天前   34   0   0 Java

在Java8及更高版本中,Lambda表达式的引入极大地提升了编程的简洁性和效率。本文将围绕十个关键场景,展示Lambda如何助力提升开发效率,让代码更加精炼且易于理解。 集合遍历 传统的for-each循环对集合进行遍历虽然直观,但在处理大量数据时显得冗长。例如: List<String>list=Arrays.asList("a","b","c"); for(Strings:list){ System.out.println(s); } 使用Lambda表达式后,代码变得更加紧凑: list.forEach(System.out::println); 集合排序 在以前我们对...

  J6X4jGS7eKRb   28天前   29   0   0 Java

引言 Redis,作为一种开源的、基于内存且支持持久化的键值存储系统,以其卓越的性能、丰富灵活的数据结构和高度可扩展性在全球范围内广受欢迎。Redis不仅提供了一种简单直观的方式来存储和检索数据,更因其支持数据结构如字符串、哈希、列表、集合、有序集合等多种类型,使得其在众多场景下表现出强大的适用性和灵活性。 Redis的核心特点包括: 高性能:基于内存操作,读写速度极快,特别适用于对性能要求高的实时应用。 关于Redis高性能的原因,请参考:京东二面:Redis为什么快?我说Redis是纯内存操作的,然后他对我笑了笑。。。。。。 数据持久化:支持RDB和AOF两种持久化方式,确保即使...

  J6X4jGS7eKRb   2024年03月30日   32   0   0 Java

引言 Redis是一个高性能的开源内存数据库,以其快速的读写速度和丰富的数据结构支持而闻名。作为一个轻量级、灵活的键值存储系统,Redis在各种应用场景下都展现出了惊人的性能优势。无论是作为缓存工具、会话管理组件、消息传递媒介,还是在实时数据处理任务和复杂的分布式系统架构中,Redis均扮演了至关重要的角色。而Redis为什么快的原因也是我们尝尝遇见的高频面试问题。接下来我们就一起探讨一下Redis快的原因。 本文将深入探讨Redis之所以快速处理大规模数据的原因。我们将从Redis基于内存操作的特性、高效的内存数据结构、单线程模型、I/O多路复用技术、底层模型和优化技术、持久化机制以及网络通...

  J6X4jGS7eKRb   2024年03月27日   22   0   0 Java

引言 在多线程并发编程场景中,锁作为一种至关重要的同步工具,承担着协调多个线程对共享资源访问秩序的任务。其核心作用在于确保在特定时间段内,仅有一个线程能够对资源进行访问或修改操作,从而有效地保护数据的完整性和一致性。锁作为一种底层的安全构件,有力地防止了竞态条件和数据不一致性的问题,尤其在涉及多线程或多进程共享数据的复杂场景中显得尤为关键。 而了解锁的分类,能帮助我们何种业务场景下使用选择哪种锁。 基于锁的获取与释放方式分类 计划于所得获取与释放方式进行分类,Java中的锁可以分为:显式锁和隐式锁。 隐式锁 Java中的隐式锁(也称为内置锁或自动锁)是通过使用synchronized关键字实...

  J6X4jGS7eKRb   2024年03月25日   60   0   0 Java

引言 ThreadLocal在Java多线程编程中扮演着重要的角色,它提供了一种线程局部存储机制,允许每个线程拥有独立的变量副本,从而有效地避免了线程间的数据共享冲突。ThreadLocal的主要用途在于,当需要为每个线程维护一个独立的上下文变量时,比如每个线程的事务ID、用户登录信息、数据库连接等,可以减少对同步机制如synchronized关键字或Lock类的依赖,提高系统的执行效率和简化代码逻辑。 但是我们在使用ThreadLocal时,经常因为使用不当导致内存泄漏。此时就需要我们去探究一下ThreadLocal在哪些场景下会出现内存泄露?哪些场景下不会出现内存泄露?出现内存泄露的根本原...

  J6X4jGS7eKRb   2024年03月24日   43   0   0 Java

引言 在JDK1.2之前Java并没有提供软引用、弱引用和虚引用这些高级的引用类型。而是提供了一种基本的引用类型,称为Reference。并且当时Java中的对象只有两种状态:被引用和未被引用。当一个对象被引用时,它将一直存在于内存中,直到它不再被任何引用指向时,才会被垃圾回收器回收。而被引用也就是强引用。 而在JDK1.2之后对引用的概念进行了扩充,分为了强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference),这4种引用的强度依次减弱。他们的关系如下如: 强引用 强引用是Java中最常见...

  J6X4jGS7eKRb   2024年03月22日   42   0   0 Java

就在3月19日,Java22重磅发布。Java22新增了12项增强功能,其中包括七个预览特性和一个孵化器特性,这些功能都显著到足以引起JDK增强提案(JEPs)的关注。它们涵盖了Java语言、其API、性能以及JDK中包含的工具的改进。 真的卷不动了,,前段时间才将项目升级到Java17。。。。 接下来我们看看具体的新特性介绍。。。 Java语言上的改进 UnnamedVariables&PatternsJEP456 匿名变量和模式。当需要但未使用变量声明或嵌套模式时,提高了可读性。这两者都用下划线字符表示。 优化: 捕获开发人员意图,即给定的绑定或Lambda参数未使用,并强制执...

  J6X4jGS7eKRb   2024年03月21日   26   0   0 Java

引言 在现代分布式系统中,消息顺序消费扮演着至关重要的角色。特别是在涉及事务处理、日志追踪、状态机更新等场景时,消息的处理顺序直接影响着系统的正确性和一致性。例如,金融交易系统中,账户间的转账操作必须严格按照发出请求的顺序进行处理,否则可能导致资金不匹配;同样,在构建实时流处理系统时,事件的时间戳顺序可能关系到最终结果的准确性。 然而,在分布式环境中,保证消息顺序消费并非易事。消息队列中的消息可能会因为网络延迟、系统故障、并发处理等多种因素导致乱序。此外,随着系统规模的增长,如何在保证消息顺序的同时,有效提升消息处理的吞吐量和响应时间,成为了一个颇具挑战性的课题。 ApacheKafka作为一...

  J6X4jGS7eKRb   2024年03月20日   55   0   0 Java

什么是接口幂等性接口幂等性这一概念源于数学,原意是指一个操作如果连续执行多次所产生的结果与仅执行一次的效果相同,那么我们就称这个操作是幂等的。在互联网领域,特别是在Web服务、API设计和分布式系统中,接口幂等性具有非常重要的意义。 具体到HTTP接口或者服务间的API调用,接口幂等性就可以理解为当客户端对同一接口发起多次相同的请求时,服务端系统也应该确保只执行一次相应的操作,并且不论接收到了多少次请求,系统的状态变更始终是一致的,不会因为重复的请求而导致数据的错误。 比如我们常常遇到的订单创建,支付等业务。 如果一个“创建订单”接口实现了幂等性,当收到两次同样的创建请求时,系统应该要么拒绝第...

  J6X4jGS7eKRb   2024年03月19日   18   0   0 Java

引言 在过去的Java版本中,日期和时间的处理主要依赖于java.util.Date和java.util.Calendar类,然而随着业务系统的复杂以及技术层面的提升,这些传统的日期时间类暴露出了若干显著的不足之处。随着Java8的发布,其引入了一套全新的日期时间API,彻底改变了我们处理日期和时间的方式。 传统的日期时间类 相比较Java8中新引入的java.time包下的时间处理类,传统的日期时间处理类在易用性,线程安全,不支持市时区等缺点。 设计复杂性:Date类的设计较为简单,但它实际上混合了日期和时间信息,并且没有提供直观的方法来单独操作日期或时间部分。Calendar类虽然提供...

  J6X4jGS7eKRb   2024年03月18日   30   0   0 Java

引言 在Java多线程编程中,正确且安全地停止线程是一项关键技能。简单粗暴地“杀死”线程不仅可能导致数据不一致性,还可能引发各种难以预测的错误。本文将探讨几种在Java中优雅地停止线程的方法,以确保程序的健壮性和可靠性。 使用标志位(共享变量)停止线程 一种常见的做法是使用一个boolean类型的标志位来控制线程的执行。线程在执行任务的过程中不断检查标志位的状态,当标志位被设置为true时,线程停止执行任务,从而退出线程。 classStoppableThreadextendsThread{ privatevolatilebooleanisStopped=true; @Override pu...

  J6X4jGS7eKRb   2024年03月14日   38   0   0 Java

在面试过程中,死锁是必问的知识点,当然死锁也是我们日常开发中也会遇到的一个问题,同时一些业务场景例如库存扣减,银行转账等都需要去考虑如何避免死锁,一旦线上发生了死锁,那可能年终不保。。。。。下面我们就来聊一聊死锁如何定位,以及如何避免。 什么是死锁 死锁(Deadlock)是指在操作系统里,两个或多个并发线程在执行过程中,因争夺资源而造成的一种互相等待的现象,且无外力干预的情况下,这些线程都无法进一步执行下去。每个线程至少持有一个资源并等待其他线程所持有的资源才能继续执行,从而形成了一个循环等待链,导致所有线程都被阻塞,无法顺利完成。 假设有两个仓库A和B,它们之间在进行商品调拨。线程T1负责...

  J6X4jGS7eKRb   2024年03月13日   26   0   0 Java

引言 在复杂的应用程序设计中,尤其是那些涉及多个状态变迁和业务流程控制的场景,有限状态机(FiniteStateMachine,FSM)是一种强大而有效的建模工具。Spring框架为此提供了Spring状态机(SpringStateMachine)这一组件,它允许开发者以一种声明式且结构清晰的方式来管理和控制对象的状态流转。 提起Spring状态机,可能有些小伙伴还比较陌生。当你听到状态机时,一定会联想到状态设计模式。确实,状态机是状态模式的一种实际运用,在工作流引擎、订单系统等领域有大量的应用。在介绍状态机之前,我们先来回顾一下状态模式,以便更好地理解Spring状态机的概念和应用。 状态模...

  J6X4jGS7eKRb   2024年03月12日   52   0   0 Java

引言 在日常业务开发中,异步编程已成为应对并发挑战和提升应用程序性能的关键策略。传统的同步编程方式,由于会阻碍主线程执行后续任务直至程序代码执行结束,不可避免地降低了程序整体效率与响应速度。因此,为克服这一瓶颈,开发者广泛采用异步编程技术,将那些可能阻塞的长时间运行任务委派至后台线程处理,从而确保主线程始终保持高效和灵敏的响应能力。 而SpringBoot作为一款广受欢迎的应用开发框架,极大地简化了异步编程实践。其中,@Async注解是SpringBoot为实现异步编程提供的便捷工具之一。通过巧妙地应用@Async注解,开发者能够无缝地将方法调用转化为异步执行模式,进而增强系统的并发性能表现。...

  J6X4jGS7eKRb   2024年03月11日   42   0   0 Java
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~