- 博客(73)
- 收藏
- 关注
原创 ShardingSphere分库分表与读写分离实战
inline: 直接在配置文件中通过 Groovy 表达式实现分片策略,如:user_$->{u_id%8}, 只支持精确查找 ( = in),不支持范围查找standard: 标准分片策略,用户通过编写分片精确查找和范围查找算法,实现自定义的分片,可以支持精确查找和范围查找,但是分片键只能有一个,也就是只能根据一列来进行分片complex: 复合分片,和标准分片一样,但是可以支持多个列对数据进行分片hint: 强制路由策略,不再由 SQL 决定如何分片,直接由用户指定分片参数。
2023-12-10 17:34:51 657
原创 MySQL 高可用架构
MySQL 是实际生产中最常用的数据库,生产环境数据量极为庞大,对性能和安全要求很高,单机的 MySQL 是远远达不到的,所以必须搭建一个主从复制架构,同时可以基于一些工具实现高可用架构,在此基础上,基于一些中间件实现读写分离架构,如果数据量非常庞大,还要考虑分库分表。本文不讲解 MySQL 数据库的安装,和高可用架构搭建的具体细节,只为探索生产环境常用的高可用方案,和各个方案的优劣。
2023-11-27 08:30:24 366
原创 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 420
原创 RocketMQ基本概念和高级原理
AllocateMachineRoomeNearby: 将同机房的 Producer、 Consumer 分配到一起这个策略可以通过一个 machineRoomResolver 对象来定制 Consumer 和 Broker 的机房解析规则。然后还需要引入另外一个分配策略来对同机房的 Broker 和 Consumer 进行分配。一般也就用简单的平均分配策略或者轮询分配策略。AllocateMessageQueueAveragely:平均分配。将所有 MessageQueue 平均分给每一个消费者。
2023-08-05 17:11:33 1019
原创 SpringBoot集成RocketMQ
SpringBoot整合RocketMQ使用非常简单,下面是一个简单的例子,作为备忘:完整项目代码: https://github.com/dccmmtop/springBootRocketMQ
2023-07-29 19:03:29 375
原创 Java 实现批量加解密工具
当我们想把某些文件上传到云上,方便备份和分享,但是还担心文件泄露,或者不想让提供云存储服务方的管理员看到,可以对文件加密再上传,就可以实现。linux 平台下有 gpg 工具可以对文件加密,但是 win 下没有找到好用的命令行下的加密工具,于是自己用java实现了一个支持批量操作的 aes 加密工具。参数,后面没有密码时,按下回车键后,会提示输入密码,并不会显示到控制台中。执行该命令后,会对当前目录下的java文件进行加密,并生成一个。: 密码,可以显示输入密码,也可隐式输入,当只有。
2023-07-19 10:14:01 474
原创 RocketMQ 的介绍和基本使用
在RabbitMQ 的基本概念和五种模式使用示例前半部分介绍了 MQ 的应用场景,以及多个 MQ 产品的对比,那时说到 RocketMQ 的客户端版本只有 Java , 现在 Apache RocketMQ 社区中也增加了 C++ NodeJS Python Go 的客户端。RocketMQ 是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016 年开源后捐赠给 Apache,现在是 Apache 的一个顶级项目。
2023-05-21 19:00:47 1014
原创 小爱同学接入人工智能
最近入手了一款小爱音响,想着把小爱音响接入 chatGPT, 在 github 上找了一个非常优秀的开源项目,整个过程还是比较简单的,一次就完成了。就会调用一个部署在我本机的一个服务,来控制我的电脑,比如“电脑音量调到百分之五十”让我自己想的话,估计就是想着各种办法去破解小爱同学,但是这需要很深的硬件知识。那么频繁的调用小爱同学会话记录接口,很难长久稳定的运行,肯定会被小米封的。其中最难的技术点是 如何获取与小爱的对话记录?如何让小爱播放文本?这样小爱同学只用来语音转文本,然后播放一段声音了。
2023-05-14 20:39:37 9019 2
原创 Java中包扫描的实现
用过spring框架后知道包扫描是一个非常好用的功能,只需要在某个包下写自己的类,框架就能自动帮我们加载到容器中,从而在各处使用,今天自己来实现一下包扫描。原理其实很简单,就是找到某个目录下的所有class文件,然后使用类加载器加载到jvm中,再使用反射生成一个该类的对象即可。
2023-04-23 22:07:50 1466 1
原创 SpringBoot与RabbitMQ 集成以及死信队列,TTL,延迟队列
如果设置了手动确认方式,则需要在业务处理成功后,调用 channel.basicAck(),手动签收,如果出现异常,则调用 channel.basicNack() 方法,让其自动重新发送消息。TTL 全称是 Time To Live (存活时间), 当消息到达存活时间后还没有被消费就会自动清除,这与 redis 中的过期时间概念类似,我们应该合理应用 TTL,可以有效的处理过期的垃圾信息,从而降低服务器的负载。当数据量特别大的时候,对生产者限制肯定是不科学的,这是用户的行为,我们应该对消费端限流。
2023-04-15 15:19:56 780
原创 RabbitMQ的基本概念和五种模式使用示例
2007年,Rabbit 技术公司基于 AMQP 标准开发的 RabbitMQ 1.0 发布。RabbitMQ 采用 Erlang 语言开发。Erlang 语言由 Ericson 设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。AMQP 即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
2023-04-07 23:36:40 851
原创 Redis 内存清理策略
如果不设置最大内存,当 Redis 内存超出物理内存限制时,内存的数据会开始和磁盘产生频繁的交换 (swap),会让 Redis 的性能急剧下降。主动清理策略在 redis 4.0 之前一共实现了 6 种内存淘汰算法,4.0 之后,又增加了 2 中,共 8 种。当存在热点数据时,LRU 的效率很好,但偶发性的、周期性的批量操作会导致 LRU 命中率急剧下降,缓存污染情况比较严重。当 Redis 运行在主从模式时,只有主结点才会执行过期删除策略,然后把删除操作”del key”同步到从结点删除数据。
2023-03-30 23:43:29 1041
原创 Redis缓存击穿和穿透以及雪崩
这个长度一般很大,过亿都是正常的,因为它是按位存储的,一亿的长度所占的空间也就 12M。缓存穿透指的是查询一个根本不存在的数据,缓存层和存储层都不会命中,通常处于容错的考虑,如果存储层不存在数据也不会写入缓存层。对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透可以先用布隆过滤器做一次筛选,对于不存在数据,布隆过滤器一般都能够过滤掉,不让请求再继续往后端走。如上图所示,布隆过滤器就是一个大型的位数组和几个不一样的无偏hash函数,所谓无偏,就是能够把元素的hash值计算的比较均匀。
2023-03-30 23:41:19 866
原创 redis 使用规范与性能优化
swap 对操作系统比较重要,当物理内存不足时,可以将一部分内存也 swap 到硬盘上,已解燃眉之急,对于需要高并发,高吞吐的应用来说,磁盘 IO 通常会成为系统的瓶颈,再 Linux 中,并不是等所有的物理内存使用完后才用到 swap。minIdle(最小空闲连接数),与其说是最小空闲连接数,不如说是"至少需要保持的空闲连接数",在使用连接的过程中,如果连接数超过了 minIdle,那么继续建立连接,如果超过了 maxIdle,当超过的连接执行完业务后会慢慢被移出连接池释放掉。
2023-03-30 23:40:31 360
原创 Redis 的主从和哨兵以及集群架构
哨兵架构下的 client 端第一次从哨兵中找出主节点,后续就直接访问 redis 的主节点,不会每次都通过哨兵代理访问主节点,当 redis 的主节点发生变化时,哨兵会第一时间感知到,并将新的 redis 主节点通知给客户端,这里的 redis 客户端一般都实现了订阅功能,订阅哨兵发布的节点变动信息。当主节点与从节点断开重连后,一般都会进行全量的数据复制,从 2.8 版本开始,redis 可以支持部分数据复制的命令与 master 同步,也就是断点续传。
2023-03-26 15:16:58 458
原创 Redis中渐进式遍历key
keys 算法是遍历算法,复杂度是 O(n),如果实例中有千万级以上的 key,这个指令就会导致 Redis 服务卡顿, 所有读写 Redis 的其它的指令都会被延后甚至会超时报错, 因为 Redis 是单线程程序,顺序执行所有指令,其它指令必须等到当前的 keys 指令执行完了才可以继续。当 SCAN 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代,而当 redis 服务器向用户返回值为 0 的游标时, 表示迭代已结束,这是唯一迭代结束的判定方式,而不能通过返回结果集是否为空判断迭代结束。
2023-03-26 00:15:00 614
原创 MySQL 和 Redis 的数据一致性问题
数据一致”一般指的是:缓存中有数据,缓存的数据值 = 数据库中的值。缓存中有数据,缓存的数据值 = 数据库中的值(需均为最新值,本文将“旧值的一致”归类为“不一致状态”)缓存中本没有数据,数据库中的值 = 最新值(有请求查询数据库时,会将数据写入缓存,则变为上面的“一致”状态)”数据不一致“:缓存的数据值 ≠ 数据库中的值;缓存或者数据库中存在旧值,导致其他线程读到旧数据。
2023-03-25 00:00:00 461
原创 redis基础配置和持久化
如果开启了混合持久化,AOF 在重写时,不再是单纯将内存数据转换为 RESP 命令写入 AOF 文件,而是将重写这一刻之前的内存做 RDB 快照处理,并且将 RDB 快照内容和增量的 AOF 修改内存数据的命令存在一起,都写入新的 AOF 文件,新的文件一开始不叫 appendonly.aof,等到重写完新的 AOF 文件才会进行改名,覆盖原有的 AOF 文件,完成新旧两个 AOF 文件的替换。但 Redis 的其他功能,比如:持久化,异步删除,集群数据同步等,其实是由额外的线程执行的。
2023-03-24 12:00:00 216
原创 Spring AOP 的使用
把切点声明成一个方法,便于重用@Poincut 的使用格式如下:10 种切点表达式AspectJ 的切点指示符 AspectJ pointcut designators (PCD) ,也就是俗称的切点表达式,Spring 中支持 10 种,如下表:简单介绍下 AspectJ 中常用的 3 个通配符:用于匹配方法执行,最常用。其中带 号的 ,,是可选项,, 是必选项 修饰符匹配,如 public 表示匹配公有方法,表示任意修饰符 返回值匹配, 表示任何返回值,全路径的类名等 类路径匹配 方法
2022-11-29 23:45:00 390
原创 面向切面编程的一些概念
AOP 已经形成了自己的术语,常见的有 1. 通知 2. 切点 3. 连接点。只有 execution 指示器是实际执行匹配的,其他都是限制匹配的。限制连接点匹配特定的执行对象,这些对象对应的类要有指定类型的注解。切面要完成的工作被称为通知,它定义了切面要做什么,何时使用。限制连接点匹配 AOP代理的bean引用为指定类型的类。如果整个应用都使用相同的基类,会导致脆弱的对象体系。多个类使用到相同的功能。把切面应用到目标对象并创建新的代理对象的过程。限制连接点的匹配参数为为指定类型的执行方法。
2022-11-28 23:45:00 225
原创 Bean装配相关注解使用说明
ComponentScan Autowired Qualifier Bean Profile Conditional Primary Scope Enviroment 等注解的使用。
2022-11-03 00:00:00 290
原创 定时任务和周期性任务线程池的应用及原理
定时任务和周期性任务线程池的应用及原理,schedule,scheduleAtFixedRate,scheduleWithFixedDelay应用,延迟队列机制。
2022-10-24 19:08:59 2716
原创 ConcurrentHashMap与HashTable
HashTable 与 ConcurrentHashMap 的区别,ConcurrentHashMap实现原理
2022-10-18 21:00:00 3350
原创 并发编程之Atomic和Unsafe魔法类
原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂处理器保证从系统内存当中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。奔腾 6 和最新的处理器能自动保证单处理器对同一个缓存行里进行 16/32/64 位的操作是原子的,但是复杂的内存操作处理器不能自动保证其原子性,比如跨总线宽度,跨多个缓存行,跨页表的访问。但是处理器提供总线
2022-10-11 20:00:00 377
原创 并发编程之Semaphore和CountDownLatch的用法
Semaphore 是信号量的意思,它的作用是控制访问特定资源的,底层依赖 AQS 的状态 State,是在生产当中比较常用的一个工具类。可以理解为许可证,或者令牌。线程想要访问某部分资源时,必须先获取一个许可证,才能访问,否则等待,一个经典的应用场景是服务限流(Hystrix 里限流就有基于信号量方式),
2022-10-10 21:00:00 369
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人