實際業務實現中常常會使用到本地快取,用以減少對實際儲存的訪問,我們會針對不同的使用場景設計不同的快取模式,但是基本的實現方式都是乙個巨大的map/table(不同語言)。下面用go來說,總體的實現都是通過乙個,根據不同的需求,lfu,lru再設計map裡面具體的entry的struct,儲存需要的計數用來做淘汰,下面從不同使用角度來說明一下
實際使用中,某些中臺服務/服務發現需要拉取比較多的etcd配置(也有可能在其他儲存),但是整體上還是有限的。此時不需要考慮key的淘汰,存在本地不會占用過多記憶體。目標是反而是為了避免對etcd或儲存的長期訪問以及保證配置有乙個實時更新的機制。
有兩種方法
讀取完了以後快取下來並設定乙個過期時間
相對來說第二種方法比較好,這種實現比較簡單
import (
"sync"
"time"
)var localcache *cache = &cache{}
type cache struct
type entry struct
}func (c *cache) set(key string, value inte***ce{}, expiration time.duration)
c.m.store(key, entry)
}func (c *cache) get(key string) (value inte***ce{}, expired bool)
return e.value, e.expire.before(time.now())
}
底層核心服務主要是一些crud操作,會有對某些資源的集中式訪問,比如某些核心的ugc內容和使用者,比如微博/twitter大v(其實資訊流本身是推拉結合的,這裡說的是在使用者點開詳情的時候),他們的資訊如果都直接打在redis/mc上,將會是乙個hot_key,導致儲存不健康。此時就要根據使用場景選擇lfu/lru。
如果是頭部使用者資訊,實時性不是那麼高,而是在乎訪問頻率的,比如明星的個人頁訪問次數在大部分時間是均勻較高的(上熱搜不算也能cover,反正頻率也高),那對頻率更為敏感,此時就會使用lfu
lru 使用和star比較多的是groupcache
也有人基於此實現了快速使用版golang-lru
使用比較多的lfu演算法比較少 lfu-go算是比較常用的
不過這些cache都比較定製化,實際環境中我們可能需要魔改一下,甚至結合lfu和lru來使用。主要需要改的引數應該至少包含maxlength和expired time(有些業務資料實時性比較高,單純靠remove可能永遠不會remove)。
後面發現其實也有相對定製化的cache實現了,bigcache
分shard的理念極大程度的加大了bigmap的支撐,原理和效能分析可以看下作者的文件
readme中的注釋已經比較清晰了,可以參考下
config := bigcache.config
如果服務純粹是一些io操作,如讀寫資料庫,那cache的值完全可以設大一些,這樣可以減少網路io,加快呼叫速度,減少對儲存的壓力 儲存過程中的事務實現 轉貼
基本上方法有兩個 set xact abort 指定當 transact sql 語句產生執行時錯誤時,microsoft sql server 是否自動回滾當前事務。語法set xact abort 注釋當 set xact abort 為 on 時,如果 transact sql 語句產生執行 ...
實現業務系統中的使用者許可權管理
最近學那個使用者許可權管理系統,鬱悶的很啊,總是理解地雲裡雲霧 最後還是從網上搜尋一兩篇有關於使用者許可權的系統,很詳細,有時間慢慢看一下,理解還是有好處滴 還希望那位有心大蝦教教 歷時三周的通訊錄系統,讓我對許可權管理有更深的理解了 這是做這個專案,對於許可權管理的總結 第一步 通過登入的使用者名...
業務中簡單定時任務的實現
目前任務定時傳送採用的是hutool的定時任務實現的,追粉任務採用的是redis的zset實現的 xxljob定時每秒掃瞄redis 面臨的問題 使用hutool的定時任務,內部實現沒有研究,出問題不好排查把控,所以需要改造一下實現方案。查了下需要自己實現定時任務網上方案還是挺多的,下面介紹三種我們...