当前为CodeVoy的博客内容。查看全部
  • zxyang3636
    Astro + Ech0 实现 朋友圈动态 功能
  • zxyang36361
    Java优雅的操作大模型对话
  • zxyang3636
    短信登录 基于Session实现登录的流程 发送验证码: 用户在提交手机号后,会校验手机号是否合法,如果不合法,则要求用户重新输入手机号。 如果手机号合法,后台此时生成对应的验证码,同时将验证码进行保存,然后再通过短信的方式将验证码发送给用户 短信验证码登录、注册: ​ 用户将验证码和手机号进行输入,后台从session中拿到当前验证码,然后和用户输入的验证码进行校验,如果不一致,则无法通过校验,如果一致,则后台根据手机号查询用户,如果用户不存在,则为用户创建账号信息,保存到数据库,无论是否存在,都会将用户信息保存到session中,方便后续获得当前登录信息 校验登录状态: 用户在请求时候,会从cookie中携带JsessionId到后台,后台通过JsessionId从session中拿到用户信息,如果没有session信息,则进行拦截,如果有session信息,则将用户信息保存到threadLocal中,并且放行。 发送验证码 @Service @Slf4j public class UserInfoServiceImpl extends ServiceImpl<UserInf…
  • zxyang3636
    初识Redis Redis是一种键值型的NoSQL数据库,这里有两个关键字 键值型 NoSQL 其中键值型是指Redis中存储的数据都是以Key-Value键值对的形式存储,而Value的形式多种多样,可以使字符串、数值甚至Json 而NoSQL则是相对于传统关系型数据库而言,有很大差异的一种数据库 认识NoSQL NoSql可以翻译做Not Only Sql(不仅仅是SQL),或者是No Sql(非Sql的)数据库。是相对于传统关系型数据库而言,有很大差异的一种特殊的数据库,因此也称之为非关系型数据库。 结构化与非结构化 传统关系型数据库是结构化数据,每张表在创建的时候都有严格的约束信息,如字段名、字段数据类型、字段约束等,插入的数据必须遵循这些约束 而NoSQL则对数据库格式没有约束,可以是键值型,也可以是文档型,甚至是图格式 关联与非关联 传统数据库的表与表之间往往存在关联,例如外键约束 而非关系型数据库不存在关联关系,要维护关系要么靠代码中的业务逻辑,要么靠数据之间的耦合 { id: 1, name: "张三", orders: [ { id: 1, item: { id: 1…
  • zxyang3636
    我们在讲解数据库事务时,讲过两种日志:重做日志、回滚日志。 对于线上数据库应用系统,突然遭遇数据库宕机怎么办?在这种情况下,定位宕机的原因就非常关键。我们可以查看数据库的错误日志。因为日志中记录了数据库运行中的诊断信息,包括了错误、警告和注释等信息。比如:从日志中发现某个连接中的 SQL 操作发生了死循环,导致内存不足,被系统强行终止了。明确了原因,处理起来也就轻松了,系统很快就恢复了运行。 除了发现错误,日志在数据复制、数据恢复、操作审计,以及确保数据的永久性和一致性等方面,都有着不可替代的作用。 千万不要小看日志。很多看似奇怪的问题,答案往往就藏在日志里。很多情况下,只有通过查看日志才能发现问题的原因,真正解决问题。所以,一定要学会查看日志,养成检查日志的习惯,对提升你的数据库应用开发能力至关重要。 MySQL8.0 官网日志地址:https://dev.mysql.com/doc/refman/8.0/en/server-logs.html MySQL支持的日志 日志类型 MySQL有不同类型的日志文件,用来存储不同类型的日志,分为 二进制日志 、 错误日志 、 通用查询日志 和…
  • zxyang3636
    在任何数据库环境中,总会有不确定的意外情况发生,比如例外的停电、计算机系统中的各种软硬件故障、人为破坏、管理员误操作等是不可避免的,这些情况可能会导致数据的丢失、服务器瘫痪等严重的后果。存在多个服务器时,会出现主从服务器之间的数据同步问题。 为了有效防止数据丢失,并将损失降到最低,应定期对MySQL数据库服务器做备份。如果数据库中的数据丢失或者出现错误,可以使用备份的数据进行恢复。主从服务器之间的数据同步问题可以通过复制功能实现。 物理备份与逻辑备份 物理备份: 备份数据文件,转储数据库物理文件到某一目录。物理备份恢复速度比较快,但占用空间比较大,MySQL中可以用 xtrabackup 工具来进行物理备份。 逻辑备份: 对数据库对象利用工具进行导出工作,汇总入备份文件内。逻辑备份恢复速度慢,但占用空间小,更灵活。MySQL 中常用的逻辑备份工具为 mysqldump 。逻辑备份就是 备份sql语句 ,在恢复的 时候执行备份的sql语句实现数据库数据的重现。 mysqldump实现逻辑备份 mysqldump是MySQL提供的一个非常有用的数据库备份工具。 备份一个数据库 mysqld…
  • zxyang3636
    主从复制概述 如何提升数据库并发能力 在实际工作中,我们常常将 Redis 作为缓存与 MySQL 配合来使用,当有请求的时候,首先会从缓存中进行查找,如果存在就直接取出。如果不存在再访问数据库,这样就提升了读取的效率,也减少了对后端数据库的访问压力。Redis 的缓存架构是高并发架构中非常重要的一环。 此外,一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是采用数据库集群的方案,做主从架构、进行读写分离,这样同样可以提升数据库的并发处理能力。但并不是所有的应用都需要对数据库进行主从架构的设置,毕竟设置架构本身是有成本的。 如果我们的目的在于提升数据库高并发访问的效率,那么首先考虑的是如何优化SQL和索引,这种方式简单有效;其次才是采用缓存的策略,比如使用Redis将热点数据保存在内存数据库中,提升读取的效率;最后才是对数据库采用主从架构,进行读写分离。 按照上面的方式进行优化,使用和维护的成本是由低到高的。 主从复制的作用 主从同步设计不仅可以提高数据库的吞吐量,还有以下3个方面的作用。 第1个作用:读写分离。我们可以通过主从复制的方式来同步数据…
  • zxyang3636
    什么是 Electron Electron 是⼀个 跨平台 的 桌⾯应⽤ 开发框架,开发者可以使⽤:HTML、CSS、JavaScript 等 Web 技术来构建桌⾯应⽤程序, 它的本质是结合了 Chromium 和 Node.js,现在⼴泛⽤于桌⾯应 ⽤程序开发,例如这写桌⾯应⽤都⽤到了 Electron 技术: 一款应用广泛的跨平台的桌面应用开发框架。 Electron 的本质是结合了 Chromium 与 Node.js 使用 HTML、CSS、JS 等 Web 技术构建桌面应用程序。 Electron = Chromium + Node.js + Native API(Electron 原生的 API) :::tip CS架构的软件有个优点:它是存在我们电脑包里面的,你的电脑不被木马黑掉,那么这个软件就是没有问题的,网页的话各种接口、数据、图片我们都是可以看到的; 但是CS架构软件我们可以抓包,我们也可以进行防止抓包,CS软件要比BS更加安全 总的来说就是,速度快,安全(vscode就是electron开发的) ::: 常见的桌面GUI 名称 语音 优点 缺点 QT C++ 跨…
  • zxyang3636
    个人整理和日常使用的工具、网站和软件清单。希望能帮助你发现新的生产力工具,提升效率! 终端与服务器、数据库管理工具 工具名称 核心功能 访问/下载 WindTerm 全平台 SSH 客户端,支持高速上传、命令记忆。 🔗 官网 Termora 全新高颜值SSH客户端 🔗 官网 Tiny RDM 一个更现代化的Redis桌面管理客户端 🔗 官网 RedisDesktopManager Redis可视化管理工具 🔗 官网 DataGrip 最全数据库开发必备神器 🔗 官网 HexHub HexHub 为程序员和运维人员量身打造(数据库,服务器,docker) 🔗 官网 开发相关 工具名称 核心功能 访问/下载 json editor online 在线json格式化 支持超复杂json 🔗 官网 IT-TOOLS 助力开发人员和 IT 工作者 🔗 官网 加速服务 docker/github加速 🔗 官网 DockerHub 国内镜像源 加速列表 🔗 官网 Lorem Picsum 随机图片,可设置大小 🔗 官网 免费图床 图床工具 🔗 官网 nginx配置工具 在线n…
  • zxyang3636
    索引的数据结构 为什么使用索引 索引是存储引擎用于快速找到数据记录的一种数据结构,就好比一本教科书的目录部分,通过目录中找到对应文章的页码,便可快速定位到需要的文章。MySQL中也是一样的道理,进行数据查找时,首先查看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合则需要全表扫描,即需要一条一条地查找记录,直到找到与条件符合的记录。 如上图所示,数据库没有索引的情况下,数据分布在硬盘不同的位置上面,读取数据时,摆臂需要前后摆动查询数据,这样操作非常消耗时间。如果数据顺序摆放,那么也需要从1到6行按顺序读取,这样就相当于进行了6次IO操作,依旧非常耗时。如果我们不借助任何索引结构帮助我们快速定位数据的话,我们查找 Col 2 = 89 这条记录,就要逐行去查找、去比较。从Col 2 = 34 开始,进行比较,发现不是,继续下一行。我们当前的表只有不到10行数据,但如果表很大的话,有上千万条数据,就意味着要做很多很多次硬盘I/0才能找到。现在要查找 Col 2 = 89 这条记录。CPU必须先去磁盘查找这条记录,找到之后加载到内存,再对数据进行处理。这个过程最耗时间就是磁盘…
  • zxyang3636
    上一章讲解的 Monitor 主要关注的是访问共享变量时,保证临界区代码的【原子性】 这一章我们进一步深入学习共享变量在多线程间的【可见性】问题与多条指令执行时的【有序性】问题 :::info volatile可以解决 可见性 和 有序性 问题,但不能处理原子性问题 synchronized 则对于原子性,有序性,可见性, 都可以解决 ::: Java 内存模型 JMM 即 Java Memory Model,它定义了主存、工作内存抽象概念,底层对应着 CPU 寄存器、CPU缓存、硬件内存、CPU 指令优化等。 JMM 体现在以下几个方面 原子性 - 保证指令不会受到线程上下文切换的影响 可见性 - 保证指令不会受 cpu 缓存的影响 有序性 - 保证指令不会受 cpu 指令并行优化的影响 可见性 退不出的循环 static boolean run = true; public static void main(String[] args) throws InterruptedException { Thread t = new Thread(()->{ while(run){ …
  • zxyang3636
    本章内容 共享资源问题 多线程并发访问共享资源时可能存在的问题 synchronized 解决多线程并发访问的问题 线程安全分析 知道怎么样的代码编写是线程安全的,怎样的代码编写是存在线程安全隐患的 Monitor 从源码的角度讲解管程的底层实现 wait/notify 线程状态转换 线程六种状态如何转换 活跃性 死锁、活锁、饥饿 ReentrantLock 共享资源问题 Java体现 问:两个线程对初始值为 0 的静态变量一个做自增,一个做自减,各做 5000 次,结果是 0 吗? @Slf4j(topic = "c.Test17") public class Test17 { static int counter = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i < 5000; i++) { counter++; } }, "t1"); Thread t2 = new Thre…
  • zxyang3636
    进程与线程 进程 程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘 、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的 当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。 进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等) 进程可以理解为程序的执行过程,是动态的! 线程 一个进程之内可以分为一到多个线程。 一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU 执行 Java 中,线程是最小的调度单位,进程作为资源分配的最小单位。 在 Windows 中进程是不活动的,只是作为线程的容器 对比 进程基本上相互独立,而线程存在于进程内,是进程的一个子集 进程拥有共享的资源,如内存空间等,供其内部的线程共享 进程间通信较为复杂 同一台计算机的进程通信称为 IPC (Inter-process communication) 不同计算机之间的进程通信,需要通…
  • zxyang3636
    什么是MVCC MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC 是通过数据行的多个版本管理来实现数据库的 并发控制 。这项技术使得在InnoDB的事务隔离级别下执行 一致性读 操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样 在做查询的时候就不用等待另一个事务释放锁。 MVCC没有正式的标准,在不同的DBMS中MVCC的实现方式可能是不同的,也不是普遍使用的(大家可以参考相关的DBMS文档)。这里讲解InnoDB中MVCC的实现机制(MySQL其他的存储引擎并不支持它)。 快照读与当前读 快照读 快照读又叫一致性读,读取的是快照数据。不加锁的简单的 SELECT 都属于快照读,即不加锁的非阻塞 读;比如这样: SELECT * FROM player WHERE ... 之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于MVCC,它在很多情况下, 避免了加锁操作,降低了开销。 既然是基于多版本,那么快照读可能读到的并不一定是数据的最新版本,而有可能是…
  • zxyang3636
    MySQL - 锁 概述 事务的隔离性由这章讲述的锁来实现。 锁是计算机协调多个进程或线程并发访问某一共享资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性。在开发过程中加锁是为了保证数据的一致性,这个思想在数据库领域中同样很重要。 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的 资源。为保证数据的一致性,需要对 并发操作进行控制 ,因此产生了 锁 。同时 锁机制 也为实现MySQL 的各个隔离级别提供了保证。 锁冲突 也是影响数据库 并发访问性能 的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。 MySQL并发事务访问相同记录 并发事务访问相同记录的情况大致可以划分为3种: 读-读情况 读-读情况,即并发事务相继读取相同的记录。读取操作本身不会对记录有任何影响,并不会引起什么问题,所以允许这种情况的发生。 写-写情况 写-写 情况,即并发事务相继对相同的记录做出改动…
  • zxyang3636
    事务 简介 事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 默认MySQL的事务是自动提交的,也就是说,当执行一条DML(增删改)语句,MySQL会立即隐式的提交事务,这意味着如果有一条DML语句执行失败,整个事务会被回滚。 查看/设置事务提交方式 -- 1自动提交 0手动提交 select @@autocommit; SET @@autocommit = 0; -- 提交事务 COMMIT; -- 回滚事务 ROLLBACK; 开启事务 START TRANSACTION; BEGIN; 四大特性 原子性(Atomicity): 事务是不可分割的最小操作单元,要么全部成功,要么全部失败。 一致性(Consistency): 事务完成时,数据库从一个一致的状态转变为另一个一致的状态。这意味着事务 在执行前后,不能破坏数据库数据的完整性和一致性,必须使所有的数据都保持一致状态。 隔离性(solation): 数据库系统提供的隔离机制,多个事务可以同时在数据库中执行,但它们之间应该是相互…
  • zxyang3636
    Vue3 快速上手 Vue3 简介 2020 年 9 月 18 日,Vue.js发布版3.0版本,代号:One Piece(n 经历了:4800+次提交、40+个 RFC、600+次 PR、300+贡献者 官方发版地址:Release v3.0.0 One Piece · vuejs/core 截止 2023 年 10 月,最新的公开版本为:3.3.4 性能的提升 打包大小减少41%。 初次渲染快55%, 更新渲染快133%。 内存减少54%。 新的特性 Composition API(组合API): setup ref与reactive computed与watch ...... 创建 Vue3 工程 基于 vue-cli 创建 点击查看官方文档 备注:目前vue-cli已处于维护模式,官方推荐基于 Vite 创建项目。 ## 查看@vue/cli版本,确保@vue/cli版本在4.5.0以上 vue --version ## 安装或者升级你的@vue/cli npm install -g @vue/cli ## 执行创建命令 vue create vue_test ## 随后选择3…
  • zxyang3636
    Vue3工程化 项目初始化 D:\workspace\vscode\vue_admin_template>pnpm create vite .../19788950c58-c70 | +1 + .../19788950c58-c70 | Progress: resolved 1, reused 0, downloaded 1, added 1, done | o Project name: | project | o Select a framework: | Vue | o Select a variant: | TypeScript | o Scaffolding project in D:\workspace\vscode\vue_admin_template\project... | — Done. Now run: cd project pnpm install pnpm run dev D:\workspace\vscode\vue_admin_template>cd project D:\workspace\vscode\vue_admin_template\…
  • zxyang3636
    Elasticsearch MySql存在的问题: 查询效率较低 由于数据库模糊查询不走索引,在数据量较大的时候,查询性能很差。 数据库模糊查询随着表数据量的增多,查询性能的下降会非常明显,而搜索引擎的性能则不会随着数据增多而下降太多。目前仅10万不到的数据量差距就如此明显,如果数据量达到百万、千万、甚至上亿级别,这个性能差距会非常夸张。 功能单一 数据库的模糊搜索功能单一,匹配条件非常苛刻,必须恰好包含用户搜索的关键字。而在搜索引擎中,用户输入出现个别错字,或者用拼音搜索、同义词搜索都能正确匹配到数据。 综上,在面临海量数据的搜索,或者有一些复杂搜索需求的时候,推荐使用专门的搜索引擎来实现搜索功能。 目前全球的搜索引擎技术排名如下: 认识ES Lucene是一个Java语言的搜索引擎类库,是Apache公司的顶级项目,由DougCutting于1999年研发。官网地址:https://lucene.apache.org/ 。 Lucene的优势: 易扩展 高性能(基于倒排索引) 2004年Shay Banon基于Lucene开发了Compass 2010年Shay Banon 重写了…
  • zxyang3636
    Docker 安装docker 卸载旧版 yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine \ docker-selinux 配置Docker的yum库 首先要安装一个yum工具 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 安装成功后,执行命令,配置Docker的yum源 sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.re…