gin go 更新缓存_golang自动缓存-对缓存策略的补充方案
缓存的目的都是为了减少跟数据库的直接交互,提高可用性。常用的方法如,对热点数据缓存、对部分数据预加载、对频繁操作的数据放到缓存中操作等等。
在开发的过程中,我尝试了一种自动处理缓存的方法,记录下,以供参考。
在业务代码,和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自动缓存-对缓存策略的补充方案相关推荐
- java 自动过期缓存_Java自动过期本地缓存简单实现
实际项目中常常需要用到本地缓存,特别是一些固定不变的数据,不想频繁调接口,因为http请求本身需要耗时,下面几个类对本地缓存作了简单实现,支持自动过期功能 LocalCache.javainterfa ...
- 解决每次上线更新文件需要手动清除缓存的问题-------js 、css自动清除浏览器缓存方法
说明 1.分享页更新后,浏览器总是有缓存,须手动清理才能加载修改后的CSS和JS,故在加载地址后动态添加一个随机数(或时间戳)来确保每次加载的文件都不同来消除缓存. 2.在加载js文件时,被加载js文 ...
- vue打包的app如何设置自动清理软件缓存_使用Webpack启动你的Vue.js应用
Webpack是开发Vue.js单页面应用(SPA)最基本的工具.通过管理负责的构建步骤能够使开发工作流非常的简单,同时也能够优化应用的大小提升应用的性能. 在这篇文章我将为大家展示Webpack是如 ...
- [vue] vue怎么缓存当前的组件?缓存后怎么更新?
[vue] vue怎么缓存当前的组件?缓存后怎么更新? keep-alive 通过actived钩子 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, 但坚持一定很酷.欢迎大家一起讨论 ...
- 两难!先更新数据库再删缓存?还是先删缓存再更新数据库?
前言 当我们在做数据库与缓存数据同步时,究竟更新缓存,还是删除缓存,究竟是先操作数据库,还是先操作缓存?本文带大家深度分析数据库与缓存的双写问题,并且给出了所有方案的实现代码方便大家参考. 本篇文章主 ...
- 面试官:说说你对keep-alive的理解是什么?怎么缓存当前的组件?缓存后怎么更新?
故心故心故心故心小故冲啊 文章目录 一.Keep-alive 是什么 二.使用场景 三.原理分析 四.思考题:缓存后如何获取数据 参考文献 一.Keep-alive 是什么 keep-alive是vu ...
- 前端更新需要清空浏览器缓存_浏览器缓存机制分析及前端缓存清理
浏览器缓存机制分析及前端缓存清理 发布时间:2018-06-03 16:56, 浏览次数:857 本文主题:理清浏览器的缓存机制的内部逻辑,并给出避免浏览器缓存的相关解决方案 相信很多新手前端发布页面 ...
- [Aliyun] [FC] [CDN] 如何使用 refresh-cdn-cache 插件自动刷新 CDN 缓存
本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问. 文章目录 前言 安装 `ref ...
- java ehcahce刷新_Spring整合ehcache 注解实现查询缓存,并实现实时缓存更新或删除...
写在前面:上一篇博客写了spring cache和ehcache的基本介绍,个人建议先把这些最基本的知识了解了才能对今天主题有所感触.不多说了,开干! 注:引入jar net.sf.ehcache e ...
最新文章
- 【Ubuntu入门到精通系列讲解】常用 Linux 命令的基本使用
- 【Android 插件化】现有的针对插件化恶意应用的解决方案 | 插件化应用开发推荐方案
- VS Code 自动修改和保存 代码风格 == eslint+prettier
- 怎样在sqlite3上执行SQL语句
- [react] React中getInitialState方法的作用是什么
- 第七十二期:Visual Studio Online 终于公开上线了
- ASP.NET把图片存入数据库和使用文件流读取显示(转)
- SVN和Git 介绍,区别,优缺点,适用范围总结
- matlab rf建模实例,[程序源代码]MATLAB在射频电路设计中的应用
- php合并播放mp4文件_视频音频的分离教程(支持多种格式视频音频合并为MP4) 可导入字幕...
- 用uniapp开发打包多端应用完整指南
- PHP民俗文化管理系统,中国民俗文化
- android壁纸设置,android设置壁纸 的方法
- 泛型+IO流+网络编程
- VSCode悬停提示
- Linux kernel log与调试
- R语言逻辑回归预测分析付费用户
- 长春理工大学成人高考报名流程
- Datastage,Informatica,Kettle
- 自定义Dialog 实现 仿网易云音乐的隐私条款声明弹框
热门文章
- 电脑频繁断网怎么回事_家里网络间歇性断网什么原因 家里网络间歇性断网怎么解决【介绍】...
- Kafka学习 之 理解Kafka集群(二)
- free和top显示可用内存不一致
- 11.reindex操作
- Leecode15. 三数之和——Leecode大厂热题100道系列
- 【三次优化】剑指 Offer 35. 复杂链表的复制
- 测试点2和测试点4错的来:1044 火星数字 (20分)
- oracle主从表分离怎么实时更新数据_高可用数据库主从复制延时的解决方案
- python双向索引什么意思_python字典支持双向索引吗
- 表盘时针的html代码,html5画布操作的简单学习-简单时钟