redis
什么是redis
Redis 是一种基于内存的数据库,对数据的读写操作都是在内存中完成,因此读写速度非常快,常用于缓存,消息队列、分布式锁等场景。
Redis 提供了多种数据类型来支持不同的业务场景,比如 String (字符串)、Hash (哈希)、 List (列表)、Set (集合)、Zset (有序集合)、Bitmaps(位图)、HyperLogLog(基数统计)、GEO(地理信息)、Stream(流),并且对数据类型的操作都是原子性的,因为执行命令由单线程负责的,不存在并发竞争的问题。
除此之外,Redis 还支持事务 、持久化、Lua 脚本、多种集群方案(主从复制模式、哨兵模式、切片机群模式)、发布 / 订阅模式,内存淘汰机制、过期删除机制等等。
Redis和Memcached有什么区别
共同点
都是基于内存的数据库,一般都用来当作缓存使用
都有过期策略
两者的性能都非常高
区别
Redis 支持的数据类型更丰富(String、Hash、List、Set、ZSet),而 Memcached 只支持最简单的 key-value 数据类型;
Redis 支持数据的持久 ...
mysql
MySQL基础架构
相关问题:一个SQL语句在MySQL的执行流程。
查询语句
12select * from tb_student A where A.age='18' and A.name=' 张三 ';
先检查该语句是否有权限,如果没有权限,直接返回错误信息,如果有权限,在 MySQL8.0 版本以前,会先查询缓存,以这条 SQL 语句为 key 在内存中查询是否有结果
通过分析器进行词法分析,提取 SQL 语句的关键元素。比如提取上面这个语句是查询select,表名为tb_student,需要查询所有的列……然后判断这个 SQL 语句是否有语法错误,比如关键词是否正确等等,如果检查没问题就执行下一步。
然后就是优化器进行确定执行方案。优化器根据自己的优化算法进行选择执行效率最好的一个方案,确认了执行计划后就准备开始执行了。
先查询姓名为张三的学生,然后判断年龄是否是18
先查询年龄18的学生,然后判断姓名是否是张三
进行权限校验,如果没有权限就会返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果。
更新 ...
操作系统
什么是操作系统
操作系统是管理计算机硬件与软件资源的程序,是计算机的基石
操作系统本质上是一个运行在计算机上的软件程序,用于管理计算机硬件和软件资源
操作系统存在屏蔽了硬件层的复杂性。操作系统就像是硬件使用的负责人,统筹着各种相关事项。
操作系统的内核「Kernal」是操作系统的核心部分,它负责系统的内存管理,硬件设备的管理,文件系统的管理以及应用程序的管理。内核是连接应用程序和硬件的桥梁,决定着系统的性能和稳定性。
介绍一下系统调用
根据进程访问资源的特点,我们可以把进程在系统上的运行分为两个级别:
用户态:用户态运行的进程可以直接读取用户程序的数据
系统态:几乎可以不受限制地访问计算机的任何资源
我们运行的程序基本都是运行在用户态,如果调用系统态级别的功能就需要系统调用。也就是说,凡是与系统态级别的资源有关的操作(如文件管理、进程控制、内存管理等),都必须通过系统调用方式向操作系统提出服务请求,并由操作系统代为完成。
按功能可大致分为如下几类:
设备管理。完成设备的请求或释放,以及设备启动等功能。
文件管理。完成文件的读、写、创建及删除等功能。
进程控制。完成进程的创 ...
计算机网络
OSI和TCP/IP网络分层模型
OSI 七层模型是什么?每一层的作用是什么?
TCP/IP 四层模型是什么?每一层的作用是什么?
为什么网络要分层?
详细答案:OSI和TCP/IP网络分层模型详解
OSI七层模型
应用层:为计算机用户提供服务
表示层:数据处理(编解码、加密解密、压缩解压缩)
会话层:管理(建立、维护、重连)应用程序之间的会话
传输层:为两台主机进程之间的通信提供通用的数据传输服务
网络层:路由和寻址(决定数据在网络的游走路径)
数据链路层:帧编码和误差纠正控制
物理层:透明地传送比特流传输
TCP/IP四层模型
应用层:应用层位于传输层之上,主要提供两个终端设备上的应用程序之间信息交换的服务,它定义了信息交换的格式,消息会交给下一层传输层来传输。 我们把应用层交互的数据单元称为报文。
传输层:传输层的主要任务就是负责向两台终端设备进程之间的通信提供通用的数据传输服务。 应用进程利用该服务传送应用层报文。“通用的” 是指并不针对某一个特定的网络应用,而是多种应用可以使用同一个运输层服务。
网络层:网络层负责为分组交换网上的不同主机提供通信服务。 在发送 ...
链表
找出两个链表的交点
链接
设A的长度为a+c,B的长度为b+c,其中c为公共部分长度。
可以推出以下公式:
a+c+b=b+c+aa + c + b =b+c+aa+c+b=b+c+a
当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 B;同样地,当访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。
若存在交点,直接通过if语句可以判断出来
若不存在交点,则两个链表尾节点同时为null,也可退出循环
1234567891011public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode a = headA; ListNode b = headB; while (a != b) { a = (a == null) ? headB : a.next; b = (b == ...
项目上线
思维导图
云服务器
选的阿里云,系统是ubentu20.04,ecs和轻量级服务器都无所谓。
配置mysql
sudo apt-get update
安装mysql sudo apt-get install mysql-server
启动 sudo service mysql. start
登录 sudo mysql -u root
设置root用户的密码 ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'yourpasswd';
创建数据库
然后利用IDEA或者别的数据库管理软件,将本地数据库项目的SQL脚本(DDL)复制到剪贴板。在服务器上直接输命令或者创建脚本然后运行脚本,就能复制本地数据库到云端上去了。
安装oracle-19(巨坑)
可以参考这篇博客
前往官网下载jdk
本地下好后scp到服务器上
服务器上用wget命令下载
解压缩到指定目录。以我为例是/usr/lib/jvm。然后输入命令 sudo tar -zxvf xxxx.tar.gz -C /us ...
微服务实现代码执行
写在前面
今天算是阳康了,没精力整那个思维导图,凑合一下水水。
另外这篇文章也是网上抄的。
这次是实现贪吃蛇的自动化操作。具体原理就是把用户前端输入的代码存储到后端,经过一系列的通信走到一个微服务里,该微服务的功能就是编译并执行这段代码然后将值返回。再经过一系列的通信返回到前端。
有一大堆在配置和项目重构的准备也懒得搞了。
目前只能使用Java代码。
对于 Bot 的服务,整体处理在 BotRunningSystem 中。在 BotRunningSystem 中有一个单独的线程 Botpool,这个线程会不断的执行代码,每次执行一次代码就去把执行的结果 (移动的过程) 返回给处理移动的 nextstep,如果在等待时间之内 nextstep 函数没有能够接收到处理的指令,那么游戏就结束,如果两名 Bot 的下一步操作都有获取到,那么就进入到 Judge 来判断合法性,直到结束
在这里面用到了一个依赖,依赖为 joor 用它来接收一段代码,将代码插入到队列当中,每次从队列里取出代码运行,运行结束后将代码返还给用户
消费者线程
消费者线程中需要处理 Bot 的代码,因此要求有任务立即执 ...
微服务实现匹配功能
思维导图
更改项目结构
查看该历史版本
实现匹配池类
进入matchingsystem这个子项目里面。
在service/impl/utils/新建玩家类,因为匹配系统匹配的是玩家,需要这个辅助类。
123456789101112import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@AllArgsConstructor@NoArgsConstructorpublic class Player { private Integer userId; private Integer rating; private Integer waitingTime;}
匹配池:匹配分数最接近的玩家,根据匹配时间增长,匹配范围逐渐增大。
操作:包括添加玩家,删除玩家,匹配玩家,发送给后端匹配成功的结果。
策略:为了防止匹配时间过长,优先将先匹配的玩家优先匹配,防止用户流失。
在matchingsystem/service/impl/u ...
实现联机对战
思维导图
同步玩家
后端
在backend/consumer/utils下定义玩家类,存储玩家信息。
12345678910111213141516import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.List;@Data@AllArgsConstructor@NoArgsConstructorpublic class Player { private Integer id; private Integer sx; private Integer sy; // 蛇每个球的方向 private List<Integer> steps; }
在游戏类中导入玩家。
123456789101112131415161718private final Player playerA, playerB; public Game(Integer rows, Integer co ...
实现更改头像页面
思维导图
写在前面
这个模块的功能不是网课里的内容,全部都是我自己实现的。前端的界面参考了之前的web大作业和机器人界面的代码,后端都是一些很基础的东西。
后端编写更改图像API
新建service/user/account/GetphotoService接口
1234567package com.example.backend.service.user.account;import java.util.Map;public interface GetphotoService { public Map<String, String> getPhoto(Map<String, String> data);}
在service/impl/user/account/GetphotoImpl中实现该接口
123456789101112131415161718192021222324252627282930313233343536373839package com.example.backend.service.impl.user.acc ...