自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 收藏
  • 关注

原创 ShardingSphere分库分表与读写分离实战

inline: 直接在配置文件中通过 Groovy 表达式实现分片策略,如:user_$->{u_id%8}, 只支持精确查找 ( = in),不支持范围查找standard: 标准分片策略,用户通过编写分片精确查找和范围查找算法,实现自定义的分片,可以支持精确查找和范围查找,但是分片键只能有一个,也就是只能根据一列来进行分片complex: 复合分片,和标准分片一样,但是可以支持多个列对数据进行分片hint: 强制路由策略,不再由 SQL 决定如何分片,直接由用户指定分片参数。

2023-12-10 17:34:51 348

原创 MySQL 高可用架构

MySQL 是实际生产中最常用的数据库,生产环境数据量极为庞大,对性能和安全要求很高,单机的 MySQL 是远远达不到的,所以必须搭建一个主从复制架构,同时可以基于一些工具实现高可用架构,在此基础上,基于一些中间件实现读写分离架构,如果数据量非常庞大,还要考虑分库分表。本文不讲解 MySQL 数据库的安装,和高可用架构搭建的具体细节,只为探索生产环境常用的高可用方案,和各个方案的优劣。

2023-11-27 08:30:24 292

原创 maven 常用知识速记

上例中的 JUnit 就是个很好的例子,该文件也以依赖的方式引入到测试使用的 classpath 中,不同的是这里的依赖范围是 test。例如,项目 A 有这样的依赖关系:A->B->C->X(1.0)、A->D->X(2.0),X 是 A 的传递性依赖,但是两条依赖路径上有两个版本的 X, 那么哪个 X 会被 Maven 解析使用呢?. 这种依赖意味着潜在的风险,当前项目直接在使用它们,例如有很多相关的 Java import 声明,而这种依赖是通过直接依赖传递进来的,该结果中重要的是两个部分。

2023-10-17 08:22:04 384

原创 RocketMQ基本概念和高级原理

AllocateMachineRoomeNearby: 将同机房的 Producer、 Consumer 分配到一起这个策略可以通过一个 machineRoomResolver 对象来定制 Consumer 和 Broker 的机房解析规则。然后还需要引入另外一个分配策略来对同机房的 Broker 和 Consumer 进行分配。一般也就用简单的平均分配策略或者轮询分配策略。AllocateMessageQueueAveragely:平均分配。将所有 MessageQueue 平均分给每一个消费者。

2023-08-05 17:11:33 895

原创 使用java将个人微信打造成得力助手

定义。

2023-07-30 00:13:49 337

原创 SpringBoot集成RocketMQ

SpringBoot整合RocketMQ使用非常简单,下面是一个简单的例子,作为备忘:完整项目代码: https://github.com/dccmmtop/springBootRocketMQ

2023-07-29 19:03:29 332

原创 Java 实现批量加解密工具

当我们想把某些文件上传到云上,方便备份和分享,但是还担心文件泄露,或者不想让提供云存储服务方的管理员看到,可以对文件加密再上传,就可以实现。linux 平台下有 gpg 工具可以对文件加密,但是 win 下没有找到好用的命令行下的加密工具,于是自己用java实现了一个支持批量操作的 aes 加密工具。参数,后面没有密码时,按下回车键后,会提示输入密码,并不会显示到控制台中。执行该命令后,会对当前目录下的java文件进行加密,并生成一个。: 密码,可以显示输入密码,也可隐式输入,当只有。

2023-07-19 10:14:01 363

原创 RocketMQ 的介绍和基本使用

在RabbitMQ 的基本概念和五种模式使用示例前半部分介绍了 MQ 的应用场景,以及多个 MQ 产品的对比,那时说到 RocketMQ 的客户端版本只有 Java , 现在 Apache RocketMQ 社区中也增加了 C++ NodeJS Python Go 的客户端。RocketMQ 是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016 年开源后捐赠给 Apache,现在是 Apache 的一个顶级项目。

2023-05-21 19:00:47 889

原创 小爱同学接入人工智能

最近入手了一款小爱音响,想着把小爱音响接入 chatGPT, 在 github 上找了一个非常优秀的开源项目,整个过程还是比较简单的,一次就完成了。就会调用一个部署在我本机的一个服务,来控制我的电脑,比如“电脑音量调到百分之五十”让我自己想的话,估计就是想着各种办法去破解小爱同学,但是这需要很深的硬件知识。那么频繁的调用小爱同学会话记录接口,很难长久稳定的运行,肯定会被小米封的。其中最难的技术点是 如何获取与小爱的对话记录?如何让小爱播放文本?这样小爱同学只用来语音转文本,然后播放一段声音了。

2023-05-14 20:39:37 8301 2

原创 Java中包扫描的实现

用过spring框架后知道包扫描是一个非常好用的功能,只需要在某个包下写自己的类,框架就能自动帮我们加载到容器中,从而在各处使用,今天自己来实现一下包扫描。原理其实很简单,就是找到某个目录下的所有class文件,然后使用类加载器加载到jvm中,再使用反射生成一个该类的对象即可。

2023-04-23 22:07:50 1362 1

原创 SpringBoot与RabbitMQ 集成以及死信队列,TTL,延迟队列

如果设置了手动确认方式,则需要在业务处理成功后,调用 channel.basicAck(),手动签收,如果出现异常,则调用 channel.basicNack() 方法,让其自动重新发送消息。TTL 全称是 Time To Live (存活时间), 当消息到达存活时间后还没有被消费就会自动清除,这与 redis 中的过期时间概念类似,我们应该合理应用 TTL,可以有效的处理过期的垃圾信息,从而降低服务器的负载。当数据量特别大的时候,对生产者限制肯定是不科学的,这是用户的行为,我们应该对消费端限流。

2023-04-15 15:19:56 745

原创 RabbitMQ的基本概念和五种模式使用示例

2007年,Rabbit 技术公司基于 AMQP 标准开发的 RabbitMQ 1.0 发布。RabbitMQ 采用 Erlang 语言开发。Erlang 语言由 Ericson 设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。AMQP 即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

2023-04-07 23:36:40 784

原创 Redis 内存清理策略

如果不设置最大内存,当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap),会让 Redis 的性能急剧下降。主动清理策略在 redis 4.0 之前一共实现了 6 种内存淘汰算法,4.0 之后,又增加了 2 中,共 8 种。当存在热点数据时,LRU 的效率很好,但偶发性的、周期性的批量操作会导致 LRU 命中率急剧下降,缓存污染情况比较严重。当 Redis 运行在主从模式时,只有主结点才会执行过期删除策略,然后把删除操作”del key”同步到从结点删除数据。

2023-03-30 23:43:29 949

原创 Redis缓存击穿和穿透以及雪崩

这个长度一般很大,过亿都是正常的,因为它是按位存储的,一亿的长度所占的空间也就 12M。缓存穿透指的是查询一个根本不存在的数据,缓存层和存储层都不会命中,通常处于容错的考虑,如果存储层不存在数据也不会写入缓存层。对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透可以先用布隆过滤器做一次筛选,对于不存在数据,布隆过滤器一般都能够过滤掉,不让请求再继续往后端走。如上图所示,布隆过滤器就是一个大型的位数组和几个不一样的无偏hash函数,所谓无偏,就是能够把元素的hash值计算的比较均匀。

2023-03-30 23:41:19 849

原创 redis 使用规范与性能优化

swap 对操作系统比较重要,当物理内存不足时,可以将一部分内存也 swap 到硬盘上,已解燃眉之急,对于需要高并发,高吞吐的应用来说,磁盘 IO 通常会成为系统的瓶颈,再 Linux 中,并不是等所有的物理内存使用完后才用到 swap。minIdle(最小空闲连接数),与其说是最小空闲连接数,不如说是"至少需要保持的空闲连接数",在使用连接的过程中,如果连接数超过了 minIdle,那么继续建立连接,如果超过了 maxIdle,当超过的连接执行完业务后会慢慢被移出连接池释放掉。

2023-03-30 23:40:31 312

原创 Redis 的主从和哨兵以及集群架构

哨兵架构下的 client 端第一次从哨兵中找出主节点,后续就直接访问 redis 的主节点,不会每次都通过哨兵代理访问主节点,当 redis 的主节点发生变化时,哨兵会第一时间感知到,并将新的 redis 主节点通知给客户端,这里的 redis 客户端一般都实现了订阅功能,订阅哨兵发布的节点变动信息。当主节点与从节点断开重连后,一般都会进行全量的数据复制,从 2.8 版本开始,redis 可以支持部分数据复制的命令与 master 同步,也就是断点续传。

2023-03-26 15:16:58 422

原创 Redis中渐进式遍历key

keys 算法是遍历算法,复杂度是 O(n),如果实例中有千万级以上的 key,这个指令就会导致 Redis 服务卡顿, 所有读写 Redis 的其它的指令都会被延后甚至会超时报错, 因为 Redis 是单线程程序,顺序执行所有指令,其它指令必须等到当前的 keys 指令执行完了才可以继续。当 SCAN 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代,而当 redis 服务器向用户返回值为 0 的游标时, 表示迭代已结束,这是唯一迭代结束的判定方式,而不能通过返回结果集是否为空判断迭代结束。

2023-03-26 00:15:00 551

原创 MySQL 和 Redis 的数据一致性问题

数据一致”一般指的是:缓存中有数据,缓存的数据值 = 数据库中的值。缓存中有数据,缓存的数据值 = 数据库中的值(需均为最新值,本文将“旧值的一致”归类为“不一致状态”)缓存中本没有数据,数据库中的值 = 最新值(有请求查询数据库时,会将数据写入缓存,则变为上面的“一致”状态)”数据不一致“:缓存的数据值 ≠ 数据库中的值;缓存或者数据库中存在旧值,导致其他线程读到旧数据。

2023-03-25 00:00:00 428

原创 redis基础配置和持久化

如果开启了混合持久化,AOF 在重写时,不再是单纯将内存数据转换为 RESP 命令写入 AOF 文件,而是将重写这一刻之前的内存做 RDB 快照处理,并且将 RDB 快照内容和增量的 AOF 修改内存数据的命令存在一起,都写入新的 AOF 文件,新的文件一开始不叫 appendonly.aof,等到重写完新的 AOF 文件才会进行改名,覆盖原有的 AOF 文件,完成新旧两个 AOF 文件的替换。但 Redis 的其他功能,比如:持久化,异步删除,集群数据同步等,其实是由额外的线程执行的。

2023-03-24 12:00:00 186

原创 Spring AOP 的使用

把切点声明成一个方法,便于重用@Poincut 的使用格式如下:10 种切点表达式AspectJ 的切点指示符 AspectJ pointcut designators (PCD) ,也就是俗称的切点表达式,Spring 中支持 10 种,如下表:简单介绍下 AspectJ 中常用的 3 个通配符:用于匹配方法执行,最常用。其中带 号的 ,,是可选项,, 是必选项 修饰符匹配,如 public 表示匹配公有方法,表示任意修饰符 返回值匹配, 表示任何返回值,全路径的类名等 类路径匹配 方法

2022-11-29 23:45:00 340

原创 面向切面编程的一些概念

AOP 已经形成了自己的术语,常见的有 1. 通知 2. 切点 3. 连接点。只有 execution 指示器是实际执行匹配的,其他都是限制匹配的。限制连接点匹配特定的执行对象,这些对象对应的类要有指定类型的注解。切面要完成的工作被称为通知,它定义了切面要做什么,何时使用。限制连接点匹配 AOP代理的bean引用为指定类型的类。如果整个应用都使用相同的基类,会导致脆弱的对象体系。多个类使用到相同的功能。把切面应用到目标对象并创建新的代理对象的过程。限制连接点的匹配参数为为指定类型的执行方法。

2022-11-28 23:45:00 204

原创 spring 如何解决循环依赖

spring 中循环依赖的解决方案。三级缓存的作用。spring 没有解决哪些循环依赖

2022-11-25 01:30:00 452

原创 IoC 思想和实现

IoC 是什么,为什么需要IoC,用简单例子自己实现IoC思想彻底理解什么是IoC以及IoC的优点

2022-11-05 10:23:42 436

原创 自定义注解

自定义注解,ORM 实现示例

2022-11-04 00:00:00 259

原创 Bean装配相关注解使用说明

ComponentScan Autowired Qualifier Bean Profile Conditional Primary Scope Enviroment 等注解的使用。

2022-11-03 00:00:00 268

原创 动态代理与静态代理

java中静态代理与动态代理应用示例

2022-11-02 21:45:00 176

原创 Callable与Future的应用

Callable与Future的应用,获取异步任务返回值

2022-10-29 18:33:06 266

原创 并发编程之ForkJoin框架

Fork/Join 重点方法介绍及应用

2022-10-29 17:00:17 1208

原创 定时任务和周期性任务线程池的应用及原理

定时任务和周期性任务线程池的应用及原理,schedule,scheduleAtFixedRate,scheduleWithFixedDelay应用,延迟队列机制。

2022-10-24 19:08:59 2498

原创 线程池实现原理

线程池源码解读以及实现原理,线程池的生命周期,线程池中的线程创建,执行任务,销毁步骤

2022-10-21 21:00:00 287

原创 线程池的5种使用方式

池化思想,不同线程池的创建方式以及差别,线程数设置的经验

2022-10-19 21:42:19 3792

原创 ArrayList和CopyOnWriteArrayList

fail-Fast 机制,CopyOnWriteArratList 实现原理

2022-10-18 22:45:00 885

原创 ConcurrentHashMap与HashTable

HashTable 与 ConcurrentHashMap 的区别,ConcurrentHashMap实现原理

2022-10-18 21:00:00 2841

原创 HashMap底层原理

HashMa底层数据结构详解,1.7与1.8版本HashMap 扩容步骤详解,1.7版本多线程扩容引发的死循环问题详解

2022-10-16 22:01:18 1971

原创 并发编程之Atomic和Unsafe魔法类

原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂处理器保证从系统内存当中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。奔腾 6 和最新的处理器能自动保证单处理器对同一个缓存行里进行 16/32/64 位的操作是原子的,但是复杂的内存操作处理器不能自动保证其原子性,比如跨总线宽度,跨多个缓存行,跨页表的访问。但是处理器提供总线

2022-10-11 20:00:00 349

原创 并发编程之Semaphore和CountDownLatch的用法

Semaphore 是信号量的意思,它的作用是控制访问特定资源的,底层依赖 AQS 的状态 State,是在生产当中比较常用的一个工具类。可以理解为许可证,或者令牌。线程想要访问某部分资源时,必须先获取一个许可证,才能访问,否则等待,一个经典的应用场景是服务限流(Hystrix 里限流就有基于信号量方式),

2022-10-10 21:00:00 327

原创 AQS重点方法详解

AQS应用以及重点方法详解,公平于非公平锁的差异

2022-10-07 09:46:31 423

原创 java中常量池

java 中常量池,字符串常量池,intern() 方法详解,基本对象常量池

2022-09-18 10:19:40 945

原创 GC日志开启及分析

开启GC日志,GC日志轮换,,GC日志分析

2022-09-17 10:45:40 1524

原创 java中volatile解决可见性和有序性问题

java中可见性问题,有序性问题,JMM内存模型,指令重排的解决办法,懒汉模式单例的实现问题

2022-09-17 09:48:54 399

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除