# README
直接存取json
用反射封装解析json的函数
带回源函数的批量查询函数BizMGetJsonMapWithFill
很常见的场景是批量缓存,缓存可能一部分发生修改(常见做法是修改后执行del key),就无法命中缓存, 未命中的部分,需要回源,然后将回源结果写入缓存,最后将命中和未命中的两部分合并返回给用户。
函数入参解释
入参解释:
bizKeys
必须是slice
keyFunc
必须只有一个入参和一个出参,- 入参类型必须与
bizKeys
的数组内每个元素的类型相同 - 出参类型必须是
string
- 入参类型必须与
fillFunc
(不为nil时)必须是2个入参,2个出参- 入参顺序:
ctx context.Context
noCachedBizKeys
未命中的bizKey
数组,类型必须与bizKeys
相同
- 出参顺序:
noCachedMap map[bizKey类型]bizValue类型
err error
发生错误时,会返回
- 入参顺序:
outPtr
必须是map[bizKey类型]bizValue类型
的地址
函数执行流程
- 执行
redis mget
获得命中缓存的cachedMap
和未命中缓存的noCachedBizKeys
, - (
fillFunc != nil
时)用noCachedBizKeys
调用回源函数fillFunc
,得到回源结果noCachedMap
, - (
fillFunc != nil
时)将noCachedMap
写入缓存,并且与cachedMap
合并给到outPtr
如果
fillFunc==nil
就不会回源
如何避免击穿
fillFunc
返回的noCachedMap
中,将回源也查不到的bizKey
的bizValue
填为nil
那么会被保存到redis中(json.Unmarshal
为null
),下次查redis查到null
就不会回源了
# Functions
NOTE: 只能用于初始化时候,失败则panicredis基本不会是性能瓶颈,所以不放xray.