前言
前段時間,校招投了golang崗位,可是沒什麼好的項目往簡歷上寫,因而參考了許多網上資料,作了一個簡單的分佈式緩存項目。
如今閒下來了,打算整理下。html
github項目地址:https://github.com/Jun10ng/Gache
裏面還有我整理的一些面試問題,給顆星吧。java
typora-root-url: ./git
Golang校招面試項目-類redis分佈式緩存實現一個分佈式緩存,功能有:LRU淘汰策略,http調用,併發緩存,一致性哈希,分佈式節點,防止緩存擊穿github
實現LRU淘汰策略
map
maxSize
代碼實現
定義了三個數據結構redis
Value
entry
Cache
type Value interface { //返回佔用的內存大小 Len() int } type entry struct { key string value Value } type Cache struct { //容許使用的最大內存 maxBytes int64 //當前已使用的內存 nbytes int64 ll *list.List cache map[string] *list.Element //某條記錄被移除時的回調函數,能夠是nil OnEvicted func(key string, value Value) }
OnEvictedOnEvicted
實現單機併發
sync.Mutex
type cache struct { mu sync.Mutex lru *lru.Cache cacheBytes int64 }
cache並無new方法,由於採用的是延遲初始化 在add方法中,判斷c.lru是否爲nil,若是等於nil再建立 這種方法稱爲延遲初始化,一個對象的延遲初始化意味着該對象的 建立將會延遲至第一次使用該對象時。 這個方法在redis中很常見,由於能必定程度上提升性能
func (c *cache) add(key string, value ByteView){ c.mu.Lock() defer c.mu.Unlock() if c.lru == nil{ c.lru = lru.New(c.cacheBytes,nil) } c.lru.Add(key,value) }
主體結構
本質上是再進行一次封裝
難道一臺機器就只有一個緩存表嗎?你打開redis的可視化工具,能看到redis還有16個池呢,因此咱們要實現多個緩存表。怎麼作?再加一層。試想一下:
//groups 實例集合表 groups = make(map[string]*Group)
併發cache
//這裏的group是實例 type Group struct { name string getter Getter mainCache cache }
http服務調用
/_Gache/
http://XXX.com/_Gache//
groupnamegroupsnamekeykey
groups[groupname][key]
TODo
一致性哈希
分佈式節點