2.1.1 Golang主动式内存缓存的优化探索之路
Golang主动式内存缓存的优化探索之路 安晏伯 学而思网校 技术专家 目 录 问题引入 01 难点攻克 02 主动式内存缓存框架 03 总结 04 问题引入 第一部分 为什么能有极致的性能? 01. 如何优化? 解决了哪些技术难题? 主动式内存缓存 如何优化? 极致的性能 除了网络IO,与Redis有什么区别? 复杂的查询怎么办? 02. 传统的Cache很难 • 复杂的查询场景,内存数据如何高效组织? • 主动式内存缓存,如何保证数据实时性? • 数据太多,内存不够用,如何进行存储扩展? 通过本次分享,可以带来哪些收获? 难点攻克 第二部分 使用内存缓存 数据一致性如何保证? 一致性 01. 缓存如何保证更新,如何与数据库同步 同步、更新 被动方式 缓存过期 定期同步 主动方式 监听数据变化 数据加载,更新 热数据的交换 冷 热 新 系 统 历 史 数 据 冷数据、数据量多 缓存成本大、命中低、收益小 热 数 据 当前系统中的热点数据 命中率高 系 统 新 增 数 据 近期新增数据,较大概率命中 存储空间 缓存性能 冷热可交换,引擎可扩展 06. 冷热数据交换,通过栈式缓存结构,实现多级缓存策略 语言的局限性 07. 基于golang语言,内存对象超过百万量级后出现的GC耗时问题0 码力 | 48 页 | 6.06 MB | 1 年前32.2 龚浩华(月牙寂)p2p缓存系统 基于Golang的Aop设计模式
LOGO p2p缓存系统 基于Golang的Aop设计模式 龚浩华 QQ 29185807 月牙寂 背景 v Web缓存(类似CDN技术) § 网页、图片 § 普通下载 § 普通视频 v P2P缓存 § 下载(bt等) § 视频(qvod、百度影音等) 背景 v P2P缓存好处 § 一次获取,多次利用 § 减少局域网出网流量 减少局域网出网流量 § 提升用户体验 背景 v P2P缓存服务器(基于c++开发) § 代码量大 § 协议数量多 § 耦合性高 § 潜在bug多 重构 or 重新推倒? 背景 现实世界是怎么样的 分布式、并发 职能化、松散化 自组织、智能化 程序框架是否也可以这样? OOP v C++对象代码运行 仍然存在不确定性 现实世界的设计模式直接可以拿来借鉴 P2P缓存框架 P2P缓存框架 1、入口监听模块 常驻 功能监听识别连接 2、任务管理模块 常驻 管理任务、分流client P2P缓存框架 3、任务模块 文件缓存度:是否需要下载 文件热点程度:是否热点0 码力 | 29 页 | 338.20 KB | 1 年前3Hello 算法 1.1.0 Go版
3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.5 小结 . . . . . 序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余空闲 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 383 页 | 18.48 MB | 1 年前3Hello 算法 1.0.0 Golang版
3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.5 小结 . . . . . ,程序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 � 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉 及地址空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则无法被其他程序同时使用了。因此在数据结 构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余空闲 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 382 页 | 17.60 MB | 1 年前3云原生go-zero微服务框架设计思考
对业务开发友好,封装复杂度 go-zero是如何设计的 客户端 API端 Service端 缓存层 iOS PC web 安卓 HTTP协议 日志记录 加解密 鉴权&防重放 异常捕获 并发控制 数据统计 监控报警 链路跟踪 自动降载 自动熔断 超时控制 gRPC协议 日志记录 缓存控制 调用鉴权 异常捕获 并发控制 数据统计 监控报警 链路跟踪 自动降载 自动熔断 超时控制 商品 订单 物流 如何设计缓存 ● 缓存穿透,不存在的数据 ● 缓存一分钟 ● 缓存击穿,热点key过期 ● 只拿一次数据,共享结果 ● 缓存雪崩,大量缓存同时过期 ● 过期时间设置随机偏差 service redis1 mysql/mongo clusters redis2 redis3 类似DB的缓存索引方式 ● 不允许不过期的缓存 ● 分布式缓存,易伸缩 ● 自动生成,自带统计 自动生成,自带统计 缓存的最佳实践 ● 协议选择 - gRPC ● 服务发现方式 - etcd ● 负载均衡 - p2c ewma ● 支持自定义中间件 service2 etcd service1 注册上报 watch发现 rpc call rpc服务层 - zRPC Power of Two Choices ● 默认算法 ● 当前请求数 ● 处理时长 ● 指数加权移动平均0 码力 | 29 页 | 5.70 MB | 9 月前3Hello 算法 1.2.0 简体中文 Go 版
3 列表 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.4 内存与缓存 * . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 4.5 小结 . . . . . 序便可以访问内存中的数据。 图 3‑2 内存条、内存空间、内存地址 Tip 值得说明的是,将内存比作 Excel 表格是一个简化的类比,实际内存的工作机制比较复杂,涉及地址 空间、内存管理、缓存机制、虚拟内存和物理内存等概念。 内存是所有程序的共享资源,当某块内存被某个程序占用时,则通常无法被其他程序同时使用了。因此在数 据结构与算法的设计中,内存资源是一个重要的考虑因素。比如,算法所占用的内存峰值不应超过系统剩余 优化数据结构的操作效率。 ‧ 空间效率高:数组为数据分配了连续的内存块,无须额外的结构开销。 ‧ 支持随机访问:数组允许在 ?(1) 时间内访问任何元素。 ‧ 缓存局部性:当访问数组元素时,计算机不仅会加载它,还会缓存其周围的其他数据,从而借助高速缓 存来提升后续操作的执行速度。 连续空间存储是一把双刃剑,其存在以下局限性。 ‧ 插入与删除效率低:当数组中元素较多时,插入与删除操作需要移动大量的元素。0 码力 | 384 页 | 18.49 MB | 9 月前32.游戏战中陪伴助手微服务架构设计与应用
12~17% 400+ 1.23 + 0.849 = 2.08 Gbps - 思考: - 放弃对局缓存 - 仅按照当前玩家状态推荐 - 无法基于对局历史推荐;后续难以扩展 - 缓存功能下沉 - 由重排层也不是业务层存储缓存 - 破坏推荐系统架构,降低复用性 - 裁剪对局历史 - 最多缓存 10 分钟的对局历史 - 不是根本解决方法 - 微服务单体化 - 腾讯文档团队《回归单体成为潮流?腾讯文档如何实现灵活架构切换》 倒排索引 �(�・ 푅� � ) 前缀树 �(�・푙�� 푅� � ) 有向无环图 �(� + 푅� � ) 匹配耗时: 内存不贵,不要浪费 召回效率优化——利用缓存 - Token 组合呈长尾分布,缓存对应策略结果可以节省算力 - 优化效果 - 优化前:约7000核 - 优化后:约2000核 不破坏推荐系统通用性基础上的逻辑改造 重排效率优化——前置过滤 - 优化方向:宁缺毋滥的推荐模式0 码力 | 47 页 | 11.10 MB | 1 年前303. Golang 在隐私计算平台建设中的实践 - 刘敬
执⾏行行元函数后,框架缓存所有返回值 缓存中间数据后触发扫描可以执⾏行行的元函数 (从⽹网络接收数据也会触发) 通过反射异步call元函数 中间数据的缓存map,使⽤用 中间数据的reflect.Type作为key 趣链科技版权所有©2016 – 2021 25 隐私计算算法框架-元函数异步执⾏行行实现 扫描依据:缓存中存在元函数的所有⼊入参 删除扫描出的元函数⼊入参对应的缓存 元函数⼊入参类型重复,框架⽆无法区分注⼊入参数 cover 趣链科技版权所有©2016 – 2021 27 隐私计算算法框架-⽹网络消息处理理 由于元函数的⼊入参中包含由其他参与⽅方发送来的数据,框架需要实现⾃自动将收到的消息 反序列列化并缓存,否则⽆无法进⼊入到元函数调度流程注并⼊入到元对应函数的⼊入参中 趣链科技版权所有©2016 – 2021 28 隐私计算算法框架-⾃自动序列列化⽹网络消息 将reflect.TypeOf(data)0 码力 | 37 页 | 6.20 MB | 1 年前3Go 入门指南(The way to Go)
和追踪 6.5 内置函数 6.6 递归函数 6.7 将函数作为参数 6.8 闭包 6.9 应用闭包:将函数作为返回值 6.10 使用闭包调试 6.11 计算函数执行时间 6.12 通过内存缓存来提升性能 第7章:数组与切片 7.1 声明和初始化 7.2 切片 7.3 For-range 结构 7.4 切片重组(reslice) 7.5 切片的复制与追加 7.6 字符串、数组和切片的应用 和追踪 6.5 内置函数 6.6 递归函数 6.7 将函数作为参数 6.8 闭包 6.9 应用闭包:将函数作为返回值 6.10 使用闭包调试 6.11 计算函数执行时间 6.12 通过内存缓存来提升性能 6.0 函数 链接 第6章:函数(function) - 131 - 本文档使用 书栈(BookStack.CN) 构建 6.1 介绍 每一个程序都包含很多的函数:函数是基本的代码块。 上一节:使用闭包调试 下一节:通过内存缓存来提升性能 6.11 计算函数执行时间 链接 6.11 计算函数执行时间 - 162 - 本文档使用 书栈(BookStack.CN) 构建 6.12 通过内存缓存来提升性能 当在进行大量的计算时,提升性能最直接有效的一种方式就是避免重复计算。通过在内存中缓存和重复利用相同计算 的结果,称之为内存缓存。最明显的例子就是生成斐波那契数列的程序(详见第0 码力 | 466 页 | 4.44 MB | 1 年前3Go 入门指南(The way to Go)
如果您对一段代码进行了所谓的优化,请务必对它们之间的效率进行对比再做出最后的判断。在接下来的 章节中,我们会学习如何进行有价值的优化操作。 6.12 通过内存缓存来提升性能 当在进行大量的计算时,提升性能最直接有效的一种方式就是避免重复计算。通过在内存中缓存和重复利 用相同计算的结果,称之为内存缓存。最明显的例子就是生成斐波那契数列的程序(详见第 6.6 和 6.11 节): 要计算数列中第 n 个数字,需要先得到之前两 fibonacci_memoization.go 就是依照这个原则实现的,下面是计算到第 40 位数字的 性能对比: Go入门指南 - 129 - 本文档使用 看云 构建 普通写法:4.730270 秒 内存缓存:0.001000 秒 内存缓存的优势显而易见,而且您还可以将它应用到其它类型的计算中,例如使用 map(详见第 7 章)而 不是数组或切片(Listing 6.21 - fibonacci_memoization } else { res = fibonacci(n-1) + fibonacci(n-2) } fibs[n] = res return } 内存缓存的技术在使用计算成本相对昂贵的函数时非常有用(不仅限于例子中的递归),譬如大量进行相 同参数的运算。这种技术还可以应用于纯函数中,即相同输入必定获得相同输出的函数。 第7章:数组与切片 Go入门指南0 码力 | 380 页 | 2.97 MB | 1 年前3
共 34 条
- 1
- 2
- 3
- 4