27|缓存服务:如何基于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
《手把手带你写一个 Web 框架》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(6)
- 最新
- 精选
- Vincent以redis为基础,最大限度扩展cache的抽象,学习了
作者回复: 是的,cache不只是redis
2021-11-201 - AaronSetObj方法的说明【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-216 - qiutian这篇感觉有点乱,一会是Redis的代码,一会又插入了Cache的代码,能看懂,但不是很清晰2022-09-17归属地:浙江
- Jussi Leeredis 关闭链接的相关逻辑,好像没有看到2022-06-28
收起评论