go cache

package main

import (
	"net/http"
	"strings"
)

/****************************************************************************************/

type Cache interface {
	Get(string) ([]byte, error)
}

/****************************************************************************************/

/****************************************************************************************/

type inMemoryCache struct {
	c map[string][]byte
}

func (c *inMemoryCache) Get(k string) ([]byte, error) {
	return c.c[k], nil
}

/****************************************************************************************/

/****************************************************************************************/

type cacheHandler struct {
	Cache
}

func (h *cacheHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	key := strings.Split(r.URL.EscapedPath(), "/")[2]
	m := r.Method
	if m == http.MethodGet {
		b, _ := h.Get(key)
		w.Write(b)
		w.Write([]byte("hello"))
		return
	}
}

/****************************************************************************************/

/****************************************************************************************/

type Server struct {
	Cache
}

func (s *Server) Listen() {
	http.Handle("/cache/", &cacheHandler{s})
	http.ListenAndServe(":12345", nil)
}

/****************************************************************************************/

func main() {
	c := &inMemoryCache{make(map[string][]byte)}
	server := &Server{c} //其实不传也可以, 就是会报没有使用的错误
	server.Listen()
}

在go cache中,清理整个table的cache可以通过调用Flush()方法来实现。这个方法会重新初始化table的items,即清空整个缓存。同时,如果此时还有清理过期定时器在运行,会终止其运行。\[2\] 在cache2go这个项目中,使用了map作为本地缓存的kv存储结构。由于map是非线程安全的,所以在并发场景下需要使用锁来控制并发的读和串行写。项目中使用了RWMutex读写锁来实现这个功能。\[3\] 另外,为了避免频繁遍历整个集合来清理过期的Key,可以在写入时判断是否存在需要清理的Key,再启动定时任务来进行清理。这样可以避免耗费过多的时间和资源。\[3\] 此外,可以利用golang函数式的特性,方便地实现各种操作的回调函数,比如添加、删除、失效操作的回调等。这样可以更加灵活地处理缓存的操作。\[3\] 对于优化空间,可以在创建缓存时指定限制key的最大数量,以及在内存不足时的写入策略,比如直接报错或者随机清理一批Key等。这样可以避免内存溢出的问题。\[3\] #### 引用[.reference_title] - *1* *2* *3* [Golang源码分析:本地缓存库cache2go](https://blog.csdn.net/pbrlovejava/article/details/127405406)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值