手把手带你写一个 Web 框架
叶剑峰
腾讯高级工程师,前滴滴技术专家
22731 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 42 讲
特别放送 (1讲)
手把手带你写一个 Web 框架
15
15
1.0x
00:00/00:00
登录|注册

27|缓存服务:如何基于Redis实现封装?

如何实现缓存服务的内存缓存
接口设计是对需求的思考
实现了Redis的服务和缓存服务
请求地址并查看控制台输出
编写简单的路由
使用Redis的pipeline
实现16个方法
初始化Redis缓存
区分使用哪个缓存驱动
Remember方法
Calc、Increment、Decrement方法
GetMany和SetMany方法
GetObj和SetObj方法
SetForever和SetTTL方法
Get和Set方法
实现GetClient方法
初始化连接
定义RedisConfig数据结构
使用go-redis库进行封装
思考题
小结
验证
实现缓存服务
缓存服务协议设计
Redis服务
缓存服务实现

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

你好,我是轩脉刃。
上面两节课把数据库操作接入到 hade 框架中了,现在我们能使用容器中的 ORM 服务来操作数据库了。在实际工作中,一旦数据库出现性能瓶颈,除了优化数据库本身之外,另外一个常用的方法是使用缓存来优化业务请求。所以这节课,我们来讨论一下,hade 框架如何提供缓存支持。
现在的 Web 业务,大部分都是使用 Redis 来做缓存实现。但是,缓存的实现方式远不止 Redis 一种,比如在 Redis 出现之前,Memcached 一般是缓存首选;在单机上,还可以使用文件来存储数据,又或者直接使用进程的内存也可以进行缓存实现。
缓存服务的底层使用哪个存储方式,和具体的业务架构原型相关。我个人在不同业务场景中用过不少的缓存存储方案,不过业界用的最多的 Redis,还是优点比较突出。相比文件存储,它能集中分布式管理;而相比 Memcached,优势在于多维度的存储数据结构。所以,顺应潮流,我们 hade 框架主要也针对使用 Redis 来实现缓存服务。
我们这节课会创建两个服务,一个是 Redis 服务,提供对 Redis 的封装,另外一个是缓存服务,提供一系列对“缓存”的统一操作。而这些统一操作,具体底层是由 Redis 还是内存进行驱动的,这个可以根据配置决定。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了基于Redis实现缓存服务的技术细节,重点介绍了在hade框架中对Redis的封装和创建Redis服务的过程。作者详细介绍了如何使用go-redis库来实现对Redis的连接,并讨论了配置redis.NewClient方法的参数和初始化连接的过程。文章还介绍了缓存服务的协议设计,包括设置缓存、获取缓存、设置缓存时长、存储和获取对象、对多个key进行操作、计数器缓存设计以及实现缓存的Cache-Aside模式。通过16个方法的定义,读者可以深入了解缓存服务的实现细节。 此外,文章还介绍了如何在hade框架中使用配置文件来区别使用不同的缓存驱动,以及在provider中注册具体的服务实例方法。针对Redis驱动,文章详细介绍了如何初始化一个Redis连接,并实现了16个方法,包括Set系列、Get系列、Calc、Increment、Decrement、Del、DelMany以及Remember方法。通过对这些方法的实现,读者可以全面了解缓存服务的具体操作和实现逻辑。 最后,文章通过一个简单的路由示例进行了验证,展示了如何使用缓存服务进行设置、获取和删除操作。整体而言,本文通过深入的技术细节和实际示例,为读者提供了全面的Redis缓存服务实现指南。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《手把手带你写一个 Web 框架》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • Vincent
    以redis为基础,最大限度扩展cache的抽象,学习了

    作者回复: 是的,cache不只是redis

    2021-11-20
    1
  • Aaron
    SetObj方法的说明【GetObj 获取某个key对应的对象, 对象必须实现 https://pkg.go.dev/encoding#BinaryUnMarshaler】, 我并没有这样实现, 我直接以json.Marshal,转成字符串的形式进行存储。get的时候,再json.Unmarshal进行转换,转换成结构体。另外,我实现的时候,设置过期时间的时候, 0代表永久存储, 在V8(v8.11.4, GO是1.17) 的源码里也能看到说明。【Zero expiration means the key has no expiration time.】

    作者回复: json.Marshal 的方式也是可以的, 本质都是序列化和反序列化。

    2021-12-08
  • 牙小木
    层次描述清晰,感觉缺了点层次图。字不如图哦

    编辑回复: 哎是考虑到定义协议的时候容易乱,加了个图。还有哪里你觉得加个图更合适的吗?

    2021-12-02
  • qinsi
    看上去封装的redis服务只会返回go-redis实现的redis client,那么定义redis服务的接口似乎就不是很必要,因为不会再有其他的redis服务的实现了。文中使用redis服务是为了实现缓存服务,那么直接用go-redis实现就好了。

    作者回复: 是的,但是服务层毕竟封装了实例化的方法,这样至少把配置/日志的逻辑都封装了,还是有一定必要的。

    2021-11-21
    6
  • qiutian
    这篇感觉有点乱,一会是Redis的代码,一会又插入了Cache的代码,能看懂,但不是很清晰
    2022-09-17归属地:浙江
  • Jussi Lee
    redis 关闭链接的相关逻辑,好像没有看到
    2022-06-28
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部