- 博客(17)
- 收藏
- 关注
原创 mac 的JDK版本切换
在 Mac 上实现 JDK 8 和 JDK 11 之间的切换,可以使用。这样,每次进入该项目目录时,都会自动使用 JDK 11。这样,每次打开终端时都会使用指定的 JDK 版本。如果你经常需要在多个 JDK 之间切换,建议使用。,它可以在不同项目中自动切换 JDK 版本。如果你要在不同项目中自动切换 JDK,工具来管理多个 Java 版本。语句添加到 ~/.zshrc。如果你只是偶尔切换 JDK,命令手动切换,或者使用。
2025-03-13 14:11:53
441
原创 docker网络模式
Docker 提供的几种网络模式主要用于处理容器与容器之间、容器与宿主机之间、以及容器与外部网络之间的通信。它为容器提供一个虚拟的私有网络,通过这个网络,容器可以与宿主机和其他容器进行通信。模式允许容器直接使用宿主机的网络堆栈。在这种模式下,容器不会得到单独的网络命名空间,而是与宿主机共享相同的网络接口。模式允许一个容器共享另一个容器的网络堆栈。这样,这两个容器会拥有相同的网络命名空间,可以共享网络接口和 IP 地址。模式表示容器没有网络连接,也无法与外部或宿主机进行通信。容器不会被分配任何网络接口。
2025-03-11 16:42:42
730
原创 说明一下AIO与NIO的区别
都是 Java 提供的 I/O 处理模式,主要用于提高高并发场景下的 I/O 处理能力。在 I/O 操作完成后会主动通知应用程序,相比 NIO,更加节省线程资源。处理多个连接,减少线程占用。,主要依赖 Selector。在 Java 领域,
2025-03-10 17:38:27
319
原创 并发编程之安全发布对象
在 Java 里,每个线程都有自己的调用栈,局部变量存储在栈帧(stack frame)中,因此局部变量不会被其他线程访问。的策略,主要用于确保数据仅在单个线程的调用栈(stack)中被访问,从而避免并发问题。被赋值给了类的成员变量,而成员变量是可以被多个线程共享的,这样就违反了堆栈封闭原则。如果对象的引用逃出了方法作用域,那么它就可能被多个线程共享,导致线程安全问题。这种策略在并发编程中非常有用,因为它避免了加锁的开销,提高了程序的效率。,导致未初始化或部分初始化的对象被访问,引发。
2025-03-05 15:49:20
1018
原创 Java 中的适配器模式(Adapter Pattern)
用于在两个不兼容的接口之间建立桥梁,使它们可以协同工作。它通常用于让已有的类与新接口兼容,而无需修改原有代码。适用于接口中有多个方法,但客户端只需实现其中一部分的情况。适配器模式(Adapter Pattern)是一种。Java 适配器模式的典型应用包括。等,是一种非常常见的设计模式。
2025-03-03 11:01:42
437
原创 Spring 主要用到的设计模式
让子类重写关键步骤,而公共部分由父类实现。来创建和管理 Bean 对象,避免手动。Spring 允许 Bean 以。,用于在方法执行前后插入逻辑,如。来统一不同接口,保持代码灵活性。来动态选择不同的算法或实现方案。Spring 框架使用了多种。Spring 事件机制基于。,提高性能并减少资源消耗。来实现其核心功能,如。都会返回一个新的实例。
2025-03-03 10:45:50
504
原创 常见的高并发解决方案
适用于大规模 key-value 读写,适用于高吞吐的场景。(单个热点 key 失效后,短时间内大量请求打到数据库)(查询一个不存在的 key,导致数据库压力大)(大量缓存同时失效,导致数据库压力暴增)
2025-03-03 10:43:01
763
原创 好用的AI工具
AI 文本工具: ChatGPT:由 OpenAI 开发,是非常知名的聊天机器人。可以进行自然对话、自动生成文章、代码、策划方案等各种文本内容,经过多轮迭代,功能强大,对自然语言的理解和生成能力优秀,但使用需要一定的技术基础和英文能力,高级功能需订阅。 Claude:由 Anthropic 公司开发,能进行日常的对话问答,Claude 2.0 支持上传文件并进行相关操作,如文件分析、总结等,文件格式支持 PDF、CSV、txt 等,是提高工作效率的利器。 New Bing:微软推出的新一代搜索引擎
2024-10-21 11:49:02
461
1
原创 我们一般如何应对缓存雪崩以及穿透问题吗?
了解什么是Redis的雪崩和穿透吗?Redis崩溃之后会怎么样?系统该如何应对这种情况?如何处理Redis的穿透?3.2 缓存雪崩的解决方案。缓存穿透现象以及解决方案。
2024-08-04 12:38:55
239
原创 订单扣减库存,Redis实现限流算法
- 每次请求都将当前时间,精确到秒作为 key 放入 Redis 中,超时时间设置为 2s, Redis 将该 key 的值进行自增。-- 写入 Redis 的操作用 Lua 脚本来完成,利用 Redis 的单线程机制可以保证每个 Redis 请求的原子性。log.info("成功获取令牌");-- 没有达到阈值 value + 1。// 获取 jedis 实例。-- 当达到阈值时返回错误,表示请求被限流。// 解析 Lua 文件。-- 达到限流大小 返回。-- 获取当前流量大小。-- 资源唯一标志位。
2024-07-31 14:06:52
383
转载 RocketMQ原理
阻塞队列里存放的就是PullRequest对象,当Consumer实例上线后,会做一次负载均衡,从众多MessageQueue中给自己完成分配,当有新的MessageQueue被分配给自己,就会创建PullRequest对象提交到阻塞队列,然后PullMessageService就会开始拉取消息,在拉取完成的回调函数中,不管有没有拉取到新的消息,在不触发流控的情况下,都会一直拉取。索引长度为20个字节,记录了消息在CommitLog文件里的偏移量,消息长度,和消息Tag的哈希值。
2024-06-19 10:21:58
545
原创 TCP/IP
如果 Redis 选择多线程模型,又因为 Redis 是一个数据库,那么势必涉及到底层数据同步的问题,则必然会引入某些同步机制,比如锁,而我们知道 Redis 不仅仅提供了简单的 key-value 数据结构,还有 list、set 和 hash 等等其他丰富的数据结构,而不同的数据结构对同步访问的加锁粒度又不尽相同,可能会导致在操作数据过程中带来很多加锁解锁的开销,增加程序复杂度的同时还会降低性能。序号为 Seq = x + 1,表示收到服务器端的确认号 Ack,并将其值作为自己的序号值;
2024-06-19 10:21:13
275
原创 spring中使用到的设计模式
优点在于灵活性高,允许开发者在Spring容器初始化时,根据特定条件或逻辑动态地添加、修改Bean定义,实现更细粒度的控制,对于编写框架代码或需要动态扩展功能的应用来说非常有用。但是,由于是在运行时动态注册Bean,可能会增加容器的启动时间和复杂性,推荐,在确实需要动态注册Bean的场景下使用,如插件系统、动态数据源等。
2024-06-07 13:30:06
740
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人