Go实现分布式缓存
文章平均质量分 89
Go实现分布式缓存
确实可以
这个作者很懒,什么都没留下…
展开
-
cache教程 7.使用 protobuf 通信
在io.ReadAll(res.Body)中,我们就得到缓存服务器返回的数据了嘛,而这时数据是经过编码的,需要进行解码。protobuf 即 Protocol Buffers,Google 开发的一种数据描述语言,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化。而这一章节没有使用RPC的,是使用。原教程的作者的写法是抽象出来好处理,而一般人或小白比较难能想到,而我觉得我的做法应该符合一般人的想法。这里的修改和原教程的有所差别,原教程是修改了Get()方法的,其修改如下。原创 2023-12-13 17:16:45 · 907 阅读 · 0 评论 -
cache教程 6.解决缓存击穿的问题
即使对数据库做了防护,HTTP 请求是非常耗费资源的操作,针对相同的 key,8003 节点向 8001 发起三次请求也是没有必要的。需要记录请求,那需要定义好请求对象,创建请求结构体call,其内部有val返回结果,err错误信息,还有sync.WaitGroup类型变量wg,控制其他同样的请求的线程是否需要等待。,因为不存在则不会写到缓存中,所以每次都会去请求 DB(DB中也可能不存在的),如果瞬间流量过大,穿透到 DB,导致宕机。缓存击穿查找的key是存在的,而穿透是该key是不存在的。原创 2023-12-12 17:36:40 · 867 阅读 · 0 评论 -
cache教程 5.分布式节点的通信
创建 Group 对象.(用于存储我们的缓存数据)启动缓存 http 服务.(创建 HTTPPool,添加节点信息,注册到缓存分组中)启动 API 服务.(用于与客户端进行交互)原创 2023-12-11 16:45:16 · 1274 阅读 · 0 评论 -
cache教程 4.一致性哈希(hash)
本章节是单节点走向分布式节点的一个重要部分。原创 2023-12-10 17:19:39 · 1058 阅读 · 0 评论 -
cache教程 3.HTTP服务器
上一节我们实现了单机版的缓存服务,但是我们的目标是。那么,我们就需要把缓存服务部署到多态机器节点上,对外提供访问接口,客户端就可以通过这些接口去实现缓存的增删改查。分布式缓存需要实现节点间通信,而通信方法常见的有HTTP和RPC。建立基于 HTTP 的通信机制是比较常见和简单的做法。所以,我们简单实现一个http服务端例子。在该代码中,创建任意类型 server,并实现ServeHTTP方法。接收 2 个参数,第一个参数是服务启动的地址,第二个参数是 Handler,实现了ServeHTTP。原创 2023-12-09 09:44:41 · 1143 阅读 · 0 评论 -
cache教程 2.单机并发缓存
为了能计算大小,那存入缓存的 value 对象必须实现NodeValue接口的Len()方法。上一节的测试用例中存储的value对象是String(也即是string)。那么问题来了, 我们存入的 value 可能是 string, int, 也可能his自定义的User等等,。要是想的简单点,我们可以在该结构体Cache内部加上sync.Mutex并修改其方法的部分原有逻辑来实现并发读写。上一节实现的LRU算法是不支持并发读写的。sync.Mutex 是一个互斥锁,可以由不同的协程加锁和解锁。原创 2023-12-08 16:13:15 · 1141 阅读 · 0 评论 -
cache教程1.LRU 缓存淘汰策略
Cache的缓存全部存储在内存中,内存是有限的,因此不可能无限制地添加数据。当占用内存超过了给定的内存大小时候,就需要从缓存中移除一条或多条数据了。我们肯定希望尽可能移除“没用”的数据,那如何判定数据“有用”还是“没用”呢?ok {} else { //还没存在该数据的情况主要是三步如果键存在,则更新对应节点的值,并将该节点移到队尾。不存在则是新增场景,首先队尾添加新节点 &entry{key, value}, 并字典中添加 key 和节点的映射关系。更新c.nbytes。原创 2023-12-07 17:31:30 · 1527 阅读 · 0 评论 -
7天用Go实现分布式缓存
第一次请求时将一些耗时操作的结果暂存,以后遇到相同的请求,直接返回暂存的数据。通过这个例子应该比较好理解什么是缓存。原创 2023-12-07 17:33:59 · 510 阅读 · 0 评论