- 博客(32)
- 收藏
- 关注
原创 docker和compose安装及常用命令
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。如果你还不了解 YML 文件配置,可以先阅读YAML 入门教程。使用 Dockerfile 定义应用程序的环境。使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
2023-11-09 11:13:11
367
原创 Spring扩展接口(4):InstantiationAwareBeanPostProcessor
Nullable@NullableSpring框架提供了许多扩展接口,用于在Bean的生命周期中插入自定义逻辑。其中之一是InstantiationAwareBeanPostProcessor接口,它允许我们在Spring容器实例化Bean之前和之后进行一些自定义处理。InstantiationAwareBeanPostProcessor接口是BeanPostProcessor接口的子接口,它定义了在Bean实例化过程中的扩展点。
2023-10-30 15:15:23
146
原创 Spring扩展接口(3):BeanFactoryPostProcessor
BeanFactoryPostProcessor是Spring框架中的一个重要接口,用于在BeanFactory加载Bean定义之后、实例化Bean之前对BeanFactory进行自定义修改和扩展。它允许开发人员在Spring容器加载配置文件并创建Bean实例之前对Bean定义进行操作,例如修改属性值、添加额外的元数据等。在应用程序启动时,Spring容器会自动检测并调用所有实现了BeanFactoryPostProcessor接口的类的postProcessBeanFactory方法。
2023-10-19 15:43:07
119
原创 Spring扩展接口(2):BeanDefinitionRegistryPostProcessor
BeanDefinitionRegistryPostProcessor为容器级后置处理器。容器级的后置处理器会在Spring容器初始化后、刷新前执行一次。还有一类为Bean级后置处理器,在每一个Bean实例化前后都会执行。通常,BeanDefinitionRegistryPostProcessor用于在bean解析后实例化之前通过BeanDefinitionRegistry对BeanDefintion进行增删改查。常见如mybatis的Mapper接口注入就是实现的此接口。
2023-10-10 10:35:17
97
原创 Spring扩展接口(1):ApplicationContextInitializer
在此系列文章中,我总结了Spring扩展接口,以及各个扩展点的使用场景。并整理出一个bean在spring中从被加载到初始化到销毁的所有可扩展点的顺序调用图。这样,我们也可以看到bean是如何一步步加载到spring容器中的。
2023-09-25 11:11:09
106
原创 Redis从入门到放弃(12):pipeline管道技术
通过使用Redis管道管理技术,你可以显著提高应用程序的性能和吞吐量,特别是在需要处理大量数据操作的场景下。通过批量操作和减少网络往返次数,Redis管道管理技术为开发人员提供了一个强大的工具,帮助他们构建高效的应用程序。
2023-09-11 16:38:43
53
原创 Redis从入门到放弃(11):雪崩、击穿、穿透
Redis作为一款高性能的缓存数据库,为许多应用提供了快速的数据访问和存储能力。然而,在使用Redis时,我们不可避免地会面对一些常见的问题,如缓存雪崩、缓存穿透和缓存击穿。本文将深入探讨这些问题的本质,以及针对这些问题的解决方案。
2023-08-28 13:47:14
101
原创 我的创作纪念日
在这个创作的旅程中,我不仅收获了技术上的成长,还赢得了许多宝贵的收获。每篇文章的赞、评论和阅读量都是我前进的动力,看到自己的分享能够对他人有所帮助,这种成就感是无与伦比的。此外,我也希望能够将自己的经验以其他形式分享,例如通过讲座、研讨会等途径,与更多志同道合的人交流,共同进步。最初,我选择在这个平台上分享实战项目中的经验,分享日常学习的点滴,希望能够通过文章促进技术上的交流与讨论。我在撰写这段代码的过程中,深入理解了动态规划的思想,并且在实际项目中取得了显著的性能提升。
2023-08-24 09:38:09
43
原创 Redis从入门到放弃(10):分布式锁
Redis分布式锁提供了多种解决方案,可以根据具体的应用场景和需求选择合适的方案。无论选择哪种方案,都需要考虑锁的安全性、原子性、续约和释放等问题,以确保在分布式环境中共享资源的安全访问。
2023-08-08 15:59:43
47
原创 Redis从入门到放弃(9):集群模式
这个错误包含操作的key所属的 **哈希槽 **和能处理这个请求的Redis节点的 **IP **和 **端口号 **,例如“MOVED 3999 127.0.0.1:6379”,客户端需要根据这个信息重新发送查询指令到给定的IP和端口的Redis节点。**节点通信:**集群中每个节点都需要知道其他所有节点的状态信息,包括当前集群状态、集群中各节点负责的哈希槽、集群中各节点的master-slave状态、集群中各节点的存活状态等。当主节点恢复时,它会成为从节点,从新的主节点进行数据同步。
2023-08-07 15:31:12
57
原创 Redis从入门到放弃(8):哨兵模式
哨兵模式是Redis的高可用解决方案之一,它旨在提供自动故障转移和故障检测的功能。在传统的Redis部署中,单个Redis节点可能成为单点故障,一旦该节点宕机,整个系统将不可用。为了解决这个问题,哨兵模式引入了多个Redis节点,其中一个节点被选为主节点,其他节点作为从节点。
2023-08-04 09:31:53
54
原创 Redis从入门到放弃(7):主从复制
主从复制是Redis的一项重要特性,用于将一个Redis服务器(Master主节点)的数据复制到其他Redis服务器(Slave从节点),以实现数据的高可用性和读写分离。数据的复制是单向的,只能由主节点到从节点。
2023-08-03 13:42:01
82
原创 Redis从入门到放弃(6):持久化
* RDB(Redis DataBase):按指定的时间间隔执行数据集的时间点快照。* AOF(Append Only File):记录服务器收到的每个写入操作。* RDB + AOF:您还可以在同一实例中组合 AOF 和 RDB。
2023-08-02 10:24:36
47
原创 Redis从入门到放弃(5):事务
Redis事务具有以下三个特性:单独的隔离操作:事务中的命令会被序列化并按顺序执行,不会被其他客户端的指令打断。没有隔离级别的概念:事务提交前所有指令都不会被执行。无原子性:事务组队时具有原子性,但在执行阶段出错某段指令,事务过程中的指令仍然会生效。
2023-07-31 09:56:09
67
原创 一次JVM内存溢出的排查经过
生产上所有程序都是在Bst118账户下运行,于是查看该账户下所有的线程数总和为950,也即是说,随时都可能会超过1024,导致内存溢出。为什么设置为20000,因为测试后发现,在运行到35000左右,系统就报内存溢出了,操作系统所有命令都不能使用,因此将程序最大线程数限制在20000。1、经过总结,在遇到问题后,不能盲目的到处修改,首先要做的就是重现问题,顺藤摸瓜,逐步的找出根本原因。2、 接下来怀疑是系统里开的线程数太多,在优化后,问题仍然存在。但是搭建集群后发现,并不是,问题依旧。
2023-07-29 14:44:46
55
原创 Redis从入门到放弃(4):3种新数据类型
前面的文章已经介绍了redis的5种基本数据类型,redis6中另外还有3种特殊的数据类型,分别是 Bitmaps (位图)、HyperLogLogs(基数统计)和 geospatial (地理位置)。本文将继续探讨它们的特性、原理以及应用场景。Redis6引入了三种新的数据类型:Bitmaps、HyperLogLog和Geospatial,这些新数据类型为Redis提供了更多灵活的功能和应用场景。
2023-07-29 13:43:44
47
原创 Redis从入门到放弃(3):发布与订阅
Redis是一个快速、开源的内存数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。除了基本的数据存储和检索功能外,Redis还提供了许多高级功能,其中之一就是发布订阅(Pub/Sub)。发布订阅是一种消息传递模式,它允许消息的发布者(发布者)将消息发送给多个订阅者(订阅者)而不必知道订阅者的存在。这种模式在许多应用中都非常有用,例如实时通知、事件处理、聊天应用等。
2023-07-28 10:37:24
98
1
原创 Redis从入门到放弃(2):数据类型
类型简介特性场景String(字符串)二进制安全可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512MHash(字典)键值对集合,即编程语言中的Map类型适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)存储、读取、修改用户属性List(列表)链表(双向链表)增删快,提供了操作某一段元素的API1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列。
2023-07-27 15:40:49
46
1
原创 Redis从入门到放弃(1):安装配置
Redis是一个高性能的开源key-value数据库。它被广泛应用于缓存、会话存储、实时分析、消息队列等场景。数据持久化:Redis支持将内存中的数据保存到磁盘上,确保数据在断电或重启后不丢失。多样数据结构:除了支持简单的key-value存储,Redis还提供了丰富的数据结构,如List、Set、Sorted Set和Hash等,使其能够处理更复杂的数据需求。数据备份:通过master-slave模式进行数据备份,增加了数据的高可用性。
2023-07-26 18:01:28
53
1
原创 基于GPT搭建私有知识库聊天机器人(六)仿chatGPT打字机效果
在本篇文章中,我们将使用 SSE 技术来实现打字机效果输出。SSE 是一种 HTML5 技术,允许服务器向客户端推送数据,而不需要客户端主动请求。通过 SSE,我们可以在服务器端有新消息时,实时将消息推送到前端,从而实现动态的聊天效果。通过使用 SSE 技术和打字机样式输出,我们成功改进了聊天机器人的界面,实现了更加动态和流畅的聊天体验。这样的用户界面使得聊天机器人更加接近真实对话,提升了用户体验。
2023-07-21 17:02:52
621
1
原创 基于GPT搭建私有知识库聊天机器人(五)函数调用
本文介绍了OpenAI在6月13日发布的重磅更新中,新增的Chat Completions API函数调用功能。通过函数调用,我们可以在聊天机器人中实现更加灵活和复杂的功能,例如从外部API获取实时数据、执行计算任务等。我们还提供了一个简单的代码示例,演示了如何使用函数调用功能。这些更新为构建强大的私有知识库聊天机器人提供了更多的可能性。
2023-07-13 17:29:20
520
1
原创 基于GPT搭建私有知识库聊天机器人(四)问答实现
接下来,我们定义一个prompt模板,用于生成回答。prompt_template = """基于以下已知信息,简洁和专业的来回答用户的问题。如果无法从中得到答案,请说 "根据已知信息无法回答该问题",不允许在答案中添加编造成分,答案请使用中文。已知内容:{context}问题:本文介绍了如何使用langchain框架实现基于GPT的私有知识库聊天机器人的问答功能。通过将问题进行向量处理并从向量数据库中检索相似数据,再结合OpenAI接口进行拟人化回答,我们可以构建一个具备垂直领域知识的问答系统。
2023-07-13 11:04:51
810
1
原创 基于GPT搭建私有知识库聊天机器人(三)向量数据训练
在本文中,我们详细介绍了基于GPT搭建私有知识库聊天机器人的数据训练过程,包括数据训练的依赖、流程和代码展示。数据训练是搭建聊天机器人的重要步骤,希望本文能对读者有所帮助。在下一篇文章中,我们将介绍如何使用训练好的模型进行聊天机器人的测试和使用。
2023-07-12 17:53:09
1365
3
原创 基于GPT搭建私有知识库聊天机器人(二)环境安装
*_.py”, line 24, in from numexpr.interpreter import MAX_THREADS, use_vml, BLOCK_SIZE1 ImportError: DLL load failed while importing interpreter: 找不到指定的模块。下载 numpy+mkl 包来修复它和 pip 从终端安装它(从下载的 whl 文件所在的位置)安装版本:3.8.10(>=3.8.1&
2023-06-30 17:53:05
730
原创 基于GPT搭建私有知识库聊天机器人(一)实现原理
目前很多企业希望将ChatGPT的能力应用到企业内部当中,但ChatGPT是个预训练模型,其所能回答的知识主要来源于互联网上公开的通用知识库,对于部分垂直领域和企业内部的私有知识库的问答无法起到很好的效果,因此,针对这类场景,企业可以基于OpenAI提供的模型服务以及相关生态工具(比如langchain、huggingFace等),构建企业自己特有的知识库问答系统,并在内部知识库问答系统之上,再搭建客服问答系统以及其他的企业助手工具。向量数据的典型结构是一个一维数组,其中的元素是数值(通常是浮点数)。
2023-06-30 17:45:43
1094
原创 SpringBoot+MyBatisPlus实现读写分离
随着业务量的不断增长,数据库的读写压力也越来越大。为了解决这个问题,我们可以采用读写分离的方案来分担数据库的读写负载。本文将介绍如何使用 Spring Boot + MyBatis Plus + MySQL 实现读写分离。通过本文的介绍,我们了解了如何使用 Spring Boot + MyBatis Plus + MySQL 实现读写分离。读写分离可以有效地分担数据库的读写负载,提高数据库的性能和可用性。希望本文能对读写分离的实现有所帮助。
2023-06-20 16:42:21
690
1
原创 搭建Mysql主从复制
MySQL主从复制是一种常用的数据库高可用性解决方案,可以提高数据库的可用性和性能。本教程将介绍如何搭建MySQL主从复制。基于语句的复制(STATEMENT):在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。基于行的复制(ROW):不记录 SQL 语句上下文信息,仅保存哪条记录被修改。混合类型的复制(MIXED):默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
2023-06-20 16:41:07
1038
原创 JAVA系列之类加载机制详解
自定义类加载器通常有以下四种应用场景:源代码加密,防止源码泄露隔离加载类,采用隔离加载,防止依赖冲突。修改类加载的方式。扩展加载源。
2022-11-16 09:15:08
1013
原创 SimpleDateFormat线程安全问题探究
在多个线程共享SimpleDateFormat时,同时也共享了Calendar引用,在如上代码中,calendar首先会进行clear()操作,然后进行set操作,在多线程情况下,set操作会覆盖之前的值,而且在后续对日期进行操作时,也可能会因为clear操作被清除导致异常。SimpleDateFormat继承了DateFormat,DateFormat内部有一个Calendar对象的引用,主要用来存储和SimpleDateFormat相关的日期信息。不仅有的线程结果不正确,甚至还有一些线程还出现了异常!
2022-11-08 17:25:17
232
原创 JAVA系列之内存模型(JMM)
Java内存模型是在硬件内存模型上的更高层的抽象,它屏蔽了各种硬件和操作系统访问的差异性,保证了Java程序在各种平台下对内存的访问都能达到一致的效果。Java内存模型是不可见的,它并不是一个真实的东西,它只是一个概念、一个规范。1、硬件内存架构使得必须建立内存模型来保证多线程环境下对共享内存访问的正确性;2、Java内存模型定义了保证多线程环境下共享变量一致性的规则;3、Java内存模型提供了工作内存与主内存交互的八大同步操作和八大规则;
2022-11-02 14:20:16
543
1
原创 JAVA系列之JVM内存调优
如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概率。堆内存是由年轻代和老年代构成,JDK1.8以后,永久代被元空间取代,使用直接内存,不占用堆内存。**-XX:+UseAdaptiveSizePolicy:**设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。**-Xss128k:**设置每个线程的堆栈大小。
2022-10-27 18:04:08
3867
原创 CPU性能优化干货总结
因gateway需要对请求和响应进行参数重新包装,故需要自定义过滤器,分别是请求过滤器(ModifyRequestGatewayFilterFactory)和响应过滤器(ModifyResponseGatewayFilterFactory)进行拦截处理,为避免网关响应时间受自定义过滤器的影响,直接将过滤器取消,对spring cloud gateway原生代码进行请求压测,经实测后,性能并为明显提升,可以排除自定义过滤器的问题。1、自定义过滤器本身问题排除。
2022-08-24 09:38:07
1023
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人