自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Liu Zijian‘s Blog

All things in their being are good for something

  • 博客(65)
  • 收藏
  • 关注

原创 开源项目芋道源码解析 [开篇]

文章首发于我的博客:https://blog.liuzijian.com/post/source-code-about-ruoyi-vue-pro.html芋道(又名yudao,ruoyi-vue-pro)是一个基于spring-boot框架的单体Java后端开源项目,拥有基于RBAC模型的组织架构管理、CRM、ERP、商城、代码生成、AI等多个功能模块。封装了多租户、数据权限、工作流、OAuth,邮件、短信、定时任务、日志、链路追踪等多种技术和业务组件。其在GitHub上的地址是:https://gith

2025-01-23 10:49:51 3926 3

原创 Redis开篇

Redis系列的开篇,基于Redis7或更高版本,主要介绍Redis的基本功能使用,性能调优和高级特性,以及应用场景和底层源码和原理解读等

2025-01-19 15:52:29 872

原创 Python中的模块和包

模块的命名要符合标识符的命名规则,模块名(文件名)大小写敏感,最重要的是不能与标准库模块重名,否则引入时,会被与之重名的标准库模块顶替(类似Java中的双亲委派)例如定义两个模块在根路径下,order和payorder.pypay.py定义包和定义模块规则也类似,报名符合标识符命名规范,不能和标准库包的名称冲突,且大小写敏感,一般用小写字母。例如在项目根路径下,新建一个trade包,新建文件夹,名字和要建的包的包名一致,文件夹里面新建一个空的__init__.py文件,就成功创建了一个包。

2025-12-25 23:11:39 630

原创 Python全局环境和虚拟环境(venv)

在进行python项目开发时,不同项目可能需要依赖的python版本是不同的,有时电脑上需要安装好几个不同版本的python解释器。而且在开发过程中,需要依赖一些第三方的包,不同项目依赖的第三方包及其版本也不相同,需要进行区分。类似node.js使用npm可以全局安装一些依赖包,也可以配合项目package.json为每个项目单独安装依赖,但是对于python来说,不仅仅依赖包可以分别安装,不同项目甚至可以采用不同python解释器,这个就是通过python的虚拟环境实现的。

2025-12-16 16:00:35 723

原创 实现MinIO数据的每日备份

MinIO是一个对象存储解决方案,常作为中间件用于后端系统保存和管理文件附件,附件和关系型数据库的库表数据一样是系统的核心用户数据,因此系统运行过程中,需要对附件数据进行每天备份。在常年累月运行中,系统产生的附件量是巨大的,有时单独一个附件就很大,如果每天进行全量备份,那备份的文件就会像滚雪球一样越来越大,因此这里采用增量备份的形式,每天只备份当天的数据。

2025-11-11 14:56:28 248

原创 Spring AI调用MCP服务

MCP(Model Context Protocol),即模型上下文协议,是一种开放标准,使大模型采用统一的标准化的方式与外部的工具和数据等进行通信交互。

2025-11-09 12:59:51 885 1

原创 Spring AI使用知识库增强对话功能

答案是否定的,因为ES是一种全文检索,不能完美实现相关性检索,例如我们想要和大模型聊一下最近有哪些“国际争端”之类的话题,“柬泰边境冲突”肯定算一件,但是如果以“国际争端” “争端”为关键词简单的全文检索,无法将这个话题有关的内容全部查询命中,因为这种场景的检索要求的不是文字的匹配而是语义的匹配,于是这里就引入了一个概念:向量相似度。最后一步,利用保存了我们自己上传了文档的向量数据库,作为大模型对话的知识库,对大模型尚未了解的内容进行补充,首先先将之前用过的对话模型DeepSeek的依赖和配置添加进去。

2025-11-05 20:35:00 1085

原创 Spring AI实现一个智能客服

Tool注解代表是一个可供大模型调用的Tools方法,ToolParam注解指定字段为Tools方法的参数,用于描述方法或参数字段的用途和含义,返回的对象暂不支持用注解指明字段含义,可在@Tool注解的上一并写清@Data@ToolParam(required = false, description = "课程类型:编程、设计、自媒体、其它")

2025-11-01 23:30:27 1062

原创 Redis数据结构之Stream

Redis Stream是Redis 5.0版本新增加的数据结构。Redis Stream主要用于消息队列(MQ,Message Queue),Redis本身是有一个Redis发布订阅(pub/sub)来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃,而且没有ACK机制来保证数据的可靠性,假设一个消费者都没有,那消息就直接被丢弃了,简单来说发布订阅(pub/sub)可以分发消息,但无法记录历史消息。

2025-10-30 09:01:56 930

原创 使用Java实现一个DNS服务

这里采用Java实现一个多线程的DNS代理服务器,对于内网域名直接通过内网DNS的UDP:53进行解析,对于外网域名则以加密的DOH(DNS Over Https)方式通过阿里云DNS进行解析,并解析DNS服务器返回的报文并打印日志。有时,我们所在单位的电脑只允许上内网,外网被断掉了,如果想要同时上内外网,我们可以通过修改路由表,然后双网卡一机两网的方式来实现分流上网,例如网线连公司内网,用WiFi连接自己的手机热点,或者额外购买一个USB网卡插入电脑,同时连接公司的AP和自己手机热点。

2025-10-30 08:57:58 425

原创 Spring AI加DeepSeek实现一个Prompt聊天机器人

本文最后更新于 2025年10月29日本文通过Spring AI基于DeepSeek大模型,以Prompt模式,开发一个智能聊天机器人,并进行对话。Spring AI必须基于jdk-21,因此需要先升级自己的JDK版本基于jdk-21创建spring-boot项目,引入spring-boot依赖3.5.7,spring-ai依赖1.0.3application.yml配置中进行配置,并填写DeepSeek的API_KEY,我是从DeepSeek官方()购买获得,充值后,可以从页面获得API_KEY。

2025-10-29 15:09:02 980 1

原创 Redis数据结构之GEO

移动互联网时代LBS应用越来越多,交友软件中附近的人、外卖软件中附近的美食店铺等,那这种附近各种形形色色的地址位置选择是如何实现的?地球上的地理位置是使用二维的经纬度表示,经度范围(-180,180],纬度范围(-90,90],只要我们确定一个点的经纬度就可以取得它在地球上的位置。但是这样会有查询性能问题,如果并发高数据量大,这种查询会影响数据库性能,而且这个查询到的是一个矩形范围,而不是以点为中心r公里为半径的圆形范围。添加地理位置的坐标获取地理位置的坐标计算两个位置之间的距离。

2025-06-20 22:47:08 1003

原创 Redis数据结构之HyperLogLog

基数统计是一种去重复统计功能的基数估计算法,HyperLogLog是用来做基数统计的数据结构,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的。在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2⁶⁴个不同元素的基数,这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

2025-06-20 22:44:05 542

原创 SQL解析工具JSQLParser

是一个Java语言的SQL语句解析工具,功能十分强大,它可以将SQL语句解析成为Java类的层次结构,还支持改写SQL,常见的持久层框架MyBatis-Plus就采用它作为SQL解析工具来实现某些功能。用于表示SQL中的字段对象,例如从一个Insert对象获取SQL要添加的全部字段:name,age,tenant_id。是JSqlParser库中的一个核心接口,是用于表示SQL语句中的各种表达式的基类接口,通过调用对象的。,一种带着括号的Expression结构,例如获取insert语句。

2025-05-23 21:59:36 1571

原创 TenantLineInnerInterceptor源码解读

TenantLineInnerInterceptor是MyBatis-Plus中用于实现多租户功能的拦截器类,通过插件机制对SQL进行拦截和处理。它继承自BaseMultiTableInnerInterceptor,并实现了InnerInterceptor接口,主要对增、删、改、查操作中的SQL进行解析和重写,以确保多租户隔离。对于查询、删除和更新操作,会在SQL条件中追加tenant_id = ?的条件;对于插入操作,则会将`

2025-05-13 16:42:45 1284

原创 深入理解Java泛型

泛型(Generics)和面向对象、函数式编程一样,也是一种程序设计的范式,泛型允许程序员在定义类、接口和方法时使用引用类型的类型形参代表一些以后才能确定下来的类型

2025-04-24 10:57:39 695

原创 芋道源码解读之多租户

租户(Tenant)是系统中的一个逻辑隔离的单元,代表一个独立使用系统的组织(如企业、高校等),在多租户系统中,不同租户共享相同的应用程序和基础设施,但各自拥有独立的数据、配置、组织架构及用户等。

2025-04-08 17:34:32 1410

原创 Redis数据结构之ZSet

ZSet和Set一样也是String类型元素的集合,且不允许重复的成员,不同的是ZSet每个元素都会关联一个double类型的分数,Redis正是通过分数来为集合中的成员进行从小到大的排序。ZSet的成员是唯一的,但分数(score)却可以重复。ZSet集合是通过哈希表实现的,所以添加,删除,査找的复杂度都是O(1)。ZSet集合中最大的成员数为2³²-1。

2025-04-05 23:14:40 1287

原创 Redis数据结构之Set

Set是String类型的无序集合,集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是intset或者hashtable。Set是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。Set中最大的成员数为2³²-1 (4294967295,每个集合可存储40多亿个成员)。Set集合的使用场景很多,例如:可能认识的人或共同感兴趣的话题,商品sdiff a bsdiff b a年会抽奖活动sadd 活动key 用户ID:参与抽奖scard 活动key。

2025-04-05 23:13:27 854

原创 Redis数据结构之Hash

Hash是一个String类型的field(字段)和value(值)的映射表,而且value是一个键值对集合,类似,Hash特别适合用于存储对象。每个Hash可以存储2³²-1个键值对 (40多亿)。KV键值对的结构,适合早期的购物车等场景。

2025-04-05 23:12:20 661

原创 Redis数据结构之List

List是简单的字符串列表,单key多个value,按照插入顺序排序。支持添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个双端链表,主要功能有push/pop等,用在栈,队列,消息队列等场景,left/right都可以插入添加,如果键不存在创建新的链表,键已存在,则新增内容,如果值全被移除了,对应的键也就消失了。双端链表两端操作的效率很高,通过索引下标的操作性能略有下降最多可以包含2³²-1个元素 (4294967295, 每个列表超过40亿个元素)。

2025-04-05 23:11:02 706

原创 Redis的公共操作命令

Redis是Key-Value数据库,Key都是字符串且区分大小写,关于Redis的key操作,主要有常见的以下几个。非阻塞删除,仅仅将key从keyspace元数据中删除,真正的数据删除将在后续异步进行,返回bool。Redis的底层使用C语言实现,很多命令返回bool时,多用0和1表示。查看key还有多少秒过期,-1代表永不过期,-2代表已过期,通常和。Key是否存在,返回bool,1代表true,0代表false。查看当前库所有的Key,类似于数据库的。Redis的命令是不区分大小写的。

2025-04-05 23:09:00 607

原创 Redis数据结构之String

String是最常用的数据类型,一个key对应一个value。String是二进制安全的,可以包含任何数据(例如图片和序列化对象),支持序列化。单个Value最大512MB。

2025-04-05 23:07:17 977

原创 DataPermissionInterceptor源码解读

原文首发在我的博客:https://blog.liuzijian.com/post/mybatis-plus-source-data-permission-interceptor.htmlDataPermissionInterceptor是MyBatis-Plus中的一个拦截器插件类,位于mybatis-plus-jsqlparser-support模块的com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor,用于

2025-04-03 15:27:44 1464

原创 BaseMultiTableInnerInterceptor源码解读

本文首发在我的博客:https://blog.liuzijian.com/post/mybatis-plus-source-multi-table-inner-interceptor.htmlBaseMultiTableInnerInterceptor是MyBatis-Plus中的一个抽象类,位于mybatis-plus-jsqlparser-4.9模块中com.baomidou.mybatisplus.extension.plugins.inner包下,提供解析和重写SQL功能,MyBatis-Plus的

2025-03-25 08:53:18 1131

原创 芋道源码解析之数据权限

数据权限是一个比较常用的功能,芋道源码通过mybatis-plus自定义插件在SQL执行前拦截并解析到对应的表,根据数据权限规则对这些表追加where条件来实现数据权限控制,对于一些需要单独指定数据权限的业务方法,通过数据权限注解和结合线程上下文对加了注解的方法进行前置和后置的处理,把当前方法适用的数据权限规则传递给数据权限SQL解析器进行额外处理,使得数据权限规则既能全局生效又能局部调整。

2025-02-26 12:22:22 2084

原创 基于Hexo实现一个静态的博客网站

hexo默认自带一个叫landscape的主题,根目录下的_config.landscape.yml就是它的配置文件,landscape比较简陋,也不美观,所以很多人选择美观且功能强大的第三方主题,在这里,我使用主题fluid来建站。将压缩包下载下来,解压,压缩包内文件夹名字叫hexo-theme-fluid-1.9.8,这个就是主题,不过要把解压后的文件夹重命名为fluid,并将这个文件夹放在主题文件夹themes内。主题更多玩法,在主题的官网都有文档说明,主题配置文件。

2025-02-06 13:43:01 1570

原创 Docker Compose的使用

Docker Compose是Docker官方的开源项目,负责实现对Docker容器的快速编排,Docker建议每个容器只运行一项服务,因为容器运行的开销很小,但是同时部署多个应用需要每个容器都单独编写Dockerfile会显得非常复杂,因而Docker官方提供了多容器部署的编排工具Docker Compose。Docker Compose允许用户通过一个单独的配置文件来定义一组相关联的应用容器为一个项目,Docker Compose可以管理多个Docker容器组成的一个应用,只需要定义好一个。

2025-02-04 16:47:06 2101

原创 Java8的新特性

注解:这是一个可选的注解,它可以帮助编译器在编译时检查接口是否符合函数式接口的要求,即是否只有一个抽象方法,如不符合还加这个注解,会导致编译器报错。

2025-01-20 11:30:39 651

原创 Redis安装

使用Rocky Linux release 9.5环境编译安装Redis-7.2.6。

2025-01-19 16:12:43 538

原创 Java怎样实现将数据导出为Word文档

我们在开发一些系统的时候,例如OA系统,经常能遇到将审批单数据导出为word和excel文档的需求,导出为excel是比较简单的,因为excel有单元格来供我们定位数据位置,但是word文档的格式不像表格那样可以轻松的定位,要想将数据导出为一些带有图片和表格的这种结构复杂的word文档该怎样实现呢。模板绘制好以后,开始使用poi-tl工具生成word文档,首先新建maven项目,引入poi-tl的依赖和需要的其他依赖,然后将这个绘制好的word模板文件放在工程的。如果表格中某一列是图片,则表示为。

2025-01-11 18:48:51 1115

原创 OA系统的天数该怎样计算

以半天为最小单位时,机械的加减有时可能无法和实际情况相符,例如我在OA系统提交休假审批,从1号上午到2号上午为假期,如果直接假定开始的小时都一样直接把日期时间简单相减,那么休假时间就是24小时构成的1天,但是实际上假期的构成是1号上午,1号下午,以及2号上午,按照工时的普遍计算逻辑就是1.5个工作日,OA系统应计算实际休假时长是1.5天,那这种场景下OA系统要怎样计算才准确呢,我把情况分为4种分别处理,分别计算休假一天,两天和三天的情况,进而推导到更长时间。

2024-12-31 16:48:52 1063

原创 Spring概述

广义上的Spring泛指以Spring Framework为核心的Spring技术栈,经过十多年发展,已经不再是一个单纯的应用框架,而是逐渐发展成为一个由多个不同子项目组成的成熟技术,例如Spring Framework,Spring MVC,Spring Boot,Spring Cloud,Spring Data,Spring Security等,其中Spring Framework是其他框架的基础。狭义上的Spring指的就是Spring Framework,我们通常称之为Spring框架。

2024-12-29 21:19:57 1164

原创 安装K8s集群

因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,拉取镜像,下载网络插件等操作,需要科学上网访问DockerHub。安装全过程均使用权限。

2024-12-25 09:50:54 2002

原创 RockyLinux9编译安装MySQL8

Linux版本: Rocky Linux release 9.5 (Blue Onyx)

2024-12-21 22:38:56 970

原创 SpringBoot配置和启动

logback :log4j2 :jul:不带`-spring`后缀的,直接被日志框架识别带后缀的不被日志框架加载,而由spring boot加载,可是使用spring profile功能,指定某个配置在某个环境生效。

2024-12-17 21:07:28 751

原创 RockyLinux9编译安装MySQL5.7

的MySQL源码包(mysql-boost-5.7.44.tar.gz),进行下载,并将下载到的源码包先放到服务器的。命令,进行编译前的检查和配置,使用CMake配置和生成MySQL源码编译所需的构建系统文件,安装MySQL到。执行后,开始编译,不断输出日志,编译的过程很耗时间,需要等待很久,编译完成后,可以在。文件夹下,可以看到目前版本依赖的boost版本是哪个,一会编译时会用到。在Rocky9上,有的依赖包没有自带,也无法通过。本文最后更新于 2024年12月15日。,初始化完成后,目录内会多出一个。

2024-12-15 23:59:35 1531

原创 Docker与联合文件系统

这样最大的好处就是共享资源,比如多个镜像都从base镜像构建而来,那么宿主机只需要在磁盘上保存一个base镜像,就可以为所有容器服务了,而且镜像的每一层都可以被共享。支持通过拓展现有镜像,创建新的镜像。docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称之为容器层,容器层之下的都叫镜像层,所有对容器的改动,无论添加删除还是修改文件,都只会发生在容器中,只有容器层是可写的,容器层下面所有镜像层都是只读的。本文最后更新于 2024年12月8日。

2024-12-11 19:04:40 833

原创 Docker的安装和配置

因阿里云加速服务调整,镜像加速服务自2024年7月起不再支持,从镜像仓库中拉取镜像时,需要科学上网直接访问DockerHub。在CentOS上安装Docker的过程相对简单,可以通过官方提供的安装包安装。Docker的安装包需要从仓库获取,执行以下命令来添加阿里云的Docker仓库。运行以下命令,拉取一个测试镜像并启动一个容器,以验证Docker安装是否正常。安装完成后,需要启动Docker服务,并且将其设置为开机自启。在安装Docker之前,确保安装了一些必要的依赖包。配置文件后,重新启动docker。

2024-12-11 18:58:21 449

原创 MySQL变量

用户变量针对当前连接有效,声明时必须初始化,可以不指定类型。适用于声明的语法,还可以查出一个值赋给变量。查看部分全局变量的值。使用用户变量也需要@

2024-12-11 18:52:51 180

空空如也

空空如也

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

TA关注的人

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