KCache-go本地缓存,支持本地缓存过期、缓存过期自维护机制。
GitHub - kocor01/kcache: go 本地缓存解决方案,支持本地缓存过期、缓存过期自维护机制。
最近系统并发很高,单接口10W的 QPS,对 redis 压力很大,大量的热KEY导致 redis 分片CPU资源经常告警。计划用 go 本地缓存缓解 redis 的压力。
有多个系统需要使用本地缓存,写了 KCache 方便各个系统使用。
本地压测达到 100W QPS。
使用请参考 使用实例
创建KCache
-
创建一个KCache, 默认本地缓存过期时间 5s
kc := New() -
创建一个KCache, 自定义本地缓存过期时间
kc := NewWithExp(2 * time.Second)
获取缓存
-
GET 获取缓存,函数不带参数,本地缓存过期时间为创建 KCache 时设置的全局过期时间。
kc := New()d := kc.Get("myKey", GetData())GET 方法包含两个参数,第一个参数为缓存的key,第二个参数为获取缓存数据的函数。当缓存不存在时,会调用函数获取数据,并将数据缓存起来。 函数需符合 GetKcDatafunc 类型、返回值需符合 KcData 类型。
type GetKcDatafunc func() KcDatatype KcData struct { interface{} error }示例:
// 获取缓存数据 func GetData() GetKcDatafunc {return func() KcData {// sleep 模拟从 Redis、DB 中获取数据time.Sleep(20 * time.Millisecond)d := map[string]string{"k1": "value1","k2": "value2",}return KcData{d: d, err: nil}} } -
Get 获取缓存,函数带参数
kc := New() params := map[string]string{"k1": "value1","k2": "value2", } d := kc.Get("myKey", GetDataV2("myKey", params))示例:
// 获取缓存数据 func GetDataV2(key string, params map[string]string) GetKcDatafunc {return func() KcData {// sleep 模拟从 Redis、DB 中获取数据,也可以先从 redis 获取数据, 如果获取不到,再从 DB 中获取。time.Sleep(20 * time.Millisecond)data := make(map[string]string)for k, v := range params {data[k+key] = v}return KcData{d: data, err: nil}} } -
GetWithExp 获取缓存,自定义本地缓存时间
kc := New() exp := 2 * time.Second params := map[string]string{"k1": "value1","k2": "value2", } d := kc.GetWithExp("myKey", exp, GetDataV2("myKey", params))
GetKcDatafunc 实现
-
Kcache 中间函数(强烈推荐)
通过 Kcache 中间函数调用原有的获取数据函数,该函数内部不含任何业务代码,减少业务代码与缓存代码的耦合。
kc := New() exp := 2 * time.Second params := map[string]string{"k1": "value1","k2": "value2", } d := kc.GetWithExp("myKey", exp, GetDataKcache("myKey", params))// 获取缓存数据, Kcache 中间函数 func GetDataKcache(key string, params map[string]string) GetKcDatafunc {return func() KcData {data, err := GetDataV2(key, params)return KcData{Data: data, Err: err}} }// 获取数据 func GetDataV2(key string, params map[string]string) (map[string]string, error) {// sleep 模拟从 Redis、DB 中获取数据,也可以先从 redis 获取数据, 如果获取不到,再从 DB 中获取。time.Sleep(20 * time.Millisecond)data := make(map[string]string)for k, v := range params {data[k+key] = v}return data, nil } -
闭包函数(推荐)
简单获取数据的业务逻辑可以使用闭包函数。
kc := New() params := map[string]string{"k1": "value1","k2": "value2", } key := "myKey" fc := func() KcData {// sleep 模拟从 Redis、DB 中获取数据,也可以先从 redis 获取数据, 如果获取不到,再从 DB 中获取。time.Sleep(20 * time.Millisecond)data := make(map[string]string)for k, v := range params {data[k+key] = v}return KcData{Data: data, Err: nil} } d := kc.Get(key, fc) -
业务混合
kc := New() d := kc.Get("myKey", GetData())// 获取缓存数据 func GetData() GetKcDatafunc {return func() KcData {// sleep 模拟从 Redis、DB 中获取数据time.Sleep(20 * time.Millisecond)d := map[string]string{"k1": "value1","k2": "value2",}return KcData{Data: d, Err: nil}} }
设置缓存
-
Set 设置缓存,本地缓存过期时间为创建 KCache 时设置的全局过期时间。
正常情况下无需使用 Set 方法,因为 Get 方法会自动设置缓存。
kc := New() params := map[string]string{"k1": "value1","k2": "value2", } d := kc.Set("myKey", params) -
SetWithExp 设置缓存,自定义本地缓存时间。
正常情况下无需使用 SetWithExp 方法,因为 Get 方法会自动设置缓存。
kc := New() exp := 2 * time.Second params := map[string]string{"k1": "value1","k2": "value2", } d := kc.SetWithExp("myKey", params, exp)
删除缓存
-
Delete 删除本地缓存
正常情况下无需使用 Delete 方法,因为有自动删除缓存机制。
kc := New() params := map[string]string{"k1": "value1","k2": "value2", } d := kc.Delete("myKey")
单纯使用本地缓存
-
不需要自维护缓存数据
-
底层使用的 go-cache,go-cache下的所有方法都可以使用。
kc := New() // SET kc.lc.Set("myKey", "myValue", 2*time.Second) // GET d, f := kc.lc.Get("myKey") // other ...
更多使用案列请参考 使用实例
相关文章:
KCache-go本地缓存,支持本地缓存过期、缓存过期自维护机制。
GitHub - kocor01/kcache: go 本地缓存解决方案,支持本地缓存过期、缓存过期自维护机制。 最近系统并发很高,单接口10W的 QPS,对 redis 压力很大,大量的热KEY导致 redis 分片CPU资源经常告警。计划用 go 本地缓存缓解 redis 的压…...
斯坦福UE4 C++课学习补充 14:UMG-优化血量条
文章目录 一、优化执行效率二、简单脉冲动画 一、优化执行效率 绑定事件需要每一帧检查绑定对象是否有变化,势必造成CPU资源的浪费,因此优化执行效率的思路是:UI组件不再自行每帧查询血量,而是让血量自己在发生变化的同时通知UI进…...
在生信分析中大家需要特别注意的事情
在生信分析中大家需要特别注意的事情 标准的软件使用和数据分析流程 1. 先看我的b站教学视频 2. 先从我的百度网盘把演示数据集下载下来,先把要运行的模块的演示数据集先运行一遍 3. 前两步都做完了,演示数据集也运行成功了,并且知道了软件…...
Java工厂模式详解:方法工厂模式与抽象工厂模式
Java工厂模式详解:方法工厂模式与抽象工厂模式 一、引言 在Java开发中,设计模式是解决常见软件设计问题的一种有效方式。工厂模式作为创建型设计模式的一种,提供了灵活的对象创建机制,有助于降低代码的耦合度,提高系…...
springSecurity学习之springSecurity用户单设备登录
用户只能单设备登录 有时候在同一个系统中,只允许一个用户在一个设备登录。 之前的登陆者被顶掉 将最大会话数设置为1就可以保证用户只能同时在一个设备上登录 Override protected void configure(HttpSecurity http) throws Exception {http..anyRequest().aut…...
微信小程序实现聊天界面,发送功能
.wxml <scroll-view scroll-y"true" style"height: {{windowHeight}}px;"><view wx:for"{{chatList}}" wx:for-index"index" wx:for-item"item" style"padding-top:{{index0?30:0}}rpx"><!-- 左…...
【强化学习的数学原理】课程笔记--5(值函数近似,策略梯度方法)
目录 值函数近似一个例子TD 算法的值函数近似形式Sarsa, Q-learning 的值函数近似形式Deep Q-learningexperience replay 策略梯度方法(Policy Gradient)Policy Gradient 的目标函数目标函数 1目标函数 2两种目标函数的同一性 Policy Gradient 目标函数的…...
前端Long类型精度丢失:后端处理策略
文章目录 精度丢失的具体原因解决方法1. 使用 JsonSerialize 和 ToStringSerializer2. 使用 JsonFormat 注解3. 全局配置解决方案 结论 开发商城管理系统的品牌管理界面时,发现一个问题,接口返回品牌Id和页面展示的品牌Id不一致,如接口返回的…...
C++ | Leetcode C++题解之第300题最长递增子序列
题目: 题解: class Solution { public:int lengthOfLIS(vector<int>& nums) {int len 1, n (int)nums.size();if (n 0) {return 0;}vector<int> d(n 1, 0);d[len] nums[0];for (int i 1; i < n; i) {if (nums[i] > d[len])…...
springboo 整合 redis
springBoot 整合 redis starter启动依赖。—包含自动装配类—完成相应的装配功能。 引入依赖 <!--引入了redis整合springboot 的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis&…...
dpdk编译安装以及接收udp报文(基于ubuntu)
目录 1、编译 2、设置运行环境 3、使用dpdk接收udp报文 3.1、设置发送端arp信息 3.2、测试 3.3、代码 4、其他 1、编译 代码下载: DPDK 下载版本:DPDK 19.08.2 export RTE_SDK/root/dpdk-stable-19.08.2/ export RTE_TARGETx86_64-native-li…...
【计算机网络】OSPF单区域实验
一:实验目的 1:掌握在路由器上配置OSPF单区域。 2:学习OSPF协议的原理,及其网络拓扑结构改变后的变化。 二:实验仪器设备及软件 硬件:RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。…...
Java聚合快递小程序对接云洋系统程序app源码
一场物流效率的革命 引言:物流新时代的序章 在数字化浪潮席卷各行各业的今天,物流行业也迎来了前所未有的变革。为了进一步提升物流效率,优化用户体验,聚合快递系统与云洋系统小程序的对接成为了行业内外关注的焦点。这一创新…...
【React】详解组件通信:从基础到进阶的全面指南
文章目录 一、父组件向子组件传递数据1. 基本概念2. 示例代码3. 详解定义子组件 Son定义父组件 App导出父组件 App数据流props 的内容 二、子组件向父组件传递数据1. 基本概念2. 示例代码3. 详解引入React库和useState钩子定义子组件 Son定义父组件 App导出父组件 App数据流 三…...
【vluhub】zabbix漏洞
介绍: zabbix是对服务器资源状态例如、内存空间、CPU、程序运行状态进行检测、设置预警值、短信设置等功能等一款开源工具。配置不当存在未授权,SQL注入漏洞 弱口令 nameadmin&passwordzabbix nameguest&password POST /index.php HTTP/1.1 Host: 192.1…...
openGauss触发器详解
openGauss 是一款开源关系型数据库管理系统,广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化,数据库管理和操作的自动化需求越来越高。触发器(Triggers)作为数据库中重要的编程工具,能够极大地简化复杂操…...
抄作业-跟着《React通关秘籍》捣鼓React-playground-上集
文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标:跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…...
80后最后的书信 年代
当时11亿人口只有1.8万部固定电话 中国几千年来 鱼传尺素 雁寄鸿书 写信最后要写 亲啓 如有照片,封面要写内有照片,请勿折叠 信的开头应该是 见字如面,展信舒颜 如果拜托别人做事情,最后要写为盼 最后要写 某某草 书未尽…...
软考-软件设计师(4)-计算机网络与安全:OSI七层、子网划分、网络安全控制技术、网络安全协议、网络安全威胁、对称与非对称加密等高频考点
场景 软考-软件设计师-计算机网络与信息安全模块高频考点整理。 以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。 注: 博客:霸道流氓气质-CSDN博客 实现 知识点 OSI/RM七层模型 注意各层的主要功能,特别是表示层负责数据的加密、压…...
Unity横板动作游戏 -为什么我又开始学习Unity,而不是Godot。
Readme 最近开始学习Unity制作2D动作游戏,由于一些操作第一次接触,为了加深印象,准备写这样一篇同步教程的笔记。 之前也接触过Unity,用 Unity 制作过一个非常简单的小游戏 Flappy Bird,并且魔改成了泰拉瑞亚的版本。…...
前端光标定制:从原生限制到自定义渲染的技术实现
1. 项目概述:从“Cursorify”看现代IDE的插件化革命最近在逛GitHub的时候,又看到了一个挺有意思的项目,叫“cursorify/cursorify”。光看这个名字,你可能会有点懵,因为它和当下另一个非常火的AI编程工具“Cursor”撞名…...
使用Node.js和Taotoken构建一个简单的AI对话服务端
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用Node.js和Taotoken构建一个简单的AI对话服务端 基础教程类,面向Node.js后端开发者,讲解如何初始化一个…...
环境科学家都在偷偷用的NotebookLM技巧(2024中科院实测TOP5插件清单)
更多请点击: https://codechina.net 第一章:NotebookLM在环境科学研究中的范式变革 传统环境科学研究长期受限于多源异构数据整合困难、跨学科知识理解门槛高、因果推断缺乏可解释性支持等瓶颈。NotebookLM 作为基于用户自有文档构建的语义增强型AI协作…...
设计程序统计城市社区医疗站点接诊数据,优化医疗点位分布,方便居民就近看病,解决就医难问题。
一、实际应用场景描述某城市卫健委希望优化社区卫生服务中心布局,但面临以下现实情况:- 各社区接诊量差异巨大- 部分点位长期排队,部分点位资源闲置- 居民跨区就医成本高- 缺乏基于数据的点位调整依据👉 技术目标:用 P…...
基于LLM的智能网页自动化:从意图理解到工程实践
1. 项目概述:当AI学会“看”和“点”,自动化进入新阶段如果你还在为那些需要手动点击、填写表单、抓取数据的重复性网页任务感到头疼,那么browser-use这个项目可能会让你眼前一亮。简单来说,它不是一个普通的浏览器自动化工具&…...
嵌入式AI实战:从疲劳驾驶监测到医疗内窥镜的选型与落地
1. 从一场行业盛会聊起:嵌入式开发者的“技术集市”前几天,我作为飞凌嵌入式的一名老员工,去杭州参加了恩智浦(NXP)的技术日巡回研讨会。这感觉就像是我们嵌入式开发者圈子里的一个“技术大集”,或者说是“…...
ESP32 Arduino IDE 看门狗实战:从硬件看门狗到Task Watchdog Timer的配置与避坑指南
1. ESP32看门狗机制入门:为什么你的程序总在重启? 刚接触ESP32的开发者经常会遇到一个诡异现象:程序运行得好好的,突然就重启了。这很可能就是看门狗(Watchdog Timer)在作祟。我第一次用ESP32做物联网传感器…...
终极代码阅读神器:MultiHighlight智能高亮插件完整指南
终极代码阅读神器:MultiHighlight智能高亮插件完整指南 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors 🎨💡 项目地址: https://gitcode.com/gh_mirrors/mu/MultiHighlight 你是否…...
智能视觉组的比赛方案建议
简 介: 【智能视觉组比赛评分改进建议】针对不同比赛地图导致成绩评判不公的问题,建议赛前准备多张固定地图并测算标准时间:1)由官方测试每张地图的理论最优时间和实际小车运行时间;2)比赛成绩以选手用时与…...
从IoU到Shape-IoU:如何让损失函数“看见”边界框的形状与尺度
1. 边界框回归的进化史:从IoU到Shape-IoU 目标检测任务中,边界框回归就像给物体"画框"的过程。早期的IoU(Intersection over Union)指标简单直观——用预测框和真实框的交集面积除以并集面积。这个指标在2016年之前是绝…...
