ElasticSearch
ElasticSearch数据模型
Elasticsearch 是基于文档的搜索引擎,它使用 JSON 文档来存储数据。在 Elasticsearch 中,相关的数据通常存储在同一个文档中,而不是分散在多个表中。
MySQL 是一个关系型数据库管理系统,它使用表、行和列的结构来组织数据。数据通过外键关系分散在多个表中。
查询语言
Elasticsearch 使用 Query DSL(Domain Specific Language),这是一种非常灵活的查询语言,基于 JSON,支持全文搜索、复合查询、过滤以及聚合等。
MySQL 使用 SQL(Structured Query Language),这是一种强类型和非常成熟的语言,专门用于查询和管理关系数据库。
全文搜索
Elasticsearch 的核心功能是全文搜索。它对数据进行索引时会自动建立全文搜索索引,使其在搜索大量文本数据时表现优异。
MySQL 虽然也提供了基本的全文搜索功能,但其主要设计目标是处理结构化数据的存储和查询,对全文搜索的支持不如 Elasticsearch 那样强大。
事务支持
Elasticsea ...
ROWNUM 和 ROW_NUMBER() 的区别
ROWNUM 和 ROW_NUMBER() 都是oracle中获取系统顺序分配为从查询返回的行的编号的,返回的第一行分配的是1,第二行是2,依此类推。
ROWNUM 是一个伪列,用来为查询结果中的每一行分配一个唯一的、递增的行号。 她返回的行号是按照查询结果的顺序分配的,而不依赖于特定的排序。它是在从数据库中提取数据时计算的,并且会在查询返回结果时就分配给每一行。
如果在没有使用ORDER BY的情况下使用 ROWNUM查询数据,返回的行号是根据数据在数据库中的物理存储顺序自动分配的。
如果使用 ROWNUM 与 ORDER BY 结合使用,ROWNUM 只会按查询返回的顺序分配行号,而不是按排序的结果分配。
ROW_NUMBER() 是一个窗口函数,它根据指定的排序规则为查询结果集中的每一行分配一个唯一的、递增的行号。 返回的行号是按照指定的排序顺序生成的。它是在结果集返回之前计算的,并且是基于 ORDER BY 子句中指定的排序规则分配的。
ROW_NUMBER() 会根据 ORDER BY 子句明确指定的列来分配行号,因此行号的顺序严格按照 ORDER BY 的顺序来。
...
不建议直接使用Spring的@Async
不建议直接使用Spring的@Async@Async 中关于线程池的使用部分在 AsyncExecutionInterceptor 中,在这个类中有一个 getDefaultExecutor 方法,当我们没有做过自定义线程池的时候,就会用 SimpleAsyncTaskExecutor 这个线程池。
@Overrideprotected Executor getDefaultExecutor(BeanFactory beanFactory) { Executor defaultExecutor = super.getDefaultExecutor(beanFactory); return (defaultExecutor != null ? defaultExecutor : new SimpleAsyncTaskExecutor());}
SimpleAsyncTaskExecutor 这玩意坑很大,其实他并不是真的线程池,它是不会重用线程的,每次调用都会创建一个新的线程,也没有最大线程数设置。并发大的时候会产生严重的性能问题。
他的doExecut ...
Docker常用命令
Docker常用命令docker run:启动一个新的容器docker ps:列出正在运行的容器docker ps -a:列出所有容器docker stop: 停止正在运行的容器docker start: 启动已停止的容器docker rm:删除容器docker images: 列出本地镜像docker pull:从镜像仓库拉取或更新指定的镜像docker build: 使用 Dockerfile 构建镜像docker logs:查看日志docker logs -f <container-id or container-name>:实时跟踪日志输出docker logs --tail 50 <container-id or container-name>:查看最新的50行日志docker logs --since 30m <container-id or container-name>:查看最近30分钟的日志
Lombok应该谨慎使用
Lombok应该谨慎使用Lombok 是一款非常实用 Java 工具,可用来帮助开发人员消除 Java 的冗长代码,尤其是对于简单的 Java 对象(POJO)。
它通过注释实现这一目的。
团队强X
因为 Lombok 的使用要求开发者一定要在 IDE 中安装对应的插件。
如果未安装插件的话,使用 IDE 打开一个基于 Lombok 的项目的话会提示找不到方法等错误。导致项目编译失败。
也就是说,如果项目组中有一个人使用了 Lombok,那么其他人就必须也要安装 IDE 插件。否则就没办法协同开发。
更重要的是,如果我们定义的一个 jar 包中使用了 Lombok,那么就要求所有依赖这个 jar 包的所有应用都必须安装插件,这种侵入性是很高的。
代码可读性,可调试性低
在代码中使用了 Lombok,确实可以帮忙减少很多代码,因为 Lombok 会帮忙自动生成很多代码。但是这些代码是要在编译阶段才会生成的,所以在开发的过程
中,其实很多代码其实是缺失的。
在代码中大量使用 Lombok,就导致代码的可读性会低很多,而且也会给代码调试带来一定的问题。
比如,我们想要知道某个类中的某个属性的 ...
Linux下rm正在写入的文件会发生什么
Linux下rm正在写入的文件会发生什么在 Linux 中,文件的存储由两部分组成:
文件名(Directory Entry):用户看到的文件路径(如 /data/file.txt)。
文件数据(Inode 和数据块):实际存储文件内容的磁盘空间。
rm 命令的作用是删除文件名与 inode 的链接(目录中看不到这个文件了)。
如果该文件被其他进程正在写入,则 inode 和数据块不会立即释放,进程还可以继续写入(数据仍可写入),等所有进程关闭文件后再回收资源(回收文件的磁盘空间)。
之所以这样,是因为其实在 linux 中,文件数据和文件名是分开的
文件名是目录中的一个“链接(link)”,指向 inode。
文件内容存在 inode 管理的 block 中。
rm 命令只是调用 unlink(),移除了一个目录项。
facefusion
facefusion换脸在github找到一个换脸项目,想要本地部署玩一下
地址是这个:https://github.com/facefusion/facefusion.git
也可以进入官网:Installation | FaceFusion安装
1.安装环境git
可以在cmd输入nvidia-smi查看显卡支持的cuda版本,需要12.4+,不满足的话可以升以下显卡驱动
安装conda
2.部署先git拉一下项目
然后在项目文件夹内,创建虚拟环境,会比较慢这一步
conda create --name facefusion python=3.12 -y
创建完成后,激活环境
conda activate facefusion -y
可能会报错CondaError: Run 'conda init' before 'conda activate',那就先init,然后重新打开shell执行active
之后,安装三方库
conda install conda-forge::cuda-runtime=12.4.1 conda-forge::cudn ...
coda安装
coda安装coda官网:https://docs.anaconda.com/miniconda/install/
安装个minicoda,其余组件需要的话另外安装
安装时候有个选项是否添加环境变量,这里选择不添加
还有一项是是否将coda安装的python定位默认版本好像,这一项选中
安装完后配置环境变量
E:\ANACONDAE:\ANACONDA\ScriptsE:\ANACONDA\Library\mingw-w64\binE:\ANACONDA\Library\bin
配置完后查看版本确定是否安装配置成功
conda --versionconda infopython
偶剋!
偶剋!小程序是干完了,感觉uniapp也就那样
可能是功能太简单了,不过暂时不想深入小程序了
接下来想玩玩ai吧
小程序开发学习笔记
小程序开发笔记今天开始接触了小程序开发,直接上手做有点费劲,找个项目学着先做一遍吧….
**笔记中的项目内容部分来自b站up主咸虾米_分享的vue3+uniapp学习内容 **
记录下一些基础内容,不熟练容易忘
pages目录下放小程序页面内容
static静态文件
pages.json配置页面路由、导航栏、tabBar等页面类信息
在pages.json中,pages是页面路由及窗口表现,globalStyle是默认(全局)窗口表现,tabBar是下面的tab栏,至少要两个才会展示
manifest.json配置appid、应用名、logo、版本等打包信息
在manifest.json里面配置了appid后,微信开发工具的预览模式才能使用
swiper轮播图的使用,自动轮播,无缝衔接,点击查看预览
<template> <swiper class="banner" indicator-dots :autoplay="false" circular> <swiper-item v-for="item ...
