![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
文章平均质量分 82
-乌鸦
独善其身
展开
-
CAS机制原理
什么是原子操作?原子操作(atomic operation)是不需要synchronized",这是多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch [1](切换到另一个线程)。CAS(比较并交换)操作是一种原子性操作。原子性是指一个操作要么完全执行成功,要么完全不执行,没有中间状态。原创 2024-06-25 20:58:10 · 655 阅读 · 1 评论 -
Java多线程实战教学
在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在 Java 中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些「池化资源」技术产生的原因。比如大家所熟悉的数据库连接池正是遵循这一思想而产生的!原创 2022-11-09 23:54:19 · 578 阅读 · 0 评论 -
统一捕获异常的熔错
【代码】统一捕获异常的熔错。原创 2022-10-11 10:52:52 · 74 阅读 · 0 评论 -
参与感极强-SpringBoot自定义starter与健康监控
当导入redis坐标时,SpringBoot自动创建Jedis的Bean。创建RedisTemplateBean,并完成序列化和反序列化操作创建heima-redis-spring-boot-starter模块,添加依赖添加配置属性类添加配置类(创建JedisBean和RedisTemplateBean)并定义META-INF/spring.factories文件中,让SpringBoot自动加载目的验证自定义starter是否可以使用实现新建项目中引入依赖。............原创 2022-07-19 23:54:02 · 406 阅读 · 0 评论 -
特殊-硬钢源码-SpringBoot自动化配置源码阅读
SpringBoot自动装配源码解读原创 2022-07-17 00:36:50 · 265 阅读 · 0 评论 -
即兴MQ-Rabbit
MQ作为中大型项目中作用于异步处理,应用解耦,流量削锋和消息通讯等场景,尤其重要,今天就即兴选择RabbitMQ来吹一下怎么玩儿MQ的本质 大概地讲就是(一发一存一消费),在直白点就是一个(转发器)如今我们最常用的消息队列产品(RocketMQ,Kafka等等),你会发现:它们都在最原始的消息模型上做了扩展,同时提出了一些新名词,比如:主题(topic),分区(partition),队列(queue)等等最初的消息队列就是上一节讲的原始模型,它是一个严格意义上的队列(Queue)。消息按照什么顺序写进去,就原创 2022-07-02 23:31:26 · 225 阅读 · 0 评论 -
MyBatis-PLUS使用教程
这是一篇mybatis-plus的使用记录博客,源码等分析就不做了,帮助学习mybatis-plus的人懂得使用技巧MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。官网:https://baomidou.com无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向原创 2022-07-01 23:59:34 · 999 阅读 · 1 评论 -
随手笔记-Jackson -> @JsonFormat -> 失真问题解决
关于使用雪花算法作为主键id生成, 19位数return给前端出现数据失真, 导致id与数据库中不对应, 极有可能出现缓存穿透问题更多可参考github项目官网解决问题, 也可直接传送到Jackson文档浏览器开发者模式看到的接口返回数据, 此ID为失真状态的valuepostman中测试的接口真实ID为正确的value数据库中对比下来使用了@JsonFormat注解解决失真问题官方文档这样对此做出解释JsonFormat: 具有每种类型行为的一般注释;例如,可用于指定序列化日期/时间值时原创 2022-07-01 16:13:17 · 362 阅读 · 0 评论 -
学习log-Calendar and LocalDate类的应用
工作中安排到某个量化统计的功能实现,发现对Calendar and LocalDate的使用并不太熟练,借此不加班的机会对自己进行一次学习记录我的方法:观全景,再拆分,然后再copy案例就两个构造器简单翻译一下一共三个getInstance方法,入参不同为重载(Overloading),实际为两个参数反复使用默认应对不同场景全景就这些了,这就是我看到的全景获取日历信息设置未来时间日历对象获取当前的日期对象拿到当前日历对象的毫秒值LocalDateLocalDate介绍在Ja原创 2022-06-24 00:30:43 · 135 阅读 · 0 评论 -
轻度学习log-kafka的搭建与使用
官网介绍:Kafka是由LinkedIn开发的一个分布式基于发布/订阅的消息系统,使用Scala编写,它以可水平扩展和高吞吐率而被广泛使用。Kafka是一个消息系统,用作LinkedIn的活动流(Activity Stream)和运营数据处理管道(Pipeline)的基础。活动流数据是几乎所有站点在对其网站使用情况做报表时都要用到的数据中最常规的部分。活动数据包括页面访问量(Page View)、被查看内容方面的信息以及搜索情况等内容。这种数据通常的处理方式是先把各种活动以日志的形式写入某种文件,然后周期性原创 2022-06-09 22:11:23 · 257 阅读 · 0 评论 -
深度学习log-链路追踪-Spring Cloud Sleuth and ZipKin
学习log,公司需要做标品,参考当前链路追踪框架以便于降低运维成本,提高标品逼格,原文连接:传送🚪在大型系统的微服务化构建中,一个系统会被拆分成许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能部署在了几千台服务器,横跨多个不同的数据中心,也就意味着这种架构形式也会存在一些问题:分布式链路追踪(Distributed Tracin.原创 2022-06-05 11:58:47 · 312 阅读 · 0 评论 -
逻辑控-追Spring循环依赖源码后梳理-附带bean生命周期说明
追源码后梳理流程Object A/Object BA成员属性离包含B,B成员属性里包含A梳理B和A在注入Spring容器中做了什么事来一张清晰的Spring创建Bean的流程图吧Bean的创建最为核心三个方法解释:读此文前应当先分清实例化和初始化的概念实例化:@xxxxxx的地址,value=null初始化:@xxxxxx的地址,value=xxx以下使用Spring Boot version2.x进行演示其中里面调用了11个方法,分别负责刷新/创建/启动等一系列操作以下为Spring B原创 2022-06-04 13:21:10 · 151 阅读 · 0 评论 -
JVM调优/排查
JVM的常用命令和可视化工具介绍与使用,线上调优方法和排查问题思路分享,解决方案分析与饭后谈资原创 2022-05-27 16:27:12 · 205 阅读 · 0 评论 -
面试题:TCP与UDP的区别
TCP与UDP的区别,以及原理原创 2022-05-13 16:48:16 · 411 阅读 · 0 评论 -
深入认识Redis
简单介绍一下 Redis 呗!简单来说 Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。另外,Redis 除了做缓存之外,也经常用来做分布式锁,甚至是消息队列。Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。分布式缓存常见的技术选型方案有哪些?分布式缓存的话,使用的比较多的主要是 Memca原创 2021-12-19 19:44:55 · 132 阅读 · 0 评论 -
Java8新特性stream流的优雅操作
TCP与UDP的区别以及三次握手和四次挥手UDP,在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。虽然UDP不提供可靠交付,但是正是因为这样,省去和很多的开销,使得它的速度比较快,比如一些对实时性要求较高的服务,就常常使用的是UDP。对应的应用层的协议主要有 DNS,TFTP,DHCP,SNMP,NFS 等。 TCP,提供面向连接的服务,在传送数据之前必须先建立连接,数据传送完成后要释放连接。因此TCP是一种可靠的的运输服务,但是正因为这样,不可避免的增加了许多的开原创 2021-12-05 22:18:00 · 199 阅读 · 0 评论 -
Java移位运算符原来这么简单
精明购回调:优惠券定义推送接口地址:/emall-miniapp/smartShopping/coupons/definition请求方式:POST请求数据类型:application/json响应数据类型:*/*接口描述:精明购回调:优惠券定义推送请求示例:{ "batchNumber": "", "couponsDescribe": "", "couponsDetailImg": "", "couponsFaceValue": 0, "couponsMasterImg": "",原创 2021-11-26 17:52:32 · 110 阅读 · 0 评论 -
Java设计模式: 桥接模式
桥梁模式(桥接模式)定义:将抽象和实现解耦,使得两者可以独立地变化。桥梁模式是为了解决类继承的缺点而设计的。一个类想拥有另一个类的方法,可以不继承,只需要铺设一个桥梁(引用)架过去就OK了。通用类图如下:角色介绍:● Abstraction——抽象化角色它的主要职责是定义出该角色的行为,同时保存一个对实现化角色的引用,该角色一般是抽象类。● Implementor——实现化角色它是接口或者抽象类,定义角色必需的行为和属性。● Refined Abstraction——修正抽象化角色转载 2021-04-22 14:34:56 · 113 阅读 · 0 评论 -
Synchronized与ReentrantLock区别
这篇文章是关于这两个同步锁的简单总结比较,关于底层源码实现原理没有过多涉及,后面会有关于这两个同步锁的底层原理篇幅去介绍。相似点:这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的(操作系统需要在用户态与内核态之间来回切换,代价很高,不过可以通过对锁优化进行改善)。功能区别:这两种方式最大区别就是对于Synchronized来说,它是java原创 2020-12-23 00:39:07 · 132 阅读 · 0 评论 -
阿拉伯数字转换成中文算法--计数单位
今天继续看《算法的乐趣》,学习了阿拉伯数字与中文数字的转化。汉字用零一二三四五六七八九作为基本计数,与阿拉伯数字靠数字偏移位置的权位不一样,中文数字是才有“数字+权位”的方式组成数字,比如百,千,万。中文数字每个数字后都会跟上一个权位,权位就是数字的量值,相当于阿拉伯数字的数位。中文计数以万为小节,万以下没有节权,万之上是亿为节权。中文还有一个特点是多变的“零”,大概总结为三个规则:1.以10000为小节,小节的结尾即使是0,也不使用“零”。2.小节内两个非0数字之间要使用“零”。3.当小节的原创 2020-12-23 00:21:51 · 1749 阅读 · 1 评论 -
SpringCloud和SpringCloudAlibaba的区别
SpringCloudAlibaba实际上对我们的SpringCloud2.x和1.x实现拓展组件功能.1.nacos 分布式配置中心+分布式注册中心=Eureka+config2.目的是为了推广阿里的产品,如果使用了SpringCloudAlibaba,最好使用alibaba整个体系产品觉得有收获的,可以来一波赞赏!**......原创 2020-12-18 13:07:49 · 553 阅读 · 0 评论 -
Spring事务@Transaction的传播方式与隔离级别
1. 首先,说说什么事务(Transaction)事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。1事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。2如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。原创 2020-12-16 14:08:52 · 1426 阅读 · 1 评论 -
常用的JAVA线程池
1、newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。这种类型的线程池特点是:工作线程的创建数量几乎没有限制(其实也有限制的,数目为Interger. MAX_VALUE), 这样可灵活的往线程池中添加线程。如果长时间没有往线程池中提交任务,即如果工作线程空闲了指定的时间(默认为1分钟),则该工作线程将自动终止。终止后,如果你又提交了新的任务,则线程池重新创建一个工作线程。在使用CachedThreadPool时,一原创 2020-12-07 22:20:18 · 59 阅读 · 0 评论 -
Redis Sentinel原理理解
1.概述Redis Sentinel是一个分布式系统,为Redis提供高可用性解决方案。可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来 接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故 障迁移, 以及选择哪个从服务器作为新的主服务器。Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance) 该系统执行以下三个任务:监控(Mo原创 2020-12-07 19:45:14 · 485 阅读 · 0 评论 -
深入理解ReentrantLock
在Java中通常实现锁有两种方式,一种是synchronized关键字,另一种是Lock。二者其实并没有什么必然联系,但是各有各的特点,在使用中可以进行取舍的使用。首先我们先对比下两者。实现:#####首先最大的不同:synchronized是基于JVM层面实现的,而Lock是基于JDK层面实现的。曾经反复的找过synchronized的实现,可惜最终无果。但Lock却是基于JDK实现的,我们可以通过阅读JDK的源码来理解Lock的实现。使用:#####对于使用者的直观体验上Lock是比较复杂的,需原创 2020-11-30 23:54:01 · 137 阅读 · 0 评论 -
对于synchronized的运行顺序理解
一、synchronized同步关键字,分为同步代码块和同步函数二、对synchronized的理解(未加static关键字)(以下所说:对同步方法和同步代码块均适用)对象的创建是以类为模板的1、两个并发的线程访问同一个类Object中的synchronized(this)同步代码块或者同步方法时,同一时间只能执行一个,另一个必须要等待当前线程执行完才能执行(同一个对象:见下面的testSynchronized,分为两个线程,两个线程访问的是一个方法)(一个对象两个线程一个方法)例子:publi原创 2020-11-30 23:32:13 · 984 阅读 · 0 评论 -
百万级数据库优化方案大全
网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的话推荐给更多的人,让更多的人看到、纠正以及补充。搬运地址一、百万级数据库优化方案1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:原创 2020-11-28 20:22:01 · 3874 阅读 · 0 评论 -
Redis宕机后如何实现快速恢复?
这篇文章,我们来看Redis是如何实现故障自动恢复的,它的实现正是要基于之前所讲的数据持久化和数据多副本而做的。Redis作为非常火热的内存数据库,其除了具有非常高的性能之外,还需要保证高可用,在故障发生时,尽可能地降低故障带来的影响,Redis也提供了完善的故障恢复机制:哨兵。下面就来具体来看看Redis的故障恢复是如何做的,以及其中的原理。部署模式Redis在部署时,可以采用多种方式部署,每种部署方式对应不同的可用级别。单节点部署:只有一个节点提供服务,读写均在此节点,此节点宕机则数据全部丢失原创 2020-11-27 23:03:13 · 3055 阅读 · 0 评论 -
使用RedisTemplate操作Redis数据库
一.什么是RedisRedis是一个非关系型数据库,具有很高的存取性能,一般用作缓存数据库,减少正常存储数据库的压力。Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串)、List(列表)、Set(集合)、Hash(散列)和 Zset(有序集合)。下面来对这5种数据结构类型作简单的介绍:二.RedisTemplate及其相关方法1.RedisTemplateSpring封装了RedisTemplate对象来进行对Redis的各种操作,它支持所有的原创 2020-11-27 22:32:52 · 2699 阅读 · 0 评论 -
深入Redis的RDB和AOF两种持久化方式以及AOF重写机制的分析
缓存服务器有一个很重要的指标就是能否持久化,如果缓存服务器不支持持久化的话,一些相对重要的数据都不能存在缓存服务器中了,毕竟谁也不能保证服务百分百可用,一旦缓存服务器宕机,所有数据就都丢失了。今天来分享一下Redis的持久化两种持久化方式RDB和AOF。1、RDBRDB(redis database),可以理解为快照/内存快照,RDB持久化过程是将当前进程中的数据生成快照存储到硬盘中。1.1、触发机制RDB持久化的触发机制分为两种,手动触发和自动触发。手动触发执行save和bgsave两个命令原创 2020-10-23 00:59:12 · 751 阅读 · 0 评论 -
Redis缓存穿透、缓存雪崩和缓存击穿——实例
转自:https://baijiahao.baidu.com/s?id=1619572269435584821&wfr=spider&for=pcRedis缓存的使用,极大的提升了应用程序的性能和效率,特别是数据查询方面。但同时,它也带来了一些问题。其中,最要害的问题,就是数据的一致性问题,从严格意义上讲,这个问题无解。如果对数据的一致性要求很高,那么就不能使用缓存。另外的一些典型问题就是,缓存穿透、缓存雪崩和缓存击穿。目前,业界也都有比较流行的解决方案。本篇文章,并不是要更加完美的.原创 2020-10-22 23:57:05 · 797 阅读 · 0 评论 -
多数据源配置config
package com.xxx.purchase.api.config;import com.alibaba.druid.pool.DruidDataSource;import com.baomidou.mybatisplus.autoconfigure.SpringBootVFS;import com.baomidou.mybatisplus.core.MybatisConfiguration;import com.baomidou.mybatisplus.core.MybatisXMLLang原创 2020-10-16 14:59:30 · 462 阅读 · 0 评论 -
redis配置文件RedisCacheConfig
RedisCacheConfig.java用于管理redis远程缓存import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.Object原创 2020-09-22 15:56:02 · 888 阅读 · 0 评论 -
数据库事务基本概论与分布式事务概论
什么是事务?事务由一组操作构成,我们希望这组操作能够全部正确执行,如果这一组操作中的任意一个步骤发生错误,那么就需要回滚之前已经完成的操作。也就是同一个事务中的所有操作,要么全都正确执行,要么全都不要执行。事务的四大特性 ACID说到事务,就不得不提一下事务著名的四大特性。原子性原子性要求,事务是一个不可分割的执行单元,事务中的所有操作要么全都执行,要么全都不执行。一致性一致性要求,事务在开始前和结束后,数据库的完整性约束没有被破坏。隔离性事务的执行是相互独立的,它们不会相互干扰,一个事务原创 2020-08-16 14:39:56 · 267 阅读 · 0 评论 -
MySQL索引——分类、何时使用、何时不使用、何时失效
1、分类MySQL索引分为普通索引、唯一索引、主键索引、组合索引、全文索引。索引不会包含有null值的列,索引项可以为null(唯一索引、组合索引等),但是只要列中有null值就不会被包含在索引中。(1)普通索引:create index index_name on table(column);或者创建表时指定,create table(..., index index_name column);(2)唯一索引:类似普通索引,索引列的值必须唯一(可以为空,这点和主键索引不同)create原创 2020-08-15 22:55:31 · 446 阅读 · 1 评论 -
Java类加载器简介
一、类加载器的基本概念顾名思义,类加载器(class loader)用来加载 Java 类到 Java 虚拟机中。一般来说,Java 虚拟机使用 Java 类的方式如下:Java 源程序(.java 文件)在经过 Java 编译器编译之后就被转换成 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码,并转换成 java.lang.Class类的一个实例。每个这样的实例用来表示一个 Java 类。通过此实例的 newInstance()方法就可以创建出该类的一个对象。实际的情况可原创 2020-08-14 00:40:48 · 558 阅读 · 0 评论 -
Java类加载机制(1.Java类加载器)
摘要:每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这个异常背后涉及到的是Java技术体系中的类加载机制。本文简述了JVM三种预定义类加载器,即启动类加载器、扩展类加载器和系统类加载器,并介绍和分析它们之间的关系和类加载所采用的双亲委派机制,给出并分析了与Java类加载原理相关的若干问题。版权声明:本文作者:书呆子Rico作者博客地址:http://blog.csdn.net/justloveyou_/一、引子每个开发人员对java.lang原创 2020-08-13 23:39:53 · 175 阅读 · 0 评论 -
spring中@Bean与@Component的区别
@Bean 和 @Component的区别前言 最近研究Springboot 源码的时候发现这两个注解比较常出现,但是放眼看去这两个注解好像功能都差不多,所以专门研究了一下:注解作用@Component注解表明一个类会作为组件类,并告知Spring要为这个类创建bean。@Bean注解告诉Spring这个方法将会返回一个对象,这个对象要注册为Spring应用上下文中的bean。通常方法体中包含了最终产生bean实例的逻辑。两者对比相同点:两者的结果都是为spring容器注册Bean.不同点原创 2020-08-11 00:58:33 · 654 阅读 · 0 评论 -
Java线程的五种状态与基础API(2)
线程的五大状态及其转换线程的五大状态分别为:创建状态(New)、就绪状态(Runnable)、运行状态(Running)、阻塞状态(Blocked)、死亡状态(Dead)。下面画出线程五大状态之间的关系图:(1)新建状态:即单纯地创建一个线程,创建线程有三种方式,在我的博客:线程的创建,可以自行查看!(2)就绪状态:在创建了线程之后,调用Thread类的start()方法来启动一个线程,即表示线程进入就绪状态!(3)运行状态:当线程获得CPU时间,线程才从就绪状态进入到运行状态!(4)阻塞状.原创 2020-08-01 15:43:35 · 147 阅读 · 0 评论 -
Java线程的五种状态与基础API
关于java多线程的概念以及基本用法:java多线程基础1,停止线程停止线程意味着在线程执行完之前停止正在做的操作,即立刻放弃当前的操作,这并不容易。停止线程可以用Thread.stop()方法,但是这个方法不安全,所以不建议使用,还有一个方法就是Thread.interrupt()方法,但是这个方法不会终止一个正在运行的线程,需要添加一个判断才可以完成线程的停止1.1,停不下来的线程public void interrupt()将调用者线程的中断状态设为trueThread.interrupt原创 2020-08-01 15:40:25 · 163 阅读 · 0 评论