缓存的目的都是为了减少跟数据库的直接交互,提高可用性。常用的方法如,对热点数据缓存、对部分数据预加载、对频繁操作的数据放到缓存中操作等等。

在开发的过程中,我尝试了一种自动处理缓存的方法,记录下,以供参考。

在业务代码,和ORM之间,引入一个模块(SaSql)。将对于数据库的操作,分为单行操作、list操作,即读写单条记录,和读写多条记录。

以list为例:

SaSql获取list数据时,优先从缓存拿,没有则通过ORM从数据库拿。核心代码示意如下:

//读取缓存

cacheParams := &map[string]string{}

if ignoreCache == false {

saData.Merge(cacheParams, pk)

saData.Merge(cacheParams, ma)

if err = saCache.ListGet(tblName, cacheParams, aryPtr); err == nil && aryPtr != nil {

return nil

} else {

if onlyCache {

return err

}

}

}

//读取数据库

if err := session.Find(aryPtr); err == nil {

//写入缓存

if ignoreCache == false {

saCache.ListSet(tblName, cacheParams, aryPtr)

}

return nil

} else {

return err

}

示例中,saCache则是缓存处理,其中,将参数以k_v的形式组合成字符串,作为Redis缓存的key。假如获取同一张表的list,但是参数不同,则会缓存成两条记录。

该方案只是缓存的补充手段,对于缓存数量要有限制,因为同一条数据,可能会出现在多条缓存记录中(因为不同参数都会单独缓存),会出现较多的重复数据,浪费空间。

示例代码中,对分页数据,只缓存前2页数据,就是基于次点考虑。

以下为获取缓存Key的示意代码:

func listKey(tbl string, params *map[string]string) (key string) {

if tbl == "" || params == nil {

return ""

}

key = revel.AppName + "_" + tbl + "_list_"

var keyAry []string

for k := range *params {

keyAry = append(keyAry, k)

}

sort.Strings(keyAry)

for i, k := range keyAry {

key += saUtils.SnakeStr(k) + "=" + (*params)[k]

if i+1 < len(keyAry) {

key += "_"

}

}

return

}

此方案的优点是,可以应对突发或者意向之外的流量,作为主要缓存策略的一个补充。

再者,每次取数据,都会先走缓存,而Redis是单线程(不考虑最新版本的),对于请求会自动做排队,也会降低数据库压力。

附上基于此方案的压测结果

Server Software:

Server Hostname: xxx

Server Port: 443

SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-AES128-GCM-SHA256,2048,128

Document Path: xxx

Document Length: 23 bytes

Concurrency Level: 100

Time taken for tests: 484.310 seconds

Complete requests: 250000

Failed requests: 1

(Connect: 0, Receive: 0, Length: 1, Exceptions: 0)

Write errors: 0

Non-2xx responses: 249999

Total transferred: 155999376 bytes

HTML transferred: 5749977 bytes

Requests per second: 516.20 [#/sec] (mean)

Time per request: 193.724 [ms] (mean)

Time per request: 1.937 [ms] (mean, across all concurrent requests)

Transfer rate: 314.56 [Kbytes/sec] received

最后安利一个自己写的小程序,不喜请忽略

欢迎加微信交流 yf_good134

心悦Lite.jpg

有疑问加站长微信联系(非本文作者)

gin go 更新缓存_golang自动缓存-对缓存策略的补充方案相关推荐

  1. java 自动过期缓存_Java自动过期本地缓存简单实现

    实际项目中常常需要用到本地缓存,特别是一些固定不变的数据,不想频繁调接口,因为http请求本身需要耗时,下面几个类对本地缓存作了简单实现,支持自动过期功能 LocalCache.javainterfa ...

  2. 解决每次上线更新文件需要手动清除缓存的问题-------js 、css自动清除浏览器缓存方法

    说明 1.分享页更新后,浏览器总是有缓存,须手动清理才能加载修改后的CSS和JS,故在加载地址后动态添加一个随机数(或时间戳)来确保每次加载的文件都不同来消除缓存. 2.在加载js文件时,被加载js文 ...

  3. vue打包的app如何设置自动清理软件缓存_使用Webpack启动你的Vue.js应用

    Webpack是开发Vue.js单页面应用(SPA)最基本的工具.通过管理负责的构建步骤能够使开发工作流非常的简单,同时也能够优化应用的大小提升应用的性能. 在这篇文章我将为大家展示Webpack是如 ...

  4. [vue] vue怎么缓存当前的组件?缓存后怎么更新?

    [vue] vue怎么缓存当前的组件?缓存后怎么更新? keep-alive 通过actived钩子 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 ...

  5. 两难!先更新数据库再删缓存?还是先删缓存再更新数据库?

    前言 当我们在做数据库与缓存数据同步时,究竟更新缓存,还是删除缓存,究竟是先操作数据库,还是先操作缓存?本文带大家深度分析数据库与缓存的双写问题,并且给出了所有方案的实现代码方便大家参考. 本篇文章主 ...

  6. 面试官:说说你对keep-alive的理解是什么?怎么缓存当前的组件?缓存后怎么更新?

    故心故心故心故心小故冲啊 文章目录 一.Keep-alive 是什么 二.使用场景 三.原理分析 四.思考题:缓存后如何获取数据 参考文献 一.Keep-alive 是什么 keep-alive是vu ...

  7. 前端更新需要清空浏览器缓存_浏览器缓存机制分析及前端缓存清理

    浏览器缓存机制分析及前端缓存清理 发布时间:2018-06-03 16:56, 浏览次数:857 本文主题:理清浏览器的缓存机制的内部逻辑,并给出避免浏览器缓存的相关解决方案 相信很多新手前端发布页面 ...

  8. [Aliyun] [FC] [CDN] 如何使用 refresh-cdn-cache 插件自动刷新 CDN 缓存

    本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问. 文章目录 前言 安装 `ref ...

  9. java ehcahce刷新_Spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除...

    写在前面:上一篇博客写了spring cache和ehcache的基本介绍,个人建议先把这些最基本的知识了解了才能对今天主题有所感触.不多说了,开干! 注:引入jar net.sf.ehcache e ...

最新文章

  1. 【Ubuntu入门到精通系列讲解】常用 Linux 命令的基本使用
  2. 【Android 插件化】现有的针对插件化恶意应用的解决方案 | 插件化应用开发推荐方案
  3. VS Code 自动修改和保存 代码风格 == eslint+prettier
  4. 怎样在sqlite3上执行SQL语句
  5. [react] React中getInitialState方法的作用是什么
  6. 第七十二期:Visual Studio Online 终于公开上线了
  7. ASP.NET把图片存入数据库和使用文件流读取显示(转)
  8. SVN和Git 介绍,区别,优缺点,适用范围总结
  9. matlab rf建模实例,[程序源代码]MATLAB在射频电路设计中的应用
  10. php合并播放mp4文件_视频音频的分离教程(支持多种格式视频音频合并为MP4) 可导入字幕...
  11. 用uniapp开发打包多端应用完整指南
  12. PHP民俗文化管理系统,中国民俗文化
  13. android壁纸设置,android设置壁纸 的方法
  14. 泛型+IO流+网络编程
  15. VSCode悬停提示
  16. Linux kernel log与调试
  17. R语言逻辑回归预测分析付费用户
  18. 长春理工大学成人高考报名流程
  19. Datastage,Informatica,Kettle
  20. 自定义Dialog 实现 仿网易云音乐的隐私条款声明弹框

热门文章

  1. 电脑频繁断网怎么回事_家里网络间歇性断网什么原因 家里网络间歇性断网怎么解决【介绍】...
  2. Kafka学习 之 理解Kafka集群(二)
  3. free和top显示可用内存不一致
  4. 11.reindex操作
  5. Leecode15. 三数之和——Leecode大厂热题100道系列
  6. 【三次优化】剑指 Offer 35. 复杂链表的复制
  7. 测试点2和测试点4错的来:1044 火星数字 (20分)
  8. oracle主从表分离怎么实时更新数据_高可用数据库主从复制延时的解决方案
  9. python双向索引什么意思_python字典支持双向索引吗
  10. 表盘时针的html代码,html5画布操作的简单学习-简单时钟