当前位置: 首页 > article >正文

【node.js】数据库与存储

在这里插入图片描述

个人主页:Guiat
归属专栏:node.js

在这里插入图片描述

文章目录

  • 1. 数据库概述
    • 1.1 数据库在Node.js中的作用
    • 1.2 Node.js支持的数据库类型
  • 2. 关系型数据库集成
    • 2.1 MySQL与Node.js
      • 2.1.1 安装MySQL驱动
      • 2.1.2 建立连接
      • 2.1.3 执行CRUD操作
    • 2.2 PostgreSQL与Node.js
      • 2.2.1 安装pg驱动
      • 2.2.2 建立连接
      • 2.2.3 使用事务
    • 2.3 SQLite与Node.js
      • 2.3.1 安装sqlite3驱动
      • 2.3.2 建立连接和基本操作
  • 3. NoSQL数据库集成
    • 3.1 MongoDB与Node.js
      • 3.1.1 安装MongoDB驱动
      • 3.1.2 建立连接
      • 3.1.3 CRUD操作
      • 3.1.4 使用Mongoose ODM
    • 3.2 Redis与Node.js
      • 3.2.1 安装Redis客户端
      • 3.2.2 建立连接
      • 3.2.3 基本操作
      • 3.2.4 使用Redis作为缓存
    • 3.3 Elasticsearch与Node.js
      • 3.3.1 安装Elasticsearch客户端
      • 3.3.2 建立连接与基本操作
  • 4. ORM和Query Builder
    • 4.1 Sequelize ORM
      • 4.1.1 安装Sequelize
      • 4.1.2 设置连接和模型
      • 4.1.3 CRUD操作
    • 4.2 TypeORM
      • 4.2.1 安装TypeORM
      • 4.2.2 实体和连接配置
      • 4.2.3 使用TypeORM进行操作
    • 4.3 Knex Query Builder
      • 4.3.1 安装Knex
      • 4.3.2 建立连接和基本操作

正文

1. 数据库概述

Node.js应用程序中的数据库存储是构建持久化、可扩展应用的关键组件。Node.js可以连接各种类型的数据库系统,从关系型到NoSQL,满足不同的应用需求。

1.1 数据库在Node.js中的作用

  • 持久化存储应用数据
  • 提供高效的数据查询和检索
  • 确保数据完整性和一致性
  • 支持复杂的业务逻辑实现
  • 优化应用性能和可扩展性

1.2 Node.js支持的数据库类型

Node.js可以与多种数据库类型无缝集成:

Node.js数据库
关系型数据库
NoSQL数据库
内存数据库
图数据库
时间序列数据库

2. 关系型数据库集成

2.1 MySQL与Node.js

2.1.1 安装MySQL驱动

npm install mysql2

2.1.2 建立连接

const mysql = require('mysql2/promise');// 创建连接池
const pool = mysql.createPool({host: 'localhost',user: 'root',password: 'password',database: 'my_database',waitForConnections: true,connectionLimit: 10,queueLimit: 0
});async function queryDatabase() {try {// 获取连接const [rows, fields] = await pool.execute('SELECT * FROM users WHERE id = ?', [1]);console.log(rows);return rows;} catch (error) {console.error('数据库查询错误:', error);throw error;}
}

2.1.3 执行CRUD操作

// 插入数据
async function insertUser(name, email) {try {const [result] = await pool.execute('INSERT INTO users (name, email) VALUES (?, ?)',[name, email]);return result.insertId;} catch (error) {console.error('插入错误:', error);throw error;}
}// 更新数据
async function updateUser(id, name, email) {try {const [result] = await pool.execute('UPDATE users SET name = ?, email = ? WHERE id = ?',[name, email, id]);return result.affectedRows;} catch (error) {console.error('更新错误:', error);throw error;}
}// 删除数据
async function deleteUser(id) {try {const [result] = await pool.execute('DELETE FROM users WHERE id = ?', [id]);return result.affectedRows;} catch (error) {console.error('删除错误:', error);throw error;}
}

2.2 PostgreSQL与Node.js

2.2.1 安装pg驱动

npm install pg

2.2.2 建立连接

const { Pool } = require('pg');const pool = new Pool({user: 'postgres',host: 'localhost',database: 'my_database',password: 'password',port: 5432,max: 20, // 连接池最大连接数idleTimeoutMillis: 30000
});async function queryDatabase() {const client = await pool.connect();try {const result = await client.query('SELECT * FROM users WHERE id = $1', [1]);return result.rows;} finally {client.release(); // 释放连接回连接池}
}

2.2.3 使用事务

async function transferFunds(fromAccount, toAccount, amount) {const client = await pool.connect();try {await client.query('BEGIN');// 从一个账户扣款await client.query('UPDATE accounts SET balance = balance - $1 WHERE id = $2',[amount, fromAccount]);// 向另一个账户存款await client.query('UPDATE accounts SET balance = balance + $1 WHERE id = $2',[amount, toAccount]);await client.query('COMMIT');return true;} catch (error) {await client.query('ROLLBACK');console.error('事务失败:', error);throw error;} finally {client.release();}
}

2.3 SQLite与Node.js

2.3.1 安装sqlite3驱动

npm install sqlite3

2.3.2 建立连接和基本操作

const sqlite3 = require('sqlite3').verbose();// 打开数据库连接
const db = new sqlite3.Database('./mydatabase.sqlite', (err) => {if (err) {console.error('连接错误:', err.message);} else {console.log('已连接到SQLite数据库');}
});// 执行查询
function getUser(id) {return new Promise((resolve, reject) => {db.get('SELECT * FROM users WHERE id = ?', [id], (err, row) => {if (err) {reject(err);} else {resolve(row);}});});
}// 执行插入
function insertUser(name, email) {return new Promise((resolve, reject) => {db.run('INSERT INTO users (name, email) VALUES (?, ?)',[name, email],function(err) {if (err) {reject(err);} else {resolve(this.lastID); // 获取插入的ID}});});
}// 关闭数据库连接
function closeDatabase() {return new Promise((resolve, reject) => {db.close((err) => {if (err) {reject(err);} else {resolve();}});});
}

3. NoSQL数据库集成

3.1 MongoDB与Node.js

3.1.1 安装MongoDB驱动

npm install mongodb

3.1.2 建立连接

const { MongoClient } = require('mongodb');const uri = 'mongodb://localhost:27017';
const client = new MongoClient(uri);async function connectToMongo() {try {await client.connect();console.log('已连接到MongoDB');return client.db('mydatabase');} catch (error) {console.error('MongoDB连接错误:', error);throw error;}
}

3.1.3 CRUD操作

async function performOperations() {try {const db = await connectToMongo();const usersCollection = db.collection('users');// 插入文档const insertResult = await usersCollection.insertOne({name: 'John Doe',email: 'john@example.com',age: 30,createdAt: new Date()});console.log('插入的ID:', insertResult.insertedId);// 查询文档const user = await usersCollection.findOne({ name: 'John Doe' });console.log('找到的用户:', user);// 更新文档const updateResult = await usersCollection.updateOne({ name: 'John Doe' },{ $set: { age: 31 } });console.log('更新结果:', updateResult.modifiedCount);// 删除文档const deleteResult = await usersCollection.deleteOne({ name: 'John Doe' });console.log('删除结果:', deleteResult.deletedCount);} catch (error) {console.error('操作错误:', error);} finally {await client.close();}
}

3.1.4 使用Mongoose ODM

npm install mongoose
const mongoose = require('mongoose');// 连接到MongoDB
mongoose.connect('mongodb://localhost:27017/mydatabase', {useNewUrlParser: true,useUnifiedTopology: true
})
.then(() => console.log('MongoDB连接成功'))
.catch(err => console.error('MongoDB连接错误:', err));// 定义Schema
const userSchema = new mongoose.Schema({name: { type: String, required: true },email: { type: String, required: true, unique: true },age: { type: Number, min: 18, max: 100 },isActive: { type: Boolean, default: true },createdAt: { type: Date, default: Date.now }
});// 创建模型
const User = mongoose.model('User', userSchema);// 创建用户
async function createUser(userData) {try {const newUser = new User(userData);await newUser.save();return newUser;} catch (error) {console.error('创建用户错误:', error);throw error;}
}// 查询用户
async function findUsers(criteria = {}) {try {return await User.find(criteria).sort({ createdAt: -1 });} catch (error) {console.error('查询用户错误:', error);throw error;}
}// 更新用户
async function updateUser(id, updateData) {try {return await User.findByIdAndUpdate(id, updateData, { new: true, runValidators: true });} catch (error) {console.error('更新用户错误:', error);throw error;}
}// 删除用户
async function deleteUser(id) {try {return await User.findByIdAndDelete(id);} catch (error) {console.error('删除用户错误:', error);throw error;}
}

3.2 Redis与Node.js

3.2.1 安装Redis客户端

npm install redis

3.2.2 建立连接

const redis = require('redis');async function connectToRedis() {// 创建客户端const client = redis.createClient({url: 'redis://localhost:6379'});// 错误监听client.on('error', (err) => {console.error('Redis错误:', err);});// 连接Redisawait client.connect();console.log('已连接到Redis');return client;
}

3.2.3 基本操作

async function redisOperations() {const client = await connectToRedis();try {// 设置键值await client.set('user:1:name', 'John Doe');await client.set('user:1:email', 'john@example.com');await client.set('user:1:visits', '10');// 设置带过期时间的键值(60秒)await client.setEx('session:123', 60, 'active');// 获取值const name = await client.get('user:1:name');console.log('名称:', name);// 递增计数器const newVisits = await client.incr('user:1:visits');console.log('访问次数:', newVisits);// 哈希存储await client.hSet('user:2', {name: 'Jane Smith',email: 'jane@example.com',age: '28'});// 获取哈希字段const userData = await client.hGetAll('user:2');console.log('用户数据:', userData);// 列表操作await client.lPush('recent_users', 'user:1');await client.lPush('recent_users', 'user:2');const recentUsers = await client.lRange('recent_users', 0, -1);console.log('最近的用户:', recentUsers);// 集合操作await client.sAdd('active_users', 'user:1', 'user:2');const isActive = await client.sIsMember('active_users', 'user:1');console.log('用户是否活跃:', isActive);// 删除键await client.del('session:123');// 检查键是否存在const exists = await client.exists('user:1:name');console.log('键存在:', exists);} finally {// 关闭连接await client.disconnect();}
}

3.2.4 使用Redis作为缓存

async function getUserWithCache(userId) {const client = await connectToRedis();try {// 尝试从Redis缓存获取const cachedUser = await client.get(`user:${userId}:data`);if (cachedUser) {console.log('缓存命中!');return JSON.parse(cachedUser);}console.log('缓存未命中,从数据库获取...');// 从数据库获取用户(示例)const user = await fetchUserFromDatabase(userId);// 存储到Redis缓存(10分钟过期)await client.setEx(`user:${userId}:data`, 600, JSON.stringify(user));return user;} finally {await client.disconnect();}
}// 模拟从数据库获取用户
async function fetchUserFromDatabase(userId) {// 这里应该是实际的数据库查询return { id: userId, name: 'Database User', email: 'user@example.com' };
}

3.3 Elasticsearch与Node.js

3.3.1 安装Elasticsearch客户端

npm install @elastic/elasticsearch

3.3.2 建立连接与基本操作

const { Client } = require('@elastic/elasticsearch');// 创建客户端
const client = new Client({ node: 'http://localhost:9200' });// 索引文档
async function indexDocument(doc) {try {const result = await client.index({index: 'products',body: doc});console.log('文档已索引:', result);return result;} catch (error) {console.error('索引错误:', error);throw error;}
}// 搜索文档
async function searchDocuments(query) {try {const result = await client.search({index: 'products',body: {query: {multi_match: {query: query,fields: ['name', 'description']}}}});console.log('搜索结果数量:', result.hits.total.value);return result.hits.hits.map(hit => ({id: hit._id,score: hit._score,...hit._source}));} catch (error) {console.error('搜索错误:', error);throw error;}
}// 使用示例
async function esExample() {// 索引产品await indexDocument({name: 'iPhone 13',description: '最新款苹果智能手机,搭载A15芯片',price: 799,category: 'electronics',tags: ['apple', 'smartphone', 'ios']});// 搜索产品const results = await searchDocuments('苹果 手机');console.log(results);
}

4. ORM和Query Builder

4.1 Sequelize ORM

4.1.1 安装Sequelize

npm install sequelize
npm install pg pg-hstore # PostgreSQL
# 或
npm install mysql2 # MySQL
# 或
npm install sqlite3 # SQLite

4.1.2 设置连接和模型

const { Sequelize, DataTypes } = require('sequelize');// 创建Sequelize实例
const sequelize = new Sequelize('database', 'username', 'password', {host: 'localhost',dialect: 'mysql', // 'postgres', 'sqlite', 'mariadb'pool: {max: 5,min: 0,acquire: 30000,idle: 10000},// SQLite专用// storage: './database.sqlite'
});// 定义模型
const User = sequelize.define('User', {// 模型属性firstName: {type: DataTypes.STRING,allowNull: false},lastName: {type: DataTypes.STRING},email: {type: DataTypes.STRING,allowNull: false,unique: true,validate: {isEmail: true}},age: {type: DataTypes.INTEGER,validate: {min: 18}},isActive: {type: DataTypes.BOOLEAN,defaultValue: true}
}, {// 其他模型选项timestamps: true, // 添加createdAt和updatedAtparanoid: true // 软删除(添加deletedAt而不是真删除)
});// 定义关联模型
const Post = sequelize.define('Post', {title: {type: DataTypes.STRING,allowNull: false},content: {type: DataTypes.TEXT},status: {type: DataTypes.ENUM('draft', 'published', 'archived'),defaultValue: 'draft'}
});// 定义模型关系
User.hasMany(Post);
Post.belongsTo(User);// 同步模型到数据库
async function syncDatabase() {try {await sequelize.sync({ force: false }); // force: true会删除现有表console.log('所有模型已同步');} catch (error) {console.error('同步错误:', error);}
}

4.1.3 CRUD操作

// 创建用户
async function createUser(userData) {try {const user = await User.create(userData);console.log('用户已创建:', user.toJSON());return user;} catch (error) {console.error('创建用户错误:', error);throw error;}
}// 查询用户
async function findUsers(options = {}) {try {const users = await User.findAll({where: options.where,attributes: options.attributes,include: options.include,order: options.order,limit: options.limit,offset: options.offset});return users;} catch (error) {console.error('查询用户错误:', error);throw error;}
}// 更新用户
async function updateUser(id, updateData) {try {const user = await User.findByPk(id);if (!user) {throw new Error('用户不存在');}const updatedUser = await user.update(updateData);return updatedUser;} catch (error) {console.error('更新用户错误:', error);throw error;}
}// 删除用户
async function deleteUser(id) {try {const user = await User.findByPk(id);if (!user) {throw new Error('用户不存在');}await user.destroy();return true;} catch (error) {console.error('删除用户错误:', error);throw error;}
}// 复杂查询示例
async function complexQueryExample() {try {// 查询活跃用户及其文章const activeUsers = await User.findAll({where: {isActive: true,age: {[Sequelize.Op.gte]: 21 // 大于等于21岁}},include: [{model: Post,where: {status: 'published'},required: false // LEFT OUTER JOIN}],order: [['lastName', 'ASC'],[Post, 'createdAt', 'DESC']],limit: 10});return activeUsers;} catch (error) {console.error('复杂查询错误:', error);throw error;}
}

4.2 TypeORM

4.2.1 安装TypeORM

npm install typeorm reflect-metadata
npm install pg # PostgreSQL
# 或其他数据库驱动

4.2.2 实体和连接配置

// entity/User.ts
import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from "typeorm";
import { Post } from "./Post";@Entity()
export class User {@PrimaryGeneratedColumn()id: number;@Column()firstName: string;@Column()lastName: string;@Column({ unique: true })email: string;@Column()age: number;@Column({ default: true })isActive: boolean;@Column({ type: "timestamp", default: () => "CURRENT_TIMESTAMP" })createdAt: Date;@OneToMany(() => Post, post => post.user)posts: Post[];
}// entity/Post.ts
import { Entity, PrimaryGeneratedColumn, Column, ManyToOne } from "typeorm";
import { User } from "./User";@Entity()
export class Post {@PrimaryGeneratedColumn()id: number;@Column()title: string;@Column("text")content: string;@Column({type: "enum",enum: ["draft", "published", "archived"],default: "draft"})status: string;@Column({ type: "timestamp", default: () => "CURRENT_TIMESTAMP" })createdAt: Date;@ManyToOne(() => User, user => user.posts)user: User;
}// data-source.ts
import "reflect-metadata";
import { DataSource } from "typeorm";
import { User } from "./entity/User";
import { Post } from "./entity/Post";export const AppDataSource = new DataSource({type: "postgres",host: "localhost",port: 5432,username: "postgres",password: "password",database: "mydatabase",synchronize: true, // 在生产环境中不建议使用logging: true,entities: [User, Post],migrations: [],subscribers: []
});// 初始化数据源
export async function initializeDataSource() {try {await AppDataSource.initialize();console.log("数据源已初始化");} catch (error) {console.error("数据源初始化错误:", error);throw error;}
}

4.2.3 使用TypeORM进行操作

// user-service.ts
import { AppDataSource } from "./data-source";
import { User } from "./entity/User";
import { Post } from "./entity/Post";// 创建用户
export async function createUser(userData: Partial<User>): Promise<User> {const userRepository = AppDataSource.getRepository(User);const user = userRepository.create(userData);return await userRepository.save(user);
}// 查找用户
export async function findUserById(id: number): Promise<User | null> {const userRepository = AppDataSource.getRepository(User);return await userRepository.findOne({where: { id },relations: ["posts"]});
}// 更新用户
export async function updateUser(id: number, userData: Partial<User>): Promise<User | null> {const userRepository = AppDataSource.getRepository(User);await userRepository.update(id, userData);return await findUserById(id);
}// 删除用户
export async function deleteUser(id: number): Promise<boolean> {const userRepository = AppDataSource.getRepository(User);const result = await userRepository.delete(id);return result.affected ? true : false;
}// 复杂查询示例
export async function findActiveUsersWithPosts(): Promise<User[]> {const userRepository = AppDataSource.getRepository(User);return await userRepository.createQueryBuilder("user").leftJoinAndSelect("user.posts", "post", "post.status = :status", { status: "published" }).where("user.isActive = :isActive", { isActive: true }).andWhere("user.age >= :age", { age: 21 }).orderBy("user.lastName", "ASC").addOrderBy("post.createdAt", "DESC").take(10).getMany();
}

4.3 Knex Query Builder

4.3.1 安装Knex

npm install knex
npm install pg # PostgreSQL
# 或其他数据库驱动

4.3.2 建立连接和基本操作

const knex = require('knex')({client: 'pg', // 或 'mysql', 'sqlite3'connection: {host: '127.0.0.1',port: 5432,user: 'postgres',password: 'password',database: 'mydatabase'},pool: { min: 0, max: 7 }
});// 查询操作
async function getUsers() {try {return await knex('users').select('id', 'name', 'email').where('is_active', true).orderBy('created_at', 'desc').limit(10);} catch (error) {console.error('查询错误:', error);throw error;}
}// 插入操作
async function insertUser(userData) {try {const [id] = await knex('users').insert(userData).returning('id');return id;} catch (error) {console.error('插入错误:', error);throw error;}
}// 更新操作
async function updateUser(id, userData) {try {return await knex('users').where('id', id).update(userData);} catch (error) {console.error('更新错误:', error);throw error;}
}// 删除操作
async function deleteUser(id) {try {return await knex('users').where('id', id).del();} catch (error) {console.error('删除错误:', error);throw error;}
}// 事务示例
async function transferFunds(fromAccount, toAccount, amount) {try {return await knex.transaction(async (trx) => {// 从一个账户扣款await trx('accounts').where('id', fromAccount).decrement('balance', amount);// 向另一个账户存款await trx('accounts').where('id', toAccount).increment('balance', amount);// 记录交易await trx('transactions').insert({from_account: fromAccount,to_account: toAccount,amount: amount,transaction_date: new Date()});return true;});} catch (error) {console.error('事务错误:', error);throw error;}
}// 复杂查询示例
async function getUsersWithPosts() {try {// 多表联合查询return await knex('users as u').select('u.id','u.name','u.email',knex.raw('COUNT(p.id) as post_count')).leftJoin('posts as p', 'u.id', 'p.user_id').where('u.is_active', true).groupBy('u.id', 'u.name', 'u.email').having(knex.raw('COUNT(p.id) > ?', [0])).orderBy('post_count', 'desc');} catch (error) {console.error('复杂查询错误:', error);throw error;}
}

结语
感谢您的阅读!期待您的一键三连!欢迎指正!

在这里插入图片描述

相关文章:

【node.js】数据库与存储

个人主页&#xff1a;Guiat 归属专栏&#xff1a;node.js 文章目录 1. 数据库概述1.1 数据库在Node.js中的作用1.2 Node.js支持的数据库类型 2. 关系型数据库集成2.1 MySQL与Node.js2.1.1 安装MySQL驱动2.1.2 建立连接2.1.3 执行CRUD操作 2.2 PostgreSQL与Node.js2.2.1 安装pg驱…...

leetcode2081. k 镜像数字的和-hard

1 题目&#xff1a;k 镜像数字的和 官方标定难度&#xff1a;难 一个 k 镜像数字 指的是一个在十进制和 k 进制下从前往后读和从后往前读都一样的 没有前导 0 的 正 整数。 比方说&#xff0c;9 是一个 2 镜像数字。9 在十进制下为 9 &#xff0c;二进制下为 1001 &#xff…...

Halcon 单目相机标定测量

文章目录 双面相机标定链接一维测量gen_cam_par_area_scan_division -为区域扫描相机生成一个相机参数元组&#xff0c;该相机的变形由分割模型建模。(相机自带参数)create_calib_data -创建Halcon 数据标定模型set_calib_data_cam_param -设置校准数据模型中摄像机的类型和初始…...

git子模块--常见操作

克隆仓库 标准化克隆流程 基本命令git clone <父仓库远程URL> [本地文件名] cd <本地仓库名> git submodule init # 初始化子模块配置 git submodule update # 拉取子模块内容一次性完成克隆和初始化流程 基本命令git clone --recurse-submodules <父仓库远…...

解决SQL Server SQL语句性能问题(9)——创建和更新统计对象

9.3. 创建和更新统计对象 与Oracle中的统计数据相对应,SQL Server中的统计对象,本专栏6.3节中也提到,数据库CBO依赖其为SQL语句产生最合适、最高效的查询计划。数据库CBO结合各类统计对象,并利用其内置的、复杂而高级的模型与算法,尽可能的为SQL语句计算和评估出所有候选…...

数据被泄露了怎么办?

数据泄露是严重的网络安全事件&#xff0c;需立即采取行动以降低风险。以下是关键应对步骤&#xff1a; 1. 确认泄露范围 核实泄露内容&#xff1a;确定泄露的是密码、财务信息、身份证号还是其他敏感数据。 评估来源&#xff1a;检查是个人设备被入侵、某平台漏洞&#xff0c…...

绩效管理缺乏数据支持,如何提高客观性?

要提高绩效管理的客观性&#xff0c;应从建立科学的指标体系、加强数据采集手段、引入自动化绩效工具、强化过程记录机制、定期评估与反馈优化五大方面着手。其中&#xff0c;建立科学的指标体系是关键基础。没有数据支撑的绩效体系&#xff0c;往往容易陷入主观打分、个人偏见…...

unity控制相机围绕物体旋转移动

记录一下控制相机围绕物体旋转与移动的脚本&#xff0c;相机操作思路分为两块&#xff0c;一部分为旋转&#xff0c;一部分为移动&#xff0c;旋转是根据当前center中心点的坐标&#xff0c;根据距离设置与默认的旋转进行位置移动&#xff0c;移动是根据相机的左右和前后进行计…...

线性代数:AI大模型的数学基石

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

【C/C++】从零开始掌握Kafka

文章目录 从零开始掌握Kafka一、Kafka 基础知识理解&#xff08;理论&#xff09;1. 核心组件与架构2. 重点概念解析 二、Kafka 面试重点知识梳理三、C 使用 Kafka 的实践&#xff08;librdkafka&#xff09;1. librdkafka 简介2. 安装 librdkafka 四、实战&#xff1a;高吞吐生…...

02_redis分布式锁原理

文章目录 一、redis如何实现分布式锁1. 使用 SETNX 命令2. 设置过期时间3. 释放锁4. 注意事项5. 示例代码 二、Java中分布式锁如何设置超时时间1. Redis分布式锁2. 基于Zookeeper的分布式锁3. 基于数据库的分布式锁注意事项 一、redis如何实现分布式锁 Redis 实现分布式锁是一…...

简单血条于小怪攻击模板

创建一个2d正方形&#xff08;9-Sliced&#xff09;命名为Player&#xff0c;在Player下面新建一个画布&#xff08;Canvas&#xff09;命名为PlayerHealthUI&#xff0c;在画布下面新建一个滑动条&#xff08;Slider&#xff09;命名为HealthBar 把PlayerHealthUI脚本挂载到Pl…...

Win11 系统登入时绑定微软邮箱导致用户名欠缺

Win11 系统登入时绑定微软邮箱导致用户名欠缺 解决思路 -> 解绑当前微软邮箱和用户名 -> 断网离线建立本地账户 -> 设置本地账户为Admin权限 -> 注销当前账户&#xff0c;登入新建的用户 -> 联网绑定微软邮箱 -> 删除旧的用户命令步骤 管理员权限打开…...

代码随想录算法训练营第四十六四十七天

卡码网题目: 110. 字符串接龙105. 有向图的完全联通106. 岛屿的周长107. 寻找存在的路径 其他: 今日总结 往期打卡 110. 字符串接龙 跳转: 110. 字符串接龙 学习: 代码随想录公开讲解 问题: 字典 strList 中从字符串 beginStr 和 endStr 的转换序列是一个按下述规格形成的序…...

华硕FL8000U加装16G+32G=48G内存条

华硕FL8000U加装16G32G48G内存条 一、华硕FL8000U加装内存条endl 一、华硕FL8000U加装内存条 相关视频链接: https://www.bilibili.com/video/BV1gw4dePED8/ endl...

前后端联调实战指南:Axios拦截器、CORS与JWT身份验证全解析

前言 在现代Web开发中&#xff0c;前后端分离架构已成为主流&#xff0c;而前后端联调则是开发过程中不可避免的关键环节。本文将深入探讨前后端联调中的三大核心技术&#xff1a;Axios拦截器的灵活运用、CORS跨域问题的全面解决方案以及JWT身份验证的安全实现。通过本文&…...

java高级 -Junit单元测试

Junit单元测试就是针对最小的功能&#xff1a;方法&#xff0c;编写测试代码对其进行正确性测试。用main方法进行测试的弊端是一个方法测试失败可能会影响别的方法的测试&#xff0c;也无法得到测试报告&#xff0c;需要我们自己观察数据是否正确。 此时&#xff0c;我们就需要…...

在 UVM验证环境中,验证 Out-of-Order或 Interleaving机制

在 UVM验证环境中,验证 Out-of-Order或 Interleaving机制 摘要:在 UVM (Universal Verification Methodology) 验证环境中,验证 Out-of-Order (乱序) 或 Interleaving (交错) 机制是验证复杂 SoC (System on Chip) 设计的重要任务,尤其是在验证高速接口(如 PCIe、AXI)、缓…...

V9数据库替换授权

文章目录 环境文档用途详细信息 环境 系统平台&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;9.0 文档用途 1、本文档用于指导V9数据库替换授权。 2、V9数据库授权文件为license.dat。 详细信息 1、上传新的授权文件到服务器并修改授权文件属主为…...

勇闯Chromium—— Chromium的多进程架构

问题 构建一个永不崩溃或挂起的渲染引擎几乎是不可能的,构建一个绝对安全的渲染引擎也几乎是不可能的。 从某种程度上来说,2006 年左右的网络浏览器状态与过去单用户、协作式多任务操作系统的状况类似。正如在这样的操作系统中,一个行为不端的应用程序可能导致整个系统崩溃…...

Go语言中常量的命名规则详解

1. 常量的基本命名规则 1.1. 命名格式 1. 使用const关键字声明&#xff1b; 2. 命名格式&#xff1a;const 常量名 [类型] 值&#xff1b; 3. 类型可以省略&#xff0c;由编译器推断&#xff1b; 1.2. 命名风格 大小写规则&#xff1a; 1. 首字母大写&#xff1a;导出常…...

软件质量保证与测试实验

课程  软件质量保证与测试 目的&#xff1a;练习软件测试中白盒测试方法 内容&#xff1a; 测试如下程序段&#xff1a; #include <stdio.h>int main() {int i 1, n1 0, n2 0;float sum 0.0;float average;float score[100];printf("请输入分…...

历年华东师范大学保研上机真题

2025华东师范大学保研上机真题 2024华东师范大学保研上机真题 2023华东师范大学保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school?classification1 简单一位数代数式计算 题目描述 给一个小学生都会算的1位数与1位数运算的代数式&#xff0c;请你求出这个表…...

【C++】什么是静态库?什么是动态库?

静态库与动态库详解 静态库和动态库是软件开发中两种不同的代码共享和重用机制&#xff0c;它们在链接方式、内存使用和部署方式上有显著区别。 一、静态库(Static Library) 基本概念 静态库是在编译期间被完整复制到最终可执行文件中的预编译代码集合。 主要特点 链接时…...

项目阅读:Instruction Defense

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://learnprompting.org/docs/prompt_hacking/defensive_measures/instruction https://www.doubao.com/chat/6945469301219586 速览 指令防御&#xff08;Instructio…...

springboot中拦截器配置使用

文章目录 前置拦截器代码拦截器注册疑问 前置 你使用 javaspringboot 常用在&#xff1a; 身份验证与授权&#xff0c;使用拦截器检查用户的身份验证状态和权限级别&#xff0c;确保只有经过验证且有适当权限的用户能够访问特定资源日志记录与审计性能分析与监控&#xff0…...

用 Python 构建自动驾驶的实时通信系统:让车辆“交流”起来!

用 Python 构建自动驾驶的实时通信系统:让车辆“交流”起来! 自动驾驶技术正加速变革全球交通体系,它不仅是机器学习与计算机视觉的胜利,更是一场 高效通信架构的革命。自动驾驶汽车需要实时交换信息,比如: 传感器数据(雷达、激光雷达、摄像头)V2V(车与车通信)V2X(…...

在机器学习中,L2正则化为什么能够缓过拟合?为何正则化等机制能够使一个“过度拟合训练集”的模型展现出更优的泛化性能?正则化

在现代机器学习的发展历程中&#xff0c;过拟合&#xff08;Overfitting&#xff09;始终是亟需克服的重要挑战。其表现如同在训练数据上构建过度复杂的映射函数&#xff0c;虽能实现近乎完美的拟合&#xff0c;但其泛化能力却显著受限&#xff0c;导致模型在测试集或实际应用中…...

day36 python神经网络训练

目录 一、数据准备与预处理 二、数据集划分与归一化 三、构建神经网络模型 四、定义损失函数和优化器 五、训练模型 六、评估模型 在机器学习和深度学习的实践中&#xff0c;信贷风险评估是一个非常重要的应用场景。通过构建神经网络模型&#xff0c;我们可以对客户的信用…...

k8s部署ELK补充篇:kubernetes-event-exporter收集Kubernetes集群中的事件

k8s部署ELK补充篇&#xff1a;kubernetes-event-exporter收集Kubernetes集群中的事件 文章目录 k8s部署ELK补充篇&#xff1a;kubernetes-event-exporter收集Kubernetes集群中的事件一、kubernetes-event-exporter简介二、kubernetes-event-exporter实战部署1. 创建Namespace&a…...