高并发系统实战课
徐长龙
前微博架构师、极客时间架构师
11663 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 30 讲
结束语&结课测试 (2讲)
高并发系统实战课
15
15
1.0x
00:00/00:00
登录|注册

20|数据引擎:统一缓存数据平台

大公司的数据支撑架构
数据支撑平台的特点
中间件工作原理回顾
提交数据加工lua脚本
申请数据访问授权
数据缓存平台架构
多种数据引擎提供不同的数据支撑服务
改进消息监听服务
L1缓存和集群缓存的选择
热点缓存统计和续约流程
判断热点缓存
统计查询次数
数据库和缓存记录最后更新时间
多表数据组合和缓存刷新
并发查询限制
缓存穿透问题的预防
缓存查询服务
中间件工作原理
实体数据缓存的设计
预防缓存穿透查询攻击
将用户信息写入缓存
缓存未命中,从数据库获取用户信息
缓存命中,返回用户信息
从缓存中获取用户信息
思考题
总结
多数据引擎平台
关系数据缓存
L1缓存及热点缓存延期
实体数据主动缓存
临时缓存的实现
数据引擎:统一缓存数据平台

该思维导图由 AI 生成,仅供参考

你好,我是徐长龙。
通过前四章,我们已经了解了不同类型的系统如何优化,其中有哪些关键技术点。不过除了这些基础知识之外,我们还要了解大型互联网是如何设计支撑一个高并发系统的。所以,在这个章节里我精选了几个案例,帮助你打开视野,看看都有哪些实用的内网服务设计。
任何一个互联网公司都会有几个核心盈利的业务,我们经常会给基础核心业务做一些增值服务,以此来扩大我们的服务范围以及构建产业链及产业生态,但是这些增值服务需要核心项目的数据及交互才能更好地提供服务。
但核心系统如果对增值业务系统做太多的耦合适配,就会导致业务系统变得十分复杂,如何能既让增值服务拿到核心系统的资源,又能减少系统之间的耦合?
这节课我会重点带你了解一款内网主动缓存支撑的中间件,通过这个中间件,可以很方便地实现高性能实体数据访问及缓存更新。

回顾临时缓存的实现

我们先回顾下之前展示的临时缓存实现,这个代码摘自之前的第二节课
// 尝试从缓存中直接获取用户信息
userinfo, err := Redis.Get("user_info_9527")
if err != nil {
return nil, err
}
//缓存命中找到,直接返回用户信息
if userinfo != nil {
return userinfo, nil
}
//没有命中缓存,从数据库中获取
userinfo, err := userInfoModel.GetUserInfoById(9527)
if err != nil {
return nil, err
}
//查找到用户信息
if userinfo != nil {
//将用户信息缓存,并设置TTL超时时间让其60秒后失效
Redis.Set("user_info_9527", userinfo, 60)
return userinfo, nil
}
// 没有找到,放一个空数据进去,短期内不再访问数据库
// 可选,这个是用来预防缓存穿透查询攻击的
Redis.Set("user_info_9527", "", 30)
return nil, nil
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了数据引擎的设计与实现,重点讨论了通过中间件实现高性能实体数据访问及缓存更新的方法。首先介绍了临时缓存的实现方式,然后详细讨论了实体数据主动缓存的设计原理和实现方式,包括通过canal监控MySQL数据库的binlog日志,实现数据变更的实时缓存更新。此外,还讨论了缓存查询服务的配套实现,以及针对缓存穿透问题的预防措施。文章还提出了对L1缓存及热点缓存的延期进行改进,通过统计查询次数判断热点缓存,并实现热点缓存的定期推送和续期操作。最后,探讨了关系数据缓存的改进,包括引入多种数据引擎共同提供不同的数据支撑服务。整体而言,本文通过实际案例和技术原理,深入探讨了数据引擎的设计与优化,为读者提供了一系列实用的内网服务设计思路和技术实现方法。文章还介绍了多数据引擎平台的架构图,强调了数据引擎和缓存以及数据更新之间的关系,以及统一缓存数据平台的实现方案,为读者提供了对数据引擎和缓存技术的全面认知。文章最后提出了思考题,引发读者对BloomFilter的hash列表更新到客户端的讨论。整体而言,本文内容丰富,涵盖了数据引擎设计与实现的多个方面,对于想要深入了解数据引擎技术的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 黄堃健
    老师,L1 缓存使用 BloomFilter 来减少 L1 缓存查询,那么 BloomFilter 的 hash 列表如何更新到客户端呢? 老师 我是这样推测的, 第一个客户端不知道它是一个热key,服务端返回数据的时候,出了返回业务数据之外,带上标志,告诉它是热key。 这样,客户端知道了它以后可以通过直接到L1缓存查询,自己主动更新自身的BloomFilter 的 hash列表。

    作者回复: 你好,堃健,这个实现有多种方式。举个例子我们当时使用kafka做了广播,定期发送消息告诉缓存中间层所有最新合并后的值,当然也可以按你说的方式去做,缺点是新注册的服务会穿透(因为他需要有办法拿到历史所有的key)。

    2024-03-13归属地:广东
  • piboye
    多数据引擎平台图中,第一层的临时查询缓存和第二层中的redis集群的差别是什么?

    作者回复: 第一层缓存流量更大,比如可以10台业务服务器或者3台业务服务器启动一个redis供他们使用,相对我们核心业务使用的缓存,更像外存

    2023-02-18归属地:广东
    3
  • piboye
    lua脚本生态太小了,我有一个想法 用quicjs做脚步引擎,对外接口使用http,很多聚合服务可以用graphql引擎替代了。老师觉得怎么样?

    作者回复: 你好,只要项目风险可控,都可以尝试一下

    2023-02-17归属地:广东
  • piboye
    这节课的图太有价值了👍

    作者回复: 后续还会持续加餐~:)

    2023-02-17归属地:广东
  • 徐石头
    这正是我需要的,每个业务对象都要写个差不多的过程代码确实很繁琐:先查缓存,查不到去查DB,再同步数据到缓存,然后返回客户端。无法对缓存做集中管理,很粗糙分散在各个服务业务代码中,我的设想是统一mysql和redis作为一个数据源,业务层不用关注基础设施是mysql还是Redis,只需要从数据源读取。 如果要做一个这样的数据缓存平台,应该怎么开始,从哪里入手,有哪些资料参考?

    作者回复: 你好,很高兴收到留言,这里可以先看看canal,然后看看lua引擎

    2022-12-16归属地:内蒙古
  • 门窗小二
    跟Layne想法一致!主要是根据此次请求的返回结果,也就是数据平台需要特别告诉客户端这次请求的是热点key。再者结合热点key的ttl 周期拉取更新列表

    作者回复: 你好,那么,如何保证随时更新

    2022-12-08归属地:内蒙古
  • Layne
    被动方式:根据缓存返回状态,客户端更新列表。 主动方式:定期去拉一下列表

    作者回复: 你好,layne如果有更新,如何加强一致性

    2022-12-07归属地:内蒙古
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部