ggzeng
1/11/2020 - 9:16 AM

kong table cache operation

kong 和table相关pdk的cache操作

kong: 1.4.x



-- ----------------------------
-- 下面cache的key为PK或者uniq字段
-- ----------------------------
-- 查表从数据库中取出
local function load_{tablename}_by_{filedname}(var_filedname)
  local row, err = kong.db.{tablename}:select_by_{filedname}(var_filedname) -- 3. cache中没有时从db中获取数据
  if err then
    return nil, err
  end

  return raw
end

local function get_{cache_val}(var_filedname)
  local client, err
  if var_filedname and var_filedname ~= "" then
    local {xxx_cache_key} = kong.db.{tablename}:cache_key(var_filedname)    -- 1. 获取cache key字符串
    {cache_val}, err = kong.cache:get({xxx_cache_key}, nil,                 -- 2. 根据cache key获取cache内容
                                 load_{tablename}_by_{filedname},           -- 3. 如果cache不存在,那么需要从哪里获取此key的值
                                 var_filedname)
    if err then
      kong.log.err(err)
      return kong.response.exit(500, { message = "An unexpected error occurred" })
    end
  end

  return {cache_val} or nil, {cache_val}    -- 第一个参数为bool类型,可以加入更多的判断,例如检查{cache_val}里面的值,它是一个table
end

-- 上面的获取cache内容的两步(1,2,3)可以简化为下面的一步
kong.db.{tablename}.select_by_cache_key(cache_key_val) 
-- cache_key_val: 可以为字符串,那么就是最终key的值
                  也可以为map table,map中的key为字段名,这样会根据dao中的定义自动拼接最终的cache_key

-- ----------------------------------------------
-- 下面cache的key为字段的组合,组合之后需要"唯一"
-- ----------------------------------------------
-- 获取cache的值都一样,只是在从db中load数据时的函数不一样
-- 需要使用 select_by_field("cache_key", cache_key, options)
-- 同样也可以使用 select_by_cache_key() 一步搞定,只是 cache_key_val 就只能用map table了