40分钟学 Go 语言高并发:服务性能调优实战
服务性能调优实战
一、性能优化实战概述
优化阶段 | 主要内容 | 关键指标 | 重要程度 |
---|---|---|---|
瓶颈定位 | 收集性能指标,确定瓶颈位置 | CPU、内存、延迟、吞吐量 | ⭐⭐⭐⭐⭐ |
代码优化 | 优化算法、并发、内存使用 | 代码执行时间、内存分配 | ⭐⭐⭐⭐⭐ |
系统调优 | 调整系统参数、资源配置 | 系统资源利用率 | ⭐⭐⭐⭐ |
性能对比 | 优化前后性能对比分析 | 性能提升百分比 | ⭐⭐⭐⭐ |
让我们通过一个实际的Web服务示例来展示完整的性能调优过程:
package mainimport ("encoding/json""fmt""log""net/http""sync""time"
)// 数据模型
type User struct {ID int `json:"id"`Name string `json:"name"`Email string `json:"email"`Created time.Time `json:"created"`Modified time.Time `json:"modified"`
}// 用户数据存储
type UserStore struct {mu sync.RWMutexusers map[int]*User
}// 创建新的用户存储
func NewUserStore() *UserStore {return &UserStore{users: make(map[int]*User),}
}// 全局用户存储实例
var userStore = NewUserStore()// 处理获取用户列表请求
func handleGetUsers(w http.ResponseWriter, r *http.Request) {userStore.mu.RLock()users := make([]*User, 0, len(userStore.users))for _, user := range userStore.users {users = append(users, user)}userStore.mu.RUnlock()data, err := json.Marshal(users)if err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}w.Header().Set("Content-Type", "application/json")w.Write(data)
}// 处理创建用户请求
func handleCreateUser(w http.ResponseWriter, r *http.Request) {var user Userif err := json.NewDecoder(r.Body).Decode(&user); err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}userStore.mu.Lock()user.Created = time.Now()user.Modified = time.Now()userStore.users[user.ID] = &useruserStore.mu.Unlock()w.WriteHeader(http.StatusCreated)json.NewEncoder(w).Encode(user)
}// 处理更新用户请求
func handleUpdateUser(w http.ResponseWriter, r *http.Request) {var user Userif err := json.NewDecoder(r.Body).Decode(&user); err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}userStore.mu.Lock()if existingUser, ok := userStore.users[user.ID]; ok {user.Created = existingUser.Createduser.Modified = time.Now()userStore.users[user.ID] = &useruserStore.mu.Unlock()json.NewEncoder(w).Encode(user)} else {userStore.mu.Unlock()http.Error(w, "User not found", http.StatusNotFound)}
}// 主函数
func main() {// 注册路由http.HandleFunc("/users", handleGetUsers)http.HandleFunc("/users/create", handleCreateUser)http.HandleFunc("/users/update", handleUpdateUser)// 启动服务器fmt.Println("Server starting on :8080...")log.Fatal(http.ListenAndServe(":8080", nil))
}
这是一个简单的用户管理服务,让我们开始进行性能优化。
二、性能瓶颈定位
1. 添加性能监控
首先,添加性能监控代码:
package mainimport ("fmt""net/http""runtime""sync/atomic""time"
)// 性能指标
type Metrics struct {RequestCount int64ResponseTime int64ErrorCount int64ActiveRequests int64LastGCTime time.TimeMemStats runtime.MemStats
}var metrics = &Metrics{}// 中间件:记录请求性能指标
func metricsMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {atomic.AddInt64(&metrics.RequestCount, 1)atomic.AddInt64(&metrics.ActiveRequests, 1)defer atomic.AddInt64(&metrics.ActiveRequests, -1)start := time.Now()next(w, r)duration := time.Since(start)atomic.AddInt64(&metrics.ResponseTime, duration.Microseconds())}
}// 监控指标收集
func collectMetrics() {ticker := time.NewTicker(5 * time.Second)for range ticker.C {var m runtime.MemStatsruntime.ReadMemStats(&m)metrics.MemStats = mmetrics.LastGCTime = time.Unix(0, int64(m.LastGC))fmt.Printf("\nPerformance Metrics:\n")fmt.Printf("Total Requests: %d\n", atomic.LoadInt64(&metrics.RequestCount))fmt.Printf("Active Requests: %d\n", atomic.LoadInt64(&metrics.ActiveRequests))fmt.Printf("Average Response Time: %d µs\n", atomic.LoadInt64(&metrics.ResponseTime)/atomic.LoadInt64(&metrics.RequestCount))fmt.Printf("Error Count: %d\n", atomic.LoadInt64(&metrics.ErrorCount))fmt.Printf("Heap Alloc: %d MB\n", m.HeapAlloc/1024/1024)fmt.Printf("Number of GCs: %d\n", m.NumGC)}
}// 注册带监控的路由
func registerRoutes() {http.HandleFunc("/users", metricsMiddleware(handleGetUsers))http.HandleFunc("/users/create", metricsMiddleware(handleCreateUser))http.HandleFunc("/users/update", metricsMiddleware(handleUpdateUser))http.HandleFunc("/metrics", handleMetrics)
}// 监控指标接口
func handleMetrics(w http.ResponseWriter, r *http.Request) {var m runtime.MemStatsruntime.ReadMemStats(&m)fmt.Fprintf(w, "Performance Metrics:\n")fmt.Fprintf(w, "Total Requests: %d\n", atomic.LoadInt64(&metrics.RequestCount))fmt.Fprintf(w, "Active Requests: %d\n", atomic.LoadInt64(&metrics.ActiveRequests))fmt.Fprintf(w, "Average Response Time: %d µs\n", atomic.LoadInt64(&metrics.ResponseTime)/atomic.LoadInt64(&metrics.RequestCount))fmt.Fprintf(w, "Error Count: %d\n", atomic.LoadInt64(&metrics.ErrorCount))fmt.Fprintf(w, "Heap Alloc: %d MB\n", m.HeapAlloc/1024/1024)fmt.Fprintf(w, "Number of GCs: %d\n", m.NumGC)
}
2. 性能测试工具
创建性能测试代码:
package mainimport ("bytes""encoding/json""fmt""net/http""sync""testing""time"
)// 并发测试用户服务
func BenchmarkUserService(b *testing.B) {// 准备测试数据user := User{ID: 1,Name: "Test User",Email: "test@example.com",}userData, _ := json.Marshal(user)b.Run("CreateUser", func(b *testing.B) {b.ResetTimer()for i := 0; i < b.N; i++ {resp, err := http.Post("http://localhost:8080/users/create", "application/json", bytes.NewBuffer(userData))if err != nil {b.Fatal(err)}resp.Body.Close()}})b.Run("GetUsers", func(b *testing.B) {b.ResetTimer()for i := 0; i < b.N; i++ {resp, err := http.Get("http://localhost:8080/users")if err != nil {b.Fatal(err)}resp.Body.Close()}})
}// 负载测试
func loadTest(concurrent, requests int) {var wg sync.WaitGroupstart := time.Now()for i := 0; i < concurrent; i++ {wg.Add(1)go func(workerID int) {defer wg.Done()for j := 0; j < requests; j++ {resp, err := http.Get("http://localhost:8080/users")if err != nil {fmt.Printf("Worker %d request %d failed: %v\n", workerID, j, err)continue}resp.Body.Close()}}(i)}wg.Wait()duration := time.Since(start)totalRequests := concurrent * requestsfmt.Printf("\nLoad Test Results:\n")fmt.Printf("Total Requests: %d\n", totalRequests)fmt.Printf("Concurrent Users: %d\n", concurrent)fmt.Printf("Total Time: %v\n", duration)fmt.Printf("Requests/Second: %.2f\n", float64(totalRequests)/duration.Seconds())
}func main() {fmt.Println("Starting load test...")loadTest(100, 1000) // 100个并发用户,每个发送1000个请求
}
通过运行性能测试和负载测试,我们可以发现以下问题:
- 全局锁竞争严重
- JSON序列化/反序列化开销大
- 内存分配频繁
- 没有连接池和缓存机制
三、代码优化
让我们对代码进行优化:
package mainimport ("encoding/json""fmt""log""net/http""sync""time"
)// 优化1:使用分片锁减少锁竞争
type UserShard struct {mu sync.RWMutexusers map[int]*User
}type ShardedUserStore struct {shards []*UserShardnumShards int
}func NewShardedUserStore(numShards int) *ShardedUserStore {store := &ShardedUserStore{shards: make([]*UserShard, numShards),numShards: numShards,}for i := 0; i < numShards; i++ {store.shards[i] = &UserShard{users: make(map[int]*User),}}return store
}func (s *ShardedUserStore) getShard(userID int) *UserShard {return s.shards[userID%s.numShards]
}// 优化2:使用对象池减少内存分配
var userPool = sync.Pool{New: func() interface{} {return &User{}},
}// 优化3:使用预分配的buffer池
var bufferPool = sync.Pool{New: func() interface{} {return new(bytes.Buffer)},
}// 优化4:添加缓存层
type Cache struct {mu sync.RWMutexitems map[string][]bytettl time.Duration
}func NewCache(ttl time.Duration) *Cache {return &Cache{items: make(map[string][]byte),ttl: ttl,}
}var cache = NewCache(5 * time.Minute)// 优化后的处理函数
func (s *ShardedUserStore) handleGetUsers(w http.ResponseWriter, r *http.Request) {// 尝试从缓存获取cacheKey := "users_list"cache.mu.RLock()if data, ok := cache.items[cacheKey]; ok {cache.mu.RUnlock()w.Header().Set("Content-Type", "application/json")w.Header().Set("X-Cache", "HIT")w.Write(data)return}cache.mu.RUnlock()// 收集所有分片的用户数据users := make([]*User, 0, 1000)for _, shard := range s.shards {shard.mu.RLock()for _, user := range shard.users {users = append(users, user)}shard.mu.RUnlock()}// 使用buffer池进行JSON序列化buf := bufferPool.Get().(*bytes.Buffer)buf.Reset()defer bufferPool.Put(buf)encoder := json.NewEncoder(buf)if err := encoder.Encode(users); err != nil {http.Error(w, err.Error(), http.StatusInternalServerError)return}// 更新缓存cache.mu.Lock()cache.items[cacheKey] = buf.Bytes()cache.mu.Unlock()w.Header().Set("Content-Type", "application/json")w.Header().Set("X-Cache", "MISS")w.Write(buf.Bytes())
}func (s *ShardedUserStore) handleCreateUser(w http.ResponseWriter, r *http.Request) {// 从对象池获取用户对象user := userPool.Get().(*User)defer userPool.Put(user)// 使用buffer池进行JSON反序列化buf := bufferPool.Get().(*bytes.Buffer)buf.Reset()defer bufferPool.Put(buf)_, err := buf.ReadFrom(r.Body)if err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}if err := json.Unmarshal(buf.Bytes(), user); err != nil {http.Error(w, err.Error(), http.StatusBadRequest)return}// 获取对应的分片shard := s.getShard(user.ID)shard.mu.Lock()user.Created = time.Now()user.Modified = time.Now()shard.users[user.ID] = usershard.mu.Unlock()// 清除缓存cache.mu.Lock()delete(cache.items, "users_list")cache.mu.Unlock()w.WriteHeader(http.StatusCreated)json.NewEncoder(w).Encode(user)
}// 优化5:添加监控和限流
type RateLimit struct {mu sync.Mutexrequests map[string][]time.Timelimit intwindow time.Duration
}func NewRateLimit(limit int, window time.Duration) *RateLimit {return &RateLimit{requests: make(map[string][]time.Time),limit: limit,window: window,}
}var rateLimiter = NewRateLimit(1000, time.Minute) // 每分钟1000个请求func (rl *RateLimit) Allow(ip string) bool {rl.mu.Lock()defer rl.mu.Unlock()now := time.Now()windowStart := now.Add(-rl.window)// 清理过期的请求记录times := rl.requests[ip]valid := times[:0]for _, t := range times {if t.After(windowStart) {valid = append(valid, t)}}rl.requests[ip] = valid// 检查是否超过限制if len(valid) >= rl.limit {return false}// 记录新请求rl.requests[ip] = append(rl.requests[ip], now)return true
}// 中间件:限流
func rateLimitMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {ip := r.RemoteAddrif !rateLimiter.Allow(ip) {http.Error(w, "Rate limit exceeded", http.StatusTooManyRequests)return}next(w, r)}
}func main() {// 创建分片存储userStore := NewShardedUserStore(16) // 16个分片// 注册路由http.HandleFunc("/users", rateLimitMiddleware(userStore.handleGetUsers))http.HandleFunc("/users/create", rateLimitMiddleware(userStore.handleCreateUser))// 启动监控go collectMetrics()// 启动服务器fmt.Println("Optimized server starting on :8080...")log.Fatal(http.ListenAndServe(":8080", nil))
}
让我们创建一个性能优化流程图:
四、系统调优
1. 服务器配置优化
# 系统参数优化
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535
sysctl -w net.core.netdev_max_backlog=65535# 文件描述符限制
ulimit -n 65535
2. Go运行时参数调整
export GOMAXPROCS=8 # CPU核心数
export GOGC=50 # GC触发阈值
3. 应用参数调整
参数 | 原始值 | 优化值 | 说明 |
---|---|---|---|
分片数量 | 1 | 16 | 减少锁竞争 |
缓存TTL | 无 | 5分钟 | 减少CPU和内存压力 |
限流阈值 | 无 | 1000/分钟 | 防止过载 |
对象池大小 | 无 | 动态 | 减少GC压力 |
五、性能对比
1. 性能指标对比
指标 | 优化前 | 优化后 | 提升比例 |
---|---|---|---|
QPS | 5000 | 20000 | 300% |
平均响应时间 | 20ms | 5ms | 75% |
内存使用 | 2GB | 500MB | 75% |
GC频率 | 10次/分钟 | 2次/分钟 | 80% |
2. 优化效果分析
-
分片锁优化
- 降低了锁竞争
- 提高了并发处理能力
- CPU利用率更均衡
-
对象池优化
- 减少了内存分配
- 降低了GC压力
- 提高了性能稳定性
-
缓存优化
- 减少了重复计算
- 降低了响应时间
- 提高了系统吞吐量
-
系统调优
- 提高了系统资源利用率
- 增强了系统稳定性
- 优化了性能表现
六、总结与建议
-
性能优化原则
- 先监控,后优化
- 重点解决瓶颈
- 注意优化成本
-
代码优化建议
- 使用合适的数据结构
- 减少锁竞争
- 优化内存使用
-
系统优化建议
- 合理配置参数
- 监控系统资源
- 及时进行调优
-
持续优化
- 持续监控性能
- 定期进行优化
- 保持代码质量
怎么样今天的内容还满意吗?再次感谢观众老爷的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!
相关文章:
40分钟学 Go 语言高并发:服务性能调优实战
服务性能调优实战 一、性能优化实战概述 优化阶段主要内容关键指标重要程度瓶颈定位收集性能指标,确定瓶颈位置CPU、内存、延迟、吞吐量⭐⭐⭐⭐⭐代码优化优化算法、并发、内存使用代码执行时间、内存分配⭐⭐⭐⭐⭐系统调优调整系统参数、资源配置系统资源利用率…...
5092 星际争霸
逆序对排序; 字符串遍历; pair 特点: 两个值,第一个是字符串,第二个是逆序对数。而且没有重复的字符串。 #include<bits/stdc.h>using namespace std; typedef long long ll; const int N1e35; #define x f…...
AUTOSAR AP 汽车API知识点总结(Automotive API )R24-11
汽车API知识点总结 一、背景与目标 背景:智能互联汽车正逐步依赖远程诊断、软件更新等功能以确保行驶安全,并且用户已习惯于通过智能设备中的应用程序控制连接设备。虽然AUTOSAR标准支持车辆软件的可更新性,但尚未提供将AUTOSAR应用产生的数据和功能安全可靠地暴露给非AUTO…...
vue2:Cascader 级联选择器中加载两种不同的数据结构
前言 因UI调整,需要将el-tree控件更换为级联选择器,而在原树形控件中,加载了两种不同的数据结构,(参见vue2:树形控件el-tree中加载两种不同结构的数据_vue2 树形插件-CSDN博客)所以现在级联选择器中也需要加载这两种不同的数据结构。 问题 原本以为处理方式差不多,在…...
【xLSTM-Transformer序列分类】Pytorch使用xLSTM-Transformer对序列进行分类源代码
Python, Pytorch使用xLSTM-Transformer对序列进行分类源代码。xLSTM是不久前LSTM团队提出来的新模型,将xLSTM融入Transformer的Encoder中,创新型较强。另外,Transformer是完整的,即使用了Encoder、Decoder和Embedding所有模块。 …...
TDengine 签约安徽智质,助力海螺水泥智慧工厂升级
在当前制造业数字化转型的浪潮中,如何实现智能化、自动化与数据驱动的高效生产,成为企业提升竞争力的关键。尤其是在水泥、钢铁等传统行业,随着技术的不断进步,如何打破数据孤岛、提升生产管理效率,已经成为许多工厂亟…...
Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount
目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多,Hbase移动到开头,后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表,并写入数据 create "wunaii…...
WHLUG丨deepin、华中科技大学开放原子开源俱乐部、 RustSBI 和清华大学开源操作系统训练营共话开源新生代成长之路
2024年11月30日下午,由 deepin(深度)社区联合华中科技大学开放原子开源俱乐部、 RustSBI 开源社区和清华大学开源操作系统训练营共同举办的WHLUG(武汉Linux用户组)线下沙龙在华中科技大学成功举办。 本次活动聚集了50余…...
深入理解AVL树:结构、旋转及C++实现
1. AVL树的概念 什么是AVL树? AVL树是一种自平衡的二叉搜索树,其发明者是Adelson-Velsky和Landis,因此得名“AVL”。AVL树是首个自平衡二叉搜索树,通过对树的平衡因子进行控制,确保任何节点的左右子树高度差最多为1&…...
L15.【LeetCode笔记】相同的树
目录 1.题目 代码模板 2.分析 通过合理的if判断分类讨论两个根节点 1.首先,p和q都为NULL的情况最好排除 2.排除了两个都为NULL的情况,剩下的情况:1.其中一个为NULL;2.两个都不为NULL 写法1 写法2 3.只剩下最后一种情况:p和q都不为NULL 3.代码 提交结果 1.题目 https…...
【算法】【优选算法】位运算(下)
目录 一、:⾯试题 01.01.判定字符是否唯⼀1.1 位图1.2 hash思路1.3 暴力枚举 二、268.丢失的数字2.1 位运算,异或2.2 数学求和 三、371.两整数之和四、137.只出现⼀次的数字 II五、⾯试题 17.19.消失的两个数字 一、:⾯试题 01.01.判定字符是…...
网络——Socket与WebSocket
Socket与WebSocket都是网络通信中的重要概念,但它们在原理、应用场景及特性上存在显著的差异。以下是对两者的详细比较: 一、Socket 定义:Socket(套接字)是计算机网络中的一个抽象层,它允许应用程序通过网…...
Springboot3整合Redis
书接上篇《Redis 安装篇(阿里云服务器)_阿里云安装redis-CSDN博客》,安装好Redis后,就需要在springboot项目中使用Redis了。 一、SpringBoot整合Redis 1.添加坐标 <!--redis--> <dependency><groupId>org.sp…...
Java CountDownLatch 用法和源码解析
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…...
微信小程序3-显标记信息和弹框
感谢阅读,初学小白,有错指正。 一、实现功能: 在地图上添加标记点后,标记点是可以携带以下基础信息的,如标题、id、经纬度等。但是对于开发来说,这些信息还不足够,而且还要做到点击标记点时&a…...
Android 消息队列之MQTT的使用:物联网通讯,HTTP太重了,使用MQTT;断网重连、注册、订阅、发送数据和接受数据,实现双向通讯。
目录: 问题MQTT是什么以及为什么使用如何使用:第一阶段、基础功能如何使用:第二阶段、增加断网重连如何使用:第三阶段、封装 一、问题 在开发的时候,我们一般都使用Http和后台进行通讯,比如我们是开发物联…...
详解Java数据库编程之JDBC
目录 首先创建一个Java项目 在Maven中央仓库下载mysql connector的jar包 针对MySQL版本5 针对MySQL版本8 下载之后,在IDEA中创建的项目中建立一个lib目录,然后把刚刚下载好的jar包拷贝进去,然后右键刚刚添加的jar包,点击‘添…...
详解C++类与对象(四)
文章目录 1.类型转换1.1 前言1.2 类型转换的性质 2.static成员2.1 前言2.2 static的基本概念 3.友元4.内部类5.匿名对象 1.类型转换 1.1 前言 在C中,由于程序员可以自己显示定义一个新的类。这样就会出现一个问题:程序员自己显示定义的类类型与编译器中…...
使用 postman 传递 binary 类型的图片到后端接口遇到的坑
使用 psotman 传 binary 类型图片报错: -2024-12-04 [http-nio-9090-exec-1] WARN org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required r…...
第9章 大模型的有害性(上)
9.1 引言 本章将探讨大型语言模型(LLMs)可能带来的有害性,重点讨论以下几个方面: 性能差异社会偏见和刻板印象 在后续内容中,还会涉及其他层面的危害,如有害信息、虚假信息、隐私和安全风险、版权问题、…...
计算机视觉——相机标定(Camera Calibration)
文章目录 1. 简介2. 原理3. 相机模型3.1 四大坐标系3.2 坐标系间的转换关系3.2.1 世界坐标系到相机坐标系3.2.2 相机坐标系到图像坐标系3.2.3 像素坐标系转换为图像坐标系3.2.4 世界坐标转换为像素坐标 3.3 畸变3.3.1 畸变类型3.3.1.1 径向畸变(Radial Distortion&a…...
Java爬虫技术全解析:从入门到精通
引言 在信息爆炸的今天,数据成为了最宝贵的资源之一。爬虫技术作为获取网络数据的重要手段,广泛应用于数据采集、信息聚合、市场分析等多个领域。Java作为一种强类型、面向对象的编程语言,以其稳健的性能和跨平台的特性,成为了开…...
leetcode hot100【Leetcode 416.分割等和子集】java实现
Leetcode 416.分割等和子集 题目描述 给定一个非负整数的数组 nums ,你需要将该数组分割成两个子集,使得两个子集的元素和相等。如果可以分割,返回 true ,否则返回 false。 示例 1: 输入:nums [1,5,11,…...
位段详解+代码展示
系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…...
python实现c++中so库调用及dbus服务开发
本期介绍主要分两块,一块是python如何调用so库,另一块是dbus服务的注册与调用; python调用so库 1. c++源码 # test.h文件#include<iostream> using namespace std;extern "C"{ int cacl(int a, int b); struct student{char sname[50];int score;}; stud…...
如何进行GC调优
目录 1、GC是什么? 垃圾回收算法、收集器等 2、优化目标 3、优化策略 这个属于较为开放题目,可以结合自己项目实战出发,体现JVM调优。 1、GC是什么? 垃圾回收算法、收集器等 2、优化目标 (1) 将进入老年代的对象数量降到最低 (2) 减少FullGC的执行…...
JAVA |日常开发中读写TXT文本详解
JAVA |日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用BufferedReader读取1.2 使用Scanner读取 二、写入 TXT 文本2.1 使用BufferedWriter写入2.2 使用PrintWriter写入2.3 字节流写入(FileOutputStream)后转换为字符流(…...
开源模型应用落地-安全合规篇-用户输入价值观判断(三)
一、前言 在深度合规功能中,对用户输入内容的价值观判断具有重要意义。这一功能不仅仅是对信息合法性和合规性的简单审核,更是对信息背后隐含的伦理道德和社会责任的深刻洞察。通过对价值观的判断,系统能够识别可能引发不当影响或冲突的内容,从而为用户提供更安全、更和谐的…...
apache部署若依前后端分离项目(开启SSL)
网站部署之后,大多数需要配置https,所以本章教程,介绍使用apache部署若依前后端项目的时候,如何开启SSL,以及如何配置SSL证书。 一、安装ssl模块 默认情况下,ssl模块是没有安装的。需要手动安装,否则直接配置SSL模块的时候,会报错。 sudo yum install mod_ssl二、查询s…...
VMware Workstation Pro安装教程 (全图文保姆级)
一、前言 系统:Windows 11时间:2024/12/04需求:注册:broadcom(邮箱)难点:在官网找到下载链接 二、说明 建议前往官网(https://www.vmware.com)下载,可能加…...
【机器学习】—Transformers的扩展应用:从NLP到多领域突破
好久不见!喜欢就关注吧~ 云边有个稻草人-CSDN博客 目录 引言 一、Transformer架构解析 (一)、核心组件 (二)、架构图 二、领域扩展:从NLP到更多场景 1. 自然语言处理(NLP) 2…...
Linux权限机制深度解读:系统安全的第一道防线
文章目录 前言‼️一、Linux权限的概念‼️二、Linux权限管理❕2.1 文件访问者的分类(人)❕2.2 文件类型和访问权限(事物属性)✔️1. 文件类型✔️2. 基本权限✔️3. 权限值的表示方法 ❕2.3 文件访问权限的相关设置方法✔️1. ch…...
【数据集】细胞数据集:肿瘤-胎儿重编程的内皮细胞驱动肝细胞癌中的免疫抑制性巨噬细胞(Sharma等人)
引用此数据集: Sharma, Ankur (2020), “Onco-fetal reprogramming of endothelial cells drives immunosuppressive macrophages in Hepatocellular Carcinoma (Sharma et al)”, Mendeley Data, V1, doi: 10.17632/6wmzcskt6k.1 下载地址:Onco-feta…...
LangChain学习笔记(一)-LangChain简介
LangChain学习笔记(一)-LangChain简介 langChain是一个人工智能大语言模型的开发框架,主要构成为下图。 一、核心模块 (一)模型I/O模块 负责与现有大模型进行交互,由三部分组成: 提…...
【Dubbo03】消息队列与微服务之dubbo-admin 二进制与编译安装
实战案例:二进制安装 dubbo-admin 新版用Golang重构,提供了二进制包,可以直接部署 #下载二进制包 [rootubuntu2204 ~]#wget https://github.com/apache/dubbo-admin/releases/download/0.5.0/apache-dubbo-admin-0.5.0-bin-release.tar.gz …...
常见问题QA的前端代码
这个的后端代码参见此文 使用语言向量建立常见问题的模糊搜索-CSDN博客https://blog.csdn.net/chenchihwen/article/details/144207262?spm1001.2014.3001.5501 这段代码实现了一个简单的问答页面,页面分为左右两部分,左侧用于展示对话记录,…...
【Java基础面试题010】Java中的基本数据类型有哪些?
相关知识补充:《Java从入门到精通(JDK17版)》_尚硅谷电子书.pdf Autism_Btkrsr/Blog_md_to_pdf - 码云 - 开源中国 (gitee.com) 回答重点 Java提供了8中基本数据类型 整型: byte:占用1字节,取值范围 -128 到 127short&#x…...
记录部署dvwa靶场踩的几个坑
DVWA reCAPTCHA key: Missing 解决方法:网上随便copy一个,粘贴到config.inc.php配置文件里,具体我也是参考这篇文章的:DVWA下载、安装You dont have permission to access this resource.Server unable to read htaccess file, de…...
【Pytorch】torch.reshape与torch.Tensor.reshape区别
问题引入: 在Pytorch文档中,有torch.reshape与torch.Tensor.reshape两个reshape操作,他们的区别是什么呢? 我们先来看一下官方文档的定义: torch.reshape: torch.Tensor.reshape: 解释: 在p…...
GPT vs Claude到底如何选?
美国当地时间6月20日,OpenAI的“劲敌”Anthropic公司发布了最新模型Claude 3.5 Sonnet。据Anthropic介绍,该模型是Claude 3.5系列模型中的首个版本,也是Anthropic迄今为止发布的“最强大、最智能”的模型。它不仅在性能上超越了竞争对手和自家…...
基于C++实现的(控制台)双人俄罗斯方块小游戏
基于win32控制台应用程序的双人俄罗斯方块小游戏 1. 课题概述 1.1 课题目标和主要内容 使用visual studio 2015在win32控制台应用程序下用多线程实现双人同时进行俄罗斯方块的桌面游戏。最终将要完成的效果如图1.1所示,左右共两片工作区,也是游戏的主…...
Linux-虚拟环境
文章目录 一. 虚拟机二. 虚拟化软件三. VMware WorkStation四. 安装CentOS操作系统五. 在VMware中导入CentOS虚拟机六. 远程连接Linux系统1. Finalshell安装2. 虚拟机网络配置3. 连接到Linux系统 七. 虚拟机快照 一. 虚拟机 借助虚拟化技术,我们可以在系统中&#…...
uniapp开发微信小程序笔记10-触底加载
前言: 触底加载需求描述: 经常在做一些商品列表页的时候,如果一次性加载大量数据会影响性能,一般都是先加载10-20条,等用户向下滑到底部时再加载新的数据并渲染上去。 1、官方提供了一个API:onReachBott…...
Pytest --capture 参数详解:如何控制测试执行过程中的输出行为
--capture 选项用于控制测试用例执行过程中标准输出(stdout)和标准错误输出(stderr)的捕获行为。 --capture 的选项值: fd(默认) 捕获文件描述符级别的输出(stdout 和 stderr&#x…...
JMeter实时性能压测可视化系统整合
一、相关工具简介: JMeter、Grafana 和 InfluxDB 结合实时地收集、分析和展示性能测试数据,进行更好地理解系统的性能表现,及时发现潜在问题并进行优化。 1,JMeter 实时生成性能数据,并将其发送到 InfluxDB 进行存储。2,InfluxDB 存储的数据。3,通过Grafana的仪表板,用…...
USB 声卡全解析:提升音频体验的得力助手
在当今数字化的时代,音频领域的追求愈发多元。无论是热衷聆听高品质音乐的爱好者,还是在专业音频工作中精雕细琢的人士,亦或是在游戏世界里渴望极致音效沉浸的玩家,都始终在寻觅能让音频体验更上一层楼的妙法。而 USB 声卡&#x…...
GoReplay开源工具使用教程
目录 一、GoReplay环境搭建 1、Mac、Linux安装GoReplay环境 二、GoReplay录制与重播 1、搭建练习接口 2、录制命令 3、重播命令 三、GoReplay单个命令 1、常用命令 2、其他命令 3、命令示例 4、性能测试 5、正则表达式 四、gorepaly组合命令 1、组合命令实例 2、…...
Qt开源控件:图像刻度轴绘制器 (附源码)工程项目私信博主
项目简介 图像刻度轴绘制器是一款基于 Qt/C 开发的小型绘图工具,旨在实现带有刻度轴的图像显示功能。该项目主要用于需要精确测量或标注图像坐标的场景。通过左侧和底部的坐标轴以及对应的刻度线,可以直观地了解图像内容在二维空间中的位置。 项目功能 …...
下载 M3U8 格式的视频
要下载 M3U8 格式的视频(通常是 HLS 视频流),可以尝试以下几种方法: 方法 1:使用下载工具(推荐) 1. IDM(Internet Download Manager): 安装 IDM 并启用浏…...
Mock.js的学习使用
Mock.js 介绍:是一个功能强大的JavaScript库,用于模拟接口请求和生成随机数据。 作用: 帮助开发者独立开发、前后端分离快速原型验证测试异常情况增加单元测试的真实性 原理: 通过拦截XMLHttpRequest或fetch等网络请求&#x…...