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

17|业务脚本:为什么说可编程订阅式缓存服务更有用?

Go协程访问LState保存的数据
实践建议
Lua脚本引擎的应用
传统缓存服务的局限性
周期任务管理
数据同步的方式
使用RocksDB和SQLite
加载数据的方式
使用Lua调用Golang函数
Lua和Golang数据交换
使用LState对象池管理Lua实例
Lua脚本的管理和统一更新
使用Go语言嵌入Lua实现
实现可编程缓存服务的示意图
优势和特点
自实现数据缓存服务
可编程订阅式缓存服务的优势
传统内存缓存服务的问题
思考题
总结
订阅式数据同步及启动同步
缓存预热与数据来源
变量的交互
Lua脚本统一管理
Lua脚本引擎
缓存即服务
业务脚本
可编程订阅式缓存服务

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

你好,我是徐长龙。
我们已经习惯了使用缓存集群对数据做缓存,但是这种常见的内存缓存服务有很多不方便的地方,比如集群会独占大量的内存、不能原子修改缓存的某一个字段、多次通讯有网络损耗。
很多时候我们获取数据并不需要全部字段,但因为缓存不支持筛选,批量获取数据的场景下性能就会下降很多。这些问题在读多写多的场景下,会更加明显。
有什么方式能够解决这些问题呢?这节课,我就带你了解另外一种有趣的数据缓存方式——可编程订阅式缓存服务。学完今天的内容,相信你会对缓存服务如何做产生新的思考。

缓存即服务

可编程订阅式缓存服务的意思是,我们可以自行实现一个数据缓存服务直接提供给业务服务使用,这种实现能够根据业务的需要,主动缓存数据并提供一些数据整理和计算的服务。
自实现的数据缓存服务虽然繁琐,但同时也有很多优势,除去吞吐能力的提升,我们还可以实现更多有趣的定制功能,还有更好的计算能力,甚至可以让我们的缓存直接对外提供基础数据的查询服务。
自实现缓存功能结构图
上图是一个自实现的缓存功能结构,可以说这种缓存的性能和效果更好,这是因为它对数据的处理方式跟传统模式不同。
传统模式下,缓存服务不会对数据做任何加工,保存的是系列化的字符串,大部分的数据无法直接修改。当我们使用这种缓存对外进行服务时,业务服务需要将所有数据取出到本地内存,然后进行遍历加工方可使用。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

可编程订阅式缓存服务是一种新颖的数据缓存方式,通过自行实现数据缓存服务,可以根据业务需求主动缓存数据并提供数据整理和计算的服务。相比传统的内存缓存服务,可编程缓存具有更好的性能和效果,能够节省内存、减少网络交互耗时,适合实时要求极高的场景。通过Lua脚本引擎,可实现高性能、可热更新的脚本服务,提高业务灵活度。同时,通过统一管理加载过Lua的脚本及LState脚本对象的实例对象池,可以更好地管理和提高效率,提高服务的并行处理能力。这种缓存服务的实现方式能够为业务服务带来新的思考,为读者提供了一种全新的数据缓存解决方案。 文章还介绍了如何通过lua脚本引擎实现数据交互和交换,以及如何加载数据进行缓存预热,包括使用离线文件、数据表和内存磁盘等方式。此外,还讨论了订阅式数据同步、周期任务和如何让Go的协程访问一个LState保存的数据。通过这些方法,可以实现高性能、实时交互的缓存服务,满足不同场景的需求。 总的来说,本文介绍了可编程订阅式缓存服务的实现方式,以及如何通过lua脚本引擎和其他技术手段实现数据交互、缓存预热、数据同步和周期任务,为读者提供了全面的技术视角和实践指导。

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

全部留言(3)

  • 最新
  • 精选
  • 黄堃健
    老师,有什么开源的go服务使用lua来做业务缓存。这样真正看看人家怎么玩,踩坑相对少很多

    作者回复: 你好,堃健,目前我看到的都是内部缓存或者游戏服务端使用,可以关注一下这个 https://github.com/yuin/gopher-lua 项目看看是否有帮助

    2024-02-22归属地:广东
  • 普通熊猫 ଘ(੭ˊ꒳​ˋ)੭✧
    与其在golang的项目中引进redis,然后对外提供类似于redis的简单协议,并且自己实现一套内存数据的加载逻辑,为什么不考虑直接用lua订制redis?会不会更简单一些😂

    作者回复: 你好,熊猫,lua在redis中使用起来很不简单,实际操作后就会有深切的感受,同时需要lua支持队列等功能,具体有很多事情需要做。这种实现已经从数据层服务变成了应用层,所以有些地方总是会难受一些。

    2023-03-14归属地:北京
  • zhou
    问题1、文中的可编程缓存可以把数据结构化存在map中,相比传统模式序列话串要省内存。我想问下有些对象格式是无法存在map格式中的,另外map的方式跟json的方式存储大小上应该没有很大区别。 问题2、我是java语言,用redis缓存数据,我认为业务缓存修改后实时生效是可以直接重新拉去即可。

    作者回复: 你好,zhou,第一个问题:结构化数据确实比序列化后省空间(比如int和字符串保存的int字节大小不一样)同时有内存对齐优势,map只是个容器方便做hash查询对象使用,json是个序列化格式,他会把我们的数据二进制翻译成字符串方便传输结构化数据。第二个问题,使用外缓存缺点是有网络RTT延迟5ms至少,本地内存比网络速度快 能到纳秒微秒级别,另外,这里主要是你不知道什么数据什么时候有更新,所以只能每次请求去拉取才可以达到数据实时生效

    2023-02-10归属地:浙江
    2
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部