作者小头像 Lv.3
235 成长值

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据
个人勋章
TA还没获得勋章~
成长雷达
235
0
0
0
0

个人资料

个人介绍

这个人很懒,什么都没有留下

感兴趣或擅长的领域

暂无数据

达成规则

发布时间 2026/10/27 14:53:18 最后回复 yd_224417480 2026/10/27 14:55:30 版块 开发者空间
35 1 0
他的回复:
38 元这个价不是标准售价,是新人特惠里的限量档,所以「什么时候开抢」要分两层看:活动什么时候有,以及具体几点放量。 一、活动的时间节奏1. 新人特惠页常年挂着,但 38 元这一档是分批放量的,不是随时能下单;2. 大促节点(618、双 11、开年采购季、云上嘉年华)场次最密、库存最多;3. 平常日子一般是每天固定几个整点场,每场限量,卖完当天不再补。 二、怎么第一时间知道开抢时刻1. 活动页上会直接写「每日 10:00 开抢」或「限时秒杀」,以页面为准;2. 页面上有开抢提醒 / 订阅按钮,点了会推送通知,这是最靠前的一手提醒;3. 大促前华为云开发者社区一般会发预告帖,提前几天公布场次;4. 手机 App 的活动页有时比网页端早几分钟显示库存,两个端可以同时守。 三、好不好抢入门档(1 核 1G、1 核 2G,买一年)价格最低、关注度最高,热门区域(北京四、上海一、广州)通常几十秒内就显示已抢光;冷门区域(乌兰察布、贵阳、芜湖这类)和非热门规格库存留得久一些。大促期间库存多,反而比平常日子好抢。 四、抢之前先做完这三件事1. 账号完成实名认证、绑好支付方式——这是「抢到了却付不了款」最常见的原因;2. 提前进选配页,区域、规格、系统盘、带宽全部选好,停在「立即购买」之前;3. 开抢瞬间直接提交,出现排队页面不要刷新、不要回退,等它自己跳转。 五、容易吃亏的几点1. 38 元一般只含系统盘和 1M 固定带宽,数据盘、带宽升级、公网 IP 都是另外计费;2. 续费按原价,长期用要把一年后的成本一起算进去;3. 一个账号限购 1 台,参加过同类新人活动的账号通常不能再买;4. 部分档位只对企业认证或学生认证开放,个人号看不到这部分库存。 六、如果只是想练手或做实验开发者空间的免费资源、云实验的沙箱完全够用,没必要等这个价;学生认证和初创计划另有周期更长的低价方案。 最后一句:具体哪天上货、几点开抢、限哪些区域和规格,活动页当天的公示是唯一准确的口径,外部流传的「内部时间表」都不作数。按活动页 + 开抢提醒 + 提前选配这套流程走,比临时盯着页面刷成功率高得多。
发布时间 2026/10/27 11:01:23 最后回复 yd_220055865 2026/10/29 19:41:53 版块 开发者空间
103 21 0
他的回复:
O(1) 的关键是「查得快」和「挪得快」各用一个结构负责:哈希表负责 O(1) 定位,双向链表负责 O(1) 摘除与插入。少任何一个都退化成 O(n)。 一、为什么必须是双向链表单链表删除节点要先找到前驱,那是 O(n);数组移动元素同样是 O(n)。双向链表每个节点存 prev/next,删除时直接改前后指针,O(1)。所以 get 命中后要把节点挪到表头(表示最近使用),put 超容量时从表尾淘汰最久未使用的那个。 二、最短实现(Python,生产可用)```pythonfrom collections import OrderedDictimport threading class LRUCache:    def __init__(self, capacity: int):        self.cap = max(capacity, 0)        self.d = OrderedDict()        self.lock = threading.RLock() # OrderedDict 本身不是线程安全的     def get(self, key):        with self.lock:            if key not in self.d:                return None            self.d.move_to_end(key) # 命中即提到最近使用端            return self.d[key]     def put(self, key, value):        if self.cap == 0:            return        with self.lock:            if key in self.d:                self.d.move_to_end(key)            self.d[key] = value            if len(self.d) > self.cap:                self.d.popitem(last=False) # 淘汰最久未使用````move_to_end` + `popitem(last=False)` 都是 O(1),整体就是 O(1)。 三、手写版本(面试常考,也便于嵌入不支持有序字典的语言)```pythonclass Node:    __slots__ = ('k', 'v', 'prev', 'next')    def __init__(self, k=None, v=None):        self.k, self.v = k, v        self.prev = self.next = None class LRU:    def __init__(self, cap):        self.cap, self.size = cap, 0        self.head, self.tail = Node(), Node() # 两个哨兵,省掉大量判空        self.head.next, self.tail.prev = self.tail, self.head        self.map = {}     def _remove(self, n):        n.prev.next, n.next.prev = n.next, n.prev     def _add_front(self, n):        n.prev, n.next = self.head, self.head.next        self.head.next.prev = n        self.head.next = n     def get(self, k):        if k not in self.map:            return -1        n = self.map[k]        self._remove(n); self._add_front(n)        return n.v     def put(self, k, v):        if self.cap = 0:            return        n = self.map.get(k)        if n:            n.v = v            self._remove(n); self._add_front(n)            return        n = Node(k, v)        self.map[k] = n        self._add_front(n)        self.size += 1        if self.size > self.cap:            old = self.tail.prev            self._remove(old)            del self.map[old.k]            self.size -= 1``` 四、四个容易踩的边界1. **get 也要写**:命中后不挪到表头,就变成了 FIFO,命中率会明显下降。这是最常被写错的一处。2. **put 已存在的 key 不算新元素**:要更新值并挪到表头,size 不变,否则会误淘汰。3. **capacity = 0 / 负数**:要显式处理,否则 `popitem` 会对空表抛异常。4. **线程安全**:Python 里 OrderedDict 的复合操作(判断 + 取值 + 移动)不是原子的,必须加锁;Java 单锁版可直接参考 `LinkedHashMap(accessOrder=true)` 覆写 `removeEldestEntry`,但高并发下锁竞争明显。 五、并发场景的现实取舍- **分段锁**:按 key 哈希分 N 个桶,各自一把锁+一条链表,锁竞争降到 1/N,代价是全局淘汰顺序不精确。Guava Cache 就是这么做的。- **近似 LRU**:Redis 的 `allkeys-lru` 并不维护全局链表,而是每次随机采样若干个 key,淘汰其中最久未用的,换取内存与吞吐。所以 Redis 的 LRU 是「近似」的,命中率略低于严格 LRU。- **读多写多会放大争用**:每次 get 都要改链表指针,本质是写操作。高 QPS 下可以考虑 CLOCK / 二次机会算法,用访问位替代链表移动。 六、怎么验证与调优- 单测至少覆盖:容量 0、重复 put、命中后顺序变化、连续淘汰。- 统计 `hits / (hits + misses)`,别只看平均值;把命中率和容量画成曲线,能判断容量该加到多少。- 缓存击穿要配「单飞」(同一 key 只放一个请求去回源),否则 O(1) 的 LRU 挡不住数据库被打穿。 一句话总结:哈希表管定位、双向链表管顺序、哨兵节点省判空、get 也要移动节点;容量、并发和淘汰精度才是真正决定线上效果的三个变量。
他的回复:
覆盖率卡在 60% 左右,八成不是 AI「不会写」,而是**它只写了正常路径**。按下面三步走,一般两三轮就能推到 75% 以上。 ## 一、先看报告,别凭感觉补 跑一次 JaCoCo(Java)或 coverage.py(Python),打开 HTML 报告,把「红色」的方法逐条抄出来。通常就是这几类: - **异常分支**:catch / finally / 校验失败返回,AI 默认不写- **依赖外部服务的路径**:DB、HTTP、消息队列——没有 mock,它干脆绕开- **私有方法 / 工具类**:只能通过公共入口间接覆盖- **异步与线程**:sleep、CountDownLatch、线程池回调- **main / 启动类 / DTO / getter-setter**:这类根本不该算进业务覆盖率 看清是「哪一类」再补,比让 AI 整仓重新生成一遍有效得多。 ## 二、把「未覆盖清单」贴回给码道,一次只喂一个类 这是最关键的一点。整仓一次生成,上下文会被截断,AI 只能挑简单的写,覆盖率自然趴在 60%。 做法: 1. 把报告里 missed 的**方法签名 + 所在类**贴进对话,例如   `OrderService.calculateDiscount(Order, User) 未覆盖分支:user.isVip() && order.amount>500`2. 让它「只针对这个方法补测试,必须覆盖 if/else 两个分支,外部依赖用 Mockito mock」3. 生成后立刻跑一次覆盖率,把这批新红的再贴回去 循环 2-3 轮,通常能到 75%+。 ## 三、几个具体技巧 - **异常分支**:`when(repo.findById(1L)).thenThrow(new RuntimeException())`,把 catch 里的兜底逻辑走一遍- **强耦合的类**:构造函数里 `new` 出来的依赖没法 mock,先做小重构(提取参数 / 构造注入),再生成- **私有方法**:优先通过公共方法覆盖;确实绕不开再加 `@VisibleForTesting`- **异步**:用 `CountDownLatch`、`Awaitility` 等待,别用 `Thread.sleep` 硬等- **断言**:只有 `@Test` 没有 assert 的用例,分支覆盖是假的,质量门禁也容易判无效- **确认统计口径**:CodeArts 流水线的覆盖率门禁是否包含所有模块?`jacoco` 的 `includes/excludes`、多模块 `exec` 聚合是否配了?经常是单模块 80% 但被未测模块拉低到 60%- **确认测试真的跑了**:surefire 的命名规则(`*Test` / `*Tests`)、`@Disabled`、被 exclude 的目录,都会让新测试根本没进统计 ## 四、别追 100% DTO、常量、自动生成代码、启动类全部排除;核心业务包做到 70-80% 已经很健康。为了最后 20% 去 mock 一堆边角逻辑,维护成本远大于收益——AI 生成的测试越多,后面改代码时要跟着改的测试也越多。 一句话:**让码道做「定向补红」,不要做「整仓铺量」**。
发布时间 2026/10/26 09:05:37 最后回复 yd_276924060 2026/10/27 10:20:53 版块 开发者空间
70 12 0
他的回复:
规格选型的核心不是「哪个便宜」,而是「先算清瓶颈在哪,再按瓶颈选族,最后用计费方式省钱」。分四步: 1)先看业务瓶颈是 CPU、内存还是网络/磁盘- CPU 密集型(编译、转码、加解密、高并发 Web):选计算型(c 系列),vCPU 与内存比 1:2;- 内存型(Redis、缓存、ES、Java 大堆应用):选内存型(m/r 系列),1:4 或 1:8;- 均衡业务(普通 Web、中小数据库):通用型(s 系列),1:1 或 1:2;- 磁盘 IO 重的(MySQL 高并发写、日志检索):优先把预算花在云盘上(SSD/极速型),而不是堆 CPU。 2)区分共享型与独享型t 系列(如 t6)是共享型 + CPU 积分制,便宜但有积分耗尽后的性能骤降,只适合测试环境、低负载站点、夜间批处理。生产环境尤其是对外服务,建议直接从独享型(s/c/m)起步,避免「凌晨跑批后白天变慢」这种难排查的问题。 3)用规格族 + 弹性伸缩替代一步到位买大先按预估峰值选一档,再配弹性伸缩(按 CPU/连接数触发)+ 负载均衡。大多数业务的峰值是周期性、短时的,用伸缩把峰值摊开,比长期养一台大规格便宜得多。能容忍中断的离线任务,可以考虑竞价/抢占式实例,成本能降到按需的 1/3 左右。 4)计费方式与磁盘、带宽一起算总账- 长期稳定跑:包年包月(1 年约 8.3 折,3 年更低);- 短期项目/压测:按需 + 快照回滚;- 别忘了带宽和云盘也占成本:带宽按流量计费对突发流量友好,固定带宽对持续流量便宜;系统盘用高 IO 云盘,数据盘按实际增长扩容。 最后一条经验:选型别只靠理论,起两台候选规格跑一遍真实压测(比如用 wrk 打自己的接口,或者跑一遍建库导入),看 P99 延迟和 CPU 利用率落点。很多「感觉不够用」其实是数据库没索引、连接池太小,换更大的机器只是把问题往后推。
发布时间 2026/10/26 01:19:29 最后回复 yd_242602676 2026/11/12 06:12:37 版块 开发者空间
343 29 0
他的回复:
本质是「调度」和「执行」耦合在一台机器上,多副本之后每台都认为自己该跑。三种主流解法,按改动成本从低到高: 1. **分布式锁**(最快能落地):任务开始前用 Redis 抢锁,抢到才执行。命令形如 SET lock-key 实例ID NX EX 300,抢不到直接 return。华为云上用 DCS Redis 即可。   注意两点:锁的过期时间要大于任务最长执行时间,长任务需要看门狗续期;执行完在 finally 里比对 value 再删(用 Lua 脚本),避免删掉别人的锁。 2. **数据库唯一约束**(最可靠):建一张执行记录表,对「任务名 + 计划触发时间」建唯一索引,插入成功的那台才执行。   好处是不依赖额外组件,重复执行也会被数据库挡住;缺点是每个任务多一次写库。 3. **调度中心集中派发**(最彻底):用 XXL-JOB、ElasticJob、Quartz 集群模式这类有调度端的框架,由调度端选一台执行;或者直接把定时任务改成函数工作流的定时触发器,触发器本身就是单次触发,天然避免多副本重复。 几条实操经验:- 不管用哪种,**任务本身要做成幂等**。锁会失效、实例会被 kill,重复执行一次不能产生脏数据。- 别用「判断当前时间是否等于 10:00」这种写法,机器时钟漂移会出现漏跑或双跑,用统一的调度时间或上层传入的触发时间。- 锁的 key 里带上任务名和计划时间,这样手动补跑和正常调度互不干扰。- 如果任务很短(秒级)而副本多,注意 GC 停顿导致的锁过期竞争,锁过期时间不要贴着任务耗时设置。
发布时间 2026/10/25 10:09:32 最后回复 yd_274788088 2026/10/30 13:58:50 版块 开发者空间
314 29 0
他的回复:
安全组只是其中一层,FunctionGraph 访问 VPC 内的 RDS 通常要同时满足下面几条,建议按顺序排查: 1. 函数是否真的绑定了 VPC 和子网:函数详情 →「配置」→「网络」,必须选与 RDS 同 VPC 的子网。这一项没配,函数走的是公网出口,内网地址必然超时。2. 委托权限:绑定 VPC 需要函数委托具备创建/删除 ENI 的权限(VPC Administrator 或包含 vpc:ports 的自定义策略)。委托不对时函数能调用,但 ENI 建不起来,日志里会有 create ENI failed 之类的报错。3. 安全组方向:函数用的是你指定的安全组,要**出方向**放通 RDS 端口(3306 / 5432 / 8635);RDS 侧如果按安全组控制,入方向要放通**函数的安全组 ID**,而不是某个 IP——函数的 ENI 地址是动态的,按 IP 加白名单迟早会失效。4. RDS 白名单模式:如果 RDS 用的是白名单而不是安全组,只能加子网网段,且子网内所有资源都会获得访问权,安全性差,建议换成安全组方式。5. 网络可达性:RDS 在另一个 VPC 或 IDC 时,需要 VPC 对等连接、云连接或企业路由器,并且两端路由表都要有指向对端的路由;只在一侧加路由是最常见的错。6. DNS:用 RDS 内网域名时,函数解析依赖 VPC 内 DNS;先用 IP 直连验证,能通再接域名,可以快速区分是网络问题还是域名解析问题。7. 子网可用 IP 耗尽:ENI 建不出来,函数执行直接失败,在子网详情里看剩余可用 IP。8. 函数超时时间:默认 3 秒,首次建连加冷启动很容易超过。先把超时调到 30 秒再测,避免把「慢」误判成「不通」。 排查顺序建议:先用函数日志确认有没有 ENI 报错,再在函数代码里用 socket 连一下 rds_ip:3306 测 TCP,通了但认证失败就是账号或白名单问题,不通就是安全组或路由问题。
他的回复:
核心是"同一个业务请求,服务端只认第一次",落地分三层,缺一层在高并发下都会漏。 1. 客户端带幂等键:由发起方生成 Idempotency-Key(UUID 即可),同一个业务动作重试时复用同一个键,而不是每次生成新的。订单场景更简单:订单号由客户端生成,服务端拿它当唯一键,天然幂等。2. 服务端建档去重:请求进来先写幂等表(key、request_hash、status、response_body、过期时间),对 key 建唯一索引。插入成功的那一个请求继续处理,插入冲突的直接返回"处理中"或已完成的响应。别用 SELECT 再 INSERT 判断,并发下必然穿透。3. 业务侧兜底:数据库唯一约束 + 状态机。比如"创建订单"表对 order_no 建唯一索引,"支付"用乐观锁 update ... where status='待支付' 并检查影响行数=1,行数为 0 说明已经被处理过。4. 并发窗口用锁收敛:Redis SETNX + 过期时间(比如 30s)挡住同一个 key 的并发请求,处理完写回结果并把 TTL 延长到 24h;锁只是减少重复计算,唯一索引才是最终保证。5. 重试语义要写清楚:超时一律视为"结果未知",不能当失败直接重放,应该先用查询接口按业务号确认,再决定重试;5xx 可重试,4xx 不要重试。6. 幂等键要有生命周期:处理中/成功/失败三种状态都要存,失败且可重试的允许同 key 重放,成功的直接返回缓存的响应体,保证客户端两次拿到的结果完全一致;幂等表按时间分区或定期清理,别无限膨胀。 常见的三个错误:用时间戳或随机数做幂等键(等于没有)、只在网关做限流不做业务去重、幂等表里只存 key 不存响应(重试时返回 200 但内容是空的)。
发布时间 2026/10/24 01:25:34 最后回复 yd_261869404 2026/10/25 22:52:41 版块 开发者空间
53 7 0
他的回复:
结论:给他一个"只有费用中心只读权限、没有任何云服务权限"的用户组就够了,IAM 是默认拒绝,没授权的资源他连列表都打不开。 具体做法:1. IAM 控制台 → 用户组 → 新建"finance-readonly" → 创建子账号(勾"控制台访问",不要勾"编程访问",避免他拿到 AK/SK 从 API 侧绕过页面);2. 给这个用户组只授费用中心相关的系统策略。策略列表里搜"BSS",选只读的那条(费用中心只读权限 / BSS ReadOnlyAccess,具体名称以控制台为准),作用范围选"全局服务";3. 不要授 Tenant Guest(全局只读)这种策略——它虽然不能改,但能读到 ECS、OBS、VPC 等几乎所有服务的列表和配置,跟"只看账单"不是一回事;4. 授权范围如果是企业项目,记得把要看的账套企业项目都加进去,否则他登录后在费用中心是按企业项目过滤的,看不到别的项目账单。 几个容易忽略的点:- 费用中心只读能看到金额和发票信息,属于财务敏感数据,建议同时开启登录 MFA、设置密码有效期,并把子账号的登录 IP 通知打开;- 只读权限下也能导出账单(费用中心 → 账单 → 导出到 OBS),导出目标桶要在他的权限里能写;如果不想让他导出,就别给 OBS 写权限,导出会失败但不影响在线查看;- 想再细一点,可以把"账单查看"和"发票管理"拆成两个组,只给对账同学前者;- 验证方法:用子账号登录后直接访问 https://console.huaweicloud.cn/ecm/ 这类资源页面,应该只看到无权限提示,而费用中心能正常打开——这一步能确认没有多授权。