高并发项目-用户登录基本功能
文章目录
- 1.数据库表设计
- 1.IDEA连接数据库
- 2.修改application.yml中数据库的名称为seckill
- 3.IDEA创建数据库seckill
- 4.创建数据表 seckill_user
- 5.密码加密分析
- 1.传统方式(不安全)
- 2.改进方式(两次加密加盐)
- 2.密码加密功能实现
- 1.pom.xml添加md5加密的依赖,刷新maven
- 2.编写工具类MD5Util.java,完成加密
- 3.测试
- 1.引入jupiter 5.7.2依赖
- 2.测试方法
- 3.编写实体类映射表
- 1.创建pojo目录
- 2.User.java
- 4.创建Mapper接口和Mapper.xml
- 1.创建UserMapper.java
- 2.创建UserMapper.xml
- 5.响应信息类
- 1.创建vo目录
- 2.RespBeanEnum.java 响应信息枚举类
- 3.RespBean.java 响应信息的Bean
- 6.编写接受登录信息的vo以及手机号校验工具类
- 1.LoginVo.java
- 2.ValidatorUtil.java
- 7.编写service层
- 1.UserService.java
- 2.UserServiceImpl.java
- 8.编写controller层
- 1.引入校验的依赖
- 2.LoginController.java
- 3.引入静态资源和模板页
- 4.解析前端登录
- 1.点击登录,调用login
- 2.将密码加密加盐之后向后端 /login/doLogin 发送请求
- 5.测试访问首页
- 1.首先检查资源是否到了target目录,如果没到需要maven重新编译
- 2.测试访问 http://localhost:9092/seckill/login/toLogin
- 6.前端区分多环境
- 1.可以看到前端请求时使用的`/`其实只是本机的服务发现,也就是http://localhost:9092/,所以需要区分多环境
- 2.首先新增一个配置类 GlobalControllerAdvice.java 全局控制器通知,用于向前端传递全局变量
- 3.在application.yml和application-prod.yml编写baseUrl,区分多环境
- 4.login.html 读取baseUrl
- 1.在script标签内添加一行代码使其能够解析Thymeleaf
- 2.修改请求,格式为 baseUrl + 资源路径
- 7.在数据库添加一条记录,可以模拟用户登录
- 1.假设密码是admin,在前端输出一下第一次加密加盐的结果
- 2.使用后端的工具类也来加密一下,比对结果,发现结果一致
- 3.在第二次加密的时候重新设置一个不同的盐为niubi666,模拟不同用户
- 4.将结果放到数据库中
- 5.此时的用户名和密码
- 8.编写登录的controller并测试
- 1.LoginController.java
- 2.测试,登录成功
1.数据库表设计
1.IDEA连接数据库
2.修改application.yml中数据库的名称为seckill
3.IDEA创建数据库seckill
4.创建数据表 seckill_user
DROP TABLE IF EXISTS `seckill_user`;
CREATE TABLE `seckill_user`
(`id` BIGINT(20) NOT NULL COMMENT '用户 ID, 设为主键, 唯一 手机号',`nickname` VARCHAR(255) NOT NULL DEFAULT '',`password` VARCHAR(32) NOT NULL DEFAULT '' COMMENT 'MD5(MD5(pass 明文+固定salt)+salt)',`slat` VARCHAR(10) NOT NULL DEFAULT '',`head` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '头像',`register_date` DATETIME DEFAULT NULL COMMENT '注册时间',`last_login_date` DATETIME DEFAULT NULL COMMENT '最后一次登录时间',`login_count` INT(11) DEFAULT '0' COMMENT '登录次数',PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
select * from seckill_user;
5.密码加密分析
1.传统方式(不安全)
2.改进方式(两次加密加盐)
2.密码加密功能实现
1.pom.xml添加md5加密的依赖,刷新maven
<!--md5 依赖--><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.15</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.11</version></dependency>
2.编写工具类MD5Util.java,完成加密
package com.sxs.seckill.utils;import org.apache.commons.codec.digest.DigestUtils;/*** Description: MD5加密工具类** @Author sun* @Create 2024/5/5 14:23* @Version 1.0*/
public class MD5Util {/*** 将一个字符串转换为MD5* @param src* @return*/public static String md5(String src) {return DigestUtils.md5Hex(src);}// 固定的saltpublic static final String SALT = "dgeb2g4t";// 第一次加密加盐public static String inputPassToMidPass(String inputPass) {// 加盐String str = SALT.charAt(0) + inputPass + SALT.charAt(6);return md5(str);}/*** 第二次加密加盐* @param midPass* @param salt* @return*/public static String midPassToDBPass(String midPass, String salt) {String str = salt.charAt(0) + midPass + salt.charAt(5);return md5(str);}/*** 两次加密* @param input* @param saltDB* @return*/public static String inputPassToDBPass(String input, String saltDB) {String midPass = inputPassToMidPass(input);String dbPass = midPassToDBPass(midPass, saltDB);return dbPass;}
}
3.测试
1.引入jupiter 5.7.2依赖
<!-- jupiter测试 --><dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.7.2</version><scope>compile</scope></dependency>
2.测试方法
package com.sxs.seckill.utils;/*** Description: 测试MD5加密方法** @Author sun* @Create 2024/5/5 14:47* @Version 1.0*/
public class MD5UtilTest {public static void main(String[] args) {String input = "123456";System.out.println("第一次加密:" + MD5Util.inputPassToMidPass(input));System.out.println("第二次加密:" + MD5Util.midPassToDBPass(MD5Util.inputPassToMidPass(input), MD5Util.SALT));System.out.println("两次加密:" + MD5Util.inputPassToDBPass(input, MD5Util.SALT));}
}
3.编写实体类映射表
1.创建pojo目录
2.User.java
package com.sxs.seckill.pojo;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.io.Serializable;
import java.util.Date;/*** Description:** @Author sun* @Create 2024/5/5 14:59* @Version 1.0*/
@Data
@TableName("seckill_user") // 指定表名
public class User implements Serializable { // 实现序列化接口private static final long serialVersionUID = 1L;/*** 用户 ID是手机号码*/@TableId(value = "id", type = IdType.ASSIGN_ID) // 指定主键,IdType.ASSIGN_ID表示自己指定ID,不自增private Long id;private String nickname;/*** MD5(MD5(pass 明文+固定 salt)+salt)*/private String password;private String slat;/*** 头像*/private String head;/*** 注册时间*/private Date registerDate;/*** 最后一次登录时间*/private Date lastLoginDate;/*** 登录次数*/private Integer loginCount;
}
4.创建Mapper接口和Mapper.xml
1.创建UserMapper.java
package com.sxs.seckill.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.sxs.seckill.pojo.User;/*** Description:** @Author sun* @Create 2024/5/5 15:04* @Version 1.0*/
public interface UserMapper extends BaseMapper<User> {
}
2.创建UserMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.sxs.seckill.mapper.UserMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="com.sxs.seckill.pojo.User"><id column="id" property="id"/><result column="nickname" property="nickname"/><result column="password" property="password"/><result column="slat" property="slat"/><result column="head" property="head"/><result column="register_date" property="registerDate"/><result column="last_login_date" property="lastLoginDate"/><result column="login_count" property="loginCount"/></resultMap>
</mapper>
5.响应信息类
1.创建vo目录
2.RespBeanEnum.java 响应信息枚举类
package com.sxs.seckill.vo;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.ToString;/*** Description: 响应枚举类** @Author sun* @Create 2024/5/5 15:15* @Version 1.0*/@Getter
@AllArgsConstructor
@ToString
public enum RespBeanEnum {// 通用SUCCESS(200, "SUCCESS"),ERROR(500, "服务端异常"),//登录模块LOGIN_ERROR(500210, "用户名或者密码错误"),MOBILE_ERROR(500211, "手机号码格式不正确"), BING_ERROR(500212, "参数绑定异常"), MOBILE_NOT_EXIST(500213, "手机号码不存在"), PASSWORD_UPDATE_FAIL(500214, "更新密码失败");// 响应码和响应信息private final Integer code;private final String message;}
3.RespBean.java 响应信息的Bean
package com.sxs.seckill.vo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** Description:** @Author sun* @Create 2024/5/5 15:32* @Version 1.0*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RespBean {private long code;private String message;private Object obj;// 成功后public static RespBean success(Object obj) {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), obj);}public static RespBean success() {return new RespBean(RespBeanEnum.SUCCESS.getCode(), RespBeanEnum.SUCCESS.getMessage(), null);}// 失败各有不同public static RespBean error(RespBeanEnum respBeanEnum) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), null);}public static RespBean error(RespBeanEnum respBeanEnum, Object obj) {return new RespBean(respBeanEnum.getCode(), respBeanEnum.getMessage(), obj);}
}
6.编写接受登录信息的vo以及手机号校验工具类
1.LoginVo.java
package com.sxs.seckill.vo;/*** Description: 登录实体类** @Author sun* @Create 2024/5/5 15:43* @Version 1.0*/
public class LoginVo {private String mobile;private String password;
}
2.ValidatorUtil.java
package com.sxs.seckill.utils;import org.junit.jupiter.api.Test;/*** Description: 校验工具类** @Author sun* @Create 2024/5/5 15:45* @Version 1.0*/
public class ValidatorUtil {/*** 校验手机号是否有效* @param phoneNumber 手机号* @return 如果手机号有效返回 true,否则返回 false*/public static boolean isMobile(String phoneNumber) {// 中国大陆的手机号码正则表达式,要求是11位数字,以1开头,第二位是3-9,后面是任意数字共11位String regex = "^1[3-9]\\d{9}$";return phoneNumber.matches(regex);}// 测试@Testpublic void t1() {System.out.println(isMobile("12345678901"));System.out.println(isMobile("1234567890"));// 正确的System.out.println(isMobile("13604969873"));}
}
7.编写service层
1.UserService.java
package com.sxs.seckill.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.sxs.seckill.pojo.User;
import com.sxs.seckill.vo.LoginVo;
import com.sxs.seckill.vo.RespBean;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Description:** @Author sun* @Create 2024/5/5 15:58* @Version 1.0*/
public interface UserService extends IService<User> {/*** 用户登录校验* @param loginVo* @param request* @param response* @return*/RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response);
}
2.UserServiceImpl.java
package com.sxs.seckill.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sxs.seckill.mapper.UserMapper;
import com.sxs.seckill.pojo.User;
import com.sxs.seckill.service.UserService;
import com.sxs.seckill.utils.MD5Util;
import com.sxs.seckill.utils.ValidatorUtil;
import com.sxs.seckill.vo.LoginVo;
import com.sxs.seckill.vo.RespBean;
import com.sxs.seckill.vo.RespBeanEnum;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** Description:** @Author sun* @Create 2024/5/5 15:59* @Version 1.0*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Resourceprivate UserMapper userMapper;@Overridepublic RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {// 获取用户输入的手机号和密码,此时的密码已经是midPassString mobile = loginVo.getMobile();String password = loginVo.getPassword();// 判断手机号和密码是否为空if (StringUtils.isBlank(mobile) || StringUtils.isBlank(password)) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}// 校验手机号是否正确if (!ValidatorUtil.isMobile(mobile)) {return RespBean.error(RespBeanEnum.MOBILE_ERROR);}// 根据手机号查询用户User user = userMapper.selectById(mobile);// 判断用户是否为空if (null == user) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}// 判断密码是否正确if (!MD5Util.midPassToDBPass(password, user.getSlat()).equals(user.getPassword())) {return RespBean.error(RespBeanEnum.LOGIN_ERROR);}// 返回成功return RespBean.success();}
}
8.编写controller层
1.引入校验的依赖
<!--validation 参数校验--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.4.5</version></dependency>
2.LoginController.java
package com.sxs.seckill.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** Description:** @Author sun* @Create 2024/5/5 16:41* @Version 1.0*/
@Slf4j
@Controller
@RequestMapping("/login")
public class LoginController {/*** 访问/login/toLogin会跳转到templates/login.html* @return*/@RequestMapping("/toLogin")public String toLogin() {return "login";}}
3.引入静态资源和模板页
4.解析前端登录
1.点击登录,调用login
2.将密码加密加盐之后向后端 /login/doLogin 发送请求
5.测试访问首页
1.首先检查资源是否到了target目录,如果没到需要maven重新编译
2.测试访问 http://localhost:9092/seckill/login/toLogin
6.前端区分多环境
1.可以看到前端请求时使用的/
其实只是本机的服务发现,也就是http://localhost:9092/,所以需要区分多环境
2.首先新增一个配置类 GlobalControllerAdvice.java 全局控制器通知,用于向前端传递全局变量
package com.sxs.seckill.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;/*** Description: 全局控制器通知,用于向前端传递全局变量** @Author sun* @Create 2024/5/5 17:08* @Version 1.0*/
@ControllerAdvice
public class GlobalControllerAdvice {// 从配置文件中读取baseUrl,从而使前端可以区分多环境@Value("${baseurl}")private String baseurl;@ModelAttribute("baseUrl")public String baseUrl() {// 这里可以根据环境变量或其他逻辑来动态确定 URLreturn baseurl;}
}
3.在application.yml和application-prod.yml编写baseUrl,区分多环境
4.login.html 读取baseUrl
1.在script标签内添加一行代码使其能够解析Thymeleaf
th:inline="javascript"
2.修改请求,格式为 baseUrl + 资源路径
7.在数据库添加一条记录,可以模拟用户登录
1.假设密码是admin,在前端输出一下第一次加密加盐的结果
2.使用后端的工具类也来加密一下,比对结果,发现结果一致
3.在第二次加密的时候重新设置一个不同的盐为niubi666,模拟不同用户
4.将结果放到数据库中
5.此时的用户名和密码
- 19588888888:195+八个八
- admin
8.编写登录的controller并测试
1.LoginController.java
@ResponseBody@RequestMapping("/doLogin")public RespBean doLogin(LoginVo loginVo, HttpServletRequest request, HttpServletResponse response) {RespBean respBean = userService.doLogin(loginVo, request, response);// 返回return respBean;}
2.测试,登录成功
相关文章:

高并发项目-用户登录基本功能
文章目录 1.数据库表设计1.IDEA连接数据库2.修改application.yml中数据库的名称为seckill3.IDEA创建数据库seckill4.创建数据表 seckill_user5.密码加密分析1.传统方式(不安全)2.改进方式(两次加密加盐) 2.密码加密功能实现1.pom.…...

kotlin基础之泛型和委托
Kotlin泛型的概念及使用 泛型概念 在Kotlin中,泛型(Generics)是一种允许在类、接口和方法中使用类型参数的技术。这些类型参数在实例化类、实现接口或调用方法时会被具体的类型所替代。泛型的主要目的是提高代码的复用性、类型安全性和可读…...

awtk踩坑记录二:移植jerryscript到awtk design项目
工作要求,想尝试看看在awtk-designer设计界面的同时能不能用javascript开发逻辑层,以此和前端技术联动,本文是一种项目建构的思路。 从github下载并编译awtk, awtk-mmvm和awtk-jerryscript(如果没有) 用awtk-designer…...

正邦科技(day2)
自动校准 问题:电量不准都可以直接去校准 校准方式:可程式变频电压 问题分析:他是通过软件去自动自动校准的,flash 清空的时候有缓存没有清空,或者互感器没有读取到问题 互感器:电流互感器的作用包括电流测…...

技术架构设计指南:从需求到实现
技术架构是软件系统的骨架,它决定了系统的性能、可靠性、扩展性等关键特性。本文将介绍技术架构设计的一般步骤和方法。 第一步:需求分析 在设计技术架构之前,首先要对系统需求进行全面深入的分析。这包括功能需求、非功能需求(如…...

【数据结构:排序算法】堆排序(图文详解)
🎁个人主页:我们的五年 🔍系列专栏:数据结构课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🍩1.大堆和小堆 🍩2.向上调整算法建堆和向下调整算法建堆:…...

git 派生仓库怎么同步主仓库的新分支
一、git 派生仓库怎么同步主仓库的新分支 要使你的Git派生仓库同步主仓库的新分支,请遵循以下步骤: 1、添加上游仓库(如果尚未添加): 如之前所述,确保上游仓库已经被添加到你的本地仓库。如果没有,使用命…...

对比方案:5款知识中台工具的优缺点详解
知识中台工具为企业和组织高效地组织、存储和分享知识,还能提升团队协作的效率。在选择搭建知识中台的工具时,了解工具的优缺点,有助于企业做出最佳决策。本文LookLook同学将对五款搭建知识中台的工具进行优缺点的简单介绍,帮助企…...

第16章-超声波跟随功能 基于STM32的三路超声波自动跟随小车 毕业设计 课程设计
第16章-超声波跟随功能 无PID跟随功能 //超声波跟随if(HC_SR04_Read() > 25){motorForward();//前进HAL_Delay(100);}if(HC_SR04_Read() < 20){motorBackward();//后退HAL_Delay(100);}PID跟随功能 在pid.c中定义一组PID参数 tPid pidFollow; //定距离跟随PIDpidFol…...

创新案例 | 持续增长,好孩子集团的全球化品牌矩阵战略与客户中心设计哲学
探索好孩子集团如何通过创新设计的全球化品牌矩阵和以客户为中心的产品策略,在竞争激烈的母婴市场中实现持续增长。深入了解其品牌价值观、市场定位策略以及如何满足新一代父母的需求。本文旨在为中高级职场人士、创业家及创新精英提供深度见解,帮助他们…...

ResNet 原理剖析以及代码复现
原理 ResNet 解决了什么问题? 一言以蔽之:解决了深度的神经网络难以训练的问题。 具体的说,理论上神经网络的深度越深,其训练效果应该越好,但实际上并非如此,层数越深会导致越差的结果并且容易产生梯度爆炸…...

数据结构(十)图
文章目录 图的简介图的定义图的结构图的分类无向图有向图带权图(Wighted Graph) 图的存储邻接矩阵(Adjacency Matrix)邻接表代码实现 图的遍历深度优先搜索(DFS,Depth Fisrt Search)遍历抖索过程…...

四数之和-力扣
本题在三数之和的基础上,再增加一重循环进行解答 首先注意的点是,一级剪枝处理,target > 0 && nums[i] > target 此处只有整数才可剪枝处理,如果target为负数,nums[i] < target,也不能代…...

JS 中怎么删除数组元素?有哪几种方法?
正文开始之前推荐一位宝藏博主免费分享的学习教程,学起来! 编号学习链接1Cesium: 保姆级教程+源码示例2openlayers: 保姆级教程+源码示例3Leaflet: 保姆级教程+源码示例4MapboxGL: 保姆级教程+源码示例splice() JavaScript中的splice()方法是一个内置的数组对象函数, 用于…...

Git如何将pre-commit也提交到仓库
我一开始准备将pre-commit提交到仓库进行备份的,但是却发现提交不了,即使我使用强制提交都不行。 (main) $ git add ./.git/hooks/pre-commit(main) $ git status On branch main nothing to commit, working tree clean# 强制提交(main) $ git add -f .…...

vmware中Ubuntu虚拟机和本地电脑Win10互相ping通
初始状态 使用vmware17版本安装的Ubuntu的20版本,安装之后什么配置都要不懂,然后进行下述配置。 初始的时候是NAT,没动的. 设置 点击右键编辑“属性” 常规选择“启用”: 高级选择全部: 打开网络配置,右键属…...

比较含退格的字符串-力扣
做这道题时出现了许多问题 第一次做题思路是使用双指针去解决,快慢指针遇到字母则前进,遇到 # 则慢指针退1,最开始并未考虑到 slowindex < 0 ,从而导致越界。第二个问题在于,在最后判断两个字符串是否相同时,最初使…...

NSSCTF-Web题目4
[SWPUCTF 2021 新生赛]hardrce 1、题目 2、知识点 rce:远程代码执行、url取反编码 3、解题思路 打开题目 出现一段代码,审计源代码 题目需要我们通过get方式输入变量wllm的值 但是变量的值被过滤了,不能输入字母和\t、\n等值 所以我们需…...

7. CSS 网格布局
CSS3引入了强大的网格布局(Grid Layout),它提供了一种二维的布局方式,使得创建复杂的网页布局变得更加简单和直观。通过定义行和列,我们可以精确控制网页元素的排列和对齐。本章将详细介绍网格布局的基本概念和属性&am…...

如何配置才能连接远程服务器上的 redis server ?
文章目录 Intro修改点 Intro 以阿里云服为例。 首先,我在我买的阿里云服务器中以下载源码、手动编译的方式安装了 redis-server,操作流程见:Ubuntu redis 下载解压配置使用及密码管理 && 包管理工具联网安装。 接着,我…...

MindSpore实践图神经网络之环境篇
MindSpore在Windows11系统下的环境配置。 MindSpore环境配置大概分为三步:(1)安装Python环境,(2)安装MindSpore,(3)验证是否成功 如果是GPU环境还需安装CUDA等环境&…...

MVS net笔记和理解
文章目录 传统的方法有什么缺陷吗?MVSnet深度的预估 传统的方法有什么缺陷吗? 传统的mvs算法它对图像的光照要求相对较高,但是在实际中要保证照片的光照效果很好是很难的。所以传统算法对镜面反射,白墙这种的重建效果就比较差。 …...

Linux 编译屏障之 ACCESS_ONCE()
文章目录 1. 前言2. 背景3. 为什么要有 ACCESS_ONCE() ?4. ACCESS_ONCE() 代码实现5. ACCESS_ONCE() 实例分析6. ACCESS() 的演进7. 结语8. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做…...

Discuz!X3.4论坛网站公安备案号怎样放到网站底部?
Discuz!网站的工信部备案号都知道在后台——全局——站点信息——网站备案信息代码填写,那公安备案号要添加在哪里呢?并没有看到公安备案号填写栏,今天驰网飞飞和你分享 1)工信部备案号和公安备案号统一填写到网站备案…...

LPDDR6带宽预计将翻倍增长:应对低功耗挑战与AI时代能源需求激增
在当前科技发展的背景下,低能耗问题成为了业界关注的焦点。国际能源署(IEA)近期报告显示,日常的数字活动对电力消耗产生显著影响——每次Google搜索平均消耗0.3瓦时(Wh),而向OpenAI的ChatGPT提出的每一次请求则消耗2.9…...

云原生架构内涵_3.主要架构模式
云原生架构有非常多的架构模式,这里列举一些对应用收益更大的主要架构模式,如服务化架构模式、Mesh化架构模式、Serverless模式、存储计算分离模式、分布式事务模式、可观测架构、事件驱动架构等。 1.服务化架构模式 服务化架构是云时代构建云原生应用的…...

宏基因组分析流程(Metagenomic workflow)202405|持续更新
Logs 增加R包pctax内的一些帮助上游分析的小脚本(2024.03.03)增加Mmseqs2用于去冗余,基因聚类的速度非常快,且随序列量线性增长(2024.03.12)更新全文细节(2024.05.29) 注意&#x…...

一千题,No.0037(组个最小数)
给定数字 0-9 各若干个。你可以以任意顺序排列这些数字,但必须全部使用。目标是使得最后得到的数尽可能小(注意 0 不能做首位)。例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的最…...

PV PVC
默写 1 如何将pod创建在指定的Node节点上 node亲和、pod亲和、pod反亲和: 调度策略 匹配标签 操作符 nodeAffinity 主机 In,NotIn,Exists,DoesNotExist,Gt,Lt podAffinity …...

深入理解Nginx配置文件:全面指南
Nginx 是一个高性能的 HTTP 服务器和反向代理服务器,也是一个电子邮件(IMAP/POP3)代理服务器。由于其高效性和灵活性,Nginx 被广泛应用于各种 web 服务中。本文将详细介绍 Nginx 配置文件的结构和主要配置项,帮助你深入…...