大家好,我是张大鹏。今天给大家分享的是如何手写一个Golang的缓存服务。

提到缓存,大家应该第一时间想到的就是Redis,非常的轻量级,而且性能特别的高。

最开始的时候,作者也喜欢使用Redis,当然,现在也喜欢。不过分享一下个人的观点:Redis是有缺点的,那就是必须要部署才能够使用。

那么有没有一种缓存服务,不需要部署,只要在项目运行的时候,就能够使用呢?能不能跨项目使用呢?比如说,我用Golang写了两个API,能不能第一个API启动的时候,缓存服务启动,这个缓存服务还能同时被第二个API使用呢?

这个需求是真实存在的,不过不一定每个项目都需要。这个主要能够解决多个项目之间数据临时存储的问题。

基于这种需求,今天写了一个下午的代码,终于开发出了一个Golang的缓存服务,在这里分享给大家。

这个项目的地址是:https://github.com/zhangdapeng520/zdpgo_cache_http

首先介绍基本的使用。

通过以下代码,能够启动缓存服务:

通过以下代码能够获取客户端,进行缓存操作:

功能特别的简单,代码也非常的少。主要功能就是设置缓存,获取缓存,删除缓存,获取缓存信息。

代码也不是特别的多,毕竟是只用了一个下午写完的,截图如下:

其中examples下有服务端的案例和客户端的案例。大家如果感兴趣的话可以直接复制粘贴进行使用。

这个项目目前发布的版本是v0.1.0,是能够集成在go module之中的。

下面给大家简单分析一下这个项目的实现思路:首先是缓存的实现方式,这个项目是基于HTTP实现的,后面还会有TCP的实现。基于这两种协议实现的优点非常的明显,那就是能够跨平台,跨语言使用。因为现在不管什么语言,基本上都是支持HTTP的。

底层服务的实现没有用特别复杂的东西,主要用了Go语言自带的map数据结构,key是字符串,值是byte数组。不过,目前实现的客户端,支持的是键值都是字符串。这种结构能够覆盖大多数场景,因为复杂的数据结构,可以转换为json字符串进行存储,如果是文件,也可以转换为base64字符串进行存储。

由于篇幅有限,这里不分析所有代码,只给大家分享一下比较关键的几处。

以下代码是关于缓存的实现:

通过阅读源码不难发现,这里使用了RESTFul风格的接口,使用POST方法表示新增和更新,使用DELETE方法表示删除,使用GET方法表示查询。这里的路由是通过以下代码注册的:

所以接口的地址是/cache/key/value,以下代码是客户端的实现,大家可以作为参考:

如果读者感兴趣,完全可以开发出Java的客户端,Python的客户端,PHP的客户端。因为这是基于RESTFul的接口的,扩展起来十分的方便。不过比较建议的还是在Golang中使用。这个项目的期望是能够作为组件集成到Golang的项目中,如果是跨语言的,需要部署服务的场景,作者个人也比较推荐使用Redis这样的稳定的服务。

好了,今天的分享就到这里了。

谢谢大家!