php cachelock,巧用lock解决缓存击穿的解决方案

7057476f2cad6cc74bd857c0cf3108d0.gif

背景

缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没读到数据,又同时去数据库去取数据,引起数据库压力瞬间增大,造成过大压力。

解决方案

1、设置热点数据永远不过期。

2、加互斥锁,互斥锁参考代码如下:

2.1、根据key生成object()

private static object GetMemoryCacheLockObject(string key){string cacheLockKey = string.Format(MemoryCacheLockObjectFormat, key);lock (CacheObject){var lockObject = CacheObject[cacheLockKey];if (lockObject == null){// 取得每個 Key專屬的 lock object;若同時有多個 thread要求相同資料,只會(到資料庫)查第一次,剩下的從 cache讀取lockObject = new object();CacheObject.Set(cacheLockKey,lockObject,new System.Runtime.Caching.CacheItemPolicy(){AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(10)});}return lockObject;}}

2.2、lock住GetMemoryCacheLockObject(key)

public T Get(string key, Func getDataWork, TimeSpan absoluteExpireTime, bool forceRefresh = false, bool returnCopy = true) where T : class{try{lock (GetMemoryCacheLockObject(key)){/*System.ArgumentNullException: Value cannot be null.at System.Threading.Monitor.Enter(Object obj)at BQoolCommon.Helpers.Cache.MemoryCacheLayer.Get[T](String key, Func`1 getDataWork, TimeSpan absoluteExpireTime, Boolean forceRefresh, Boolean returnCopy) in D:\Source\BQoolCommon\BQoolCommon.Helpers\Cache\MemoryCacheLayer.cs:line 46*/T result = CacheObject[key] as T;if (result != null && forceRefresh){// 是否清除Cache,強制重查result = null;}if (result == null){//執行取得資料的委派作業result = getDataWork();if (result != null){Set(key, result, absoluteExpireTime);}}if (returnCopy){//複製一份新的參考string serialize = JsonConvert.SerializeObject(result);return JsonConvert.DeserializeObject(serialize);}else{return result;}}}catch{return getDataWork();}}

总结说明

1、缓存中有数据,直接走下述代码就返回结果了

T result = CacheObject[key] as T;

2、缓存中没有数据,第1个进入的线程,获取锁并从数据库去取数据,没释放锁之前,其他并行进入的线程会等待,再重新去缓存取数据。这样就防止都去数据库重复取数据,重复往缓存中更新数据情况出现。

try{lock (GetMemoryCacheLockObject(key)){/*System.ArgumentNullException: Value cannot be null.at System.Threading.Monitor.Enter(Object obj)at BQoolCommon.Helpers.Cache.MemoryCacheLayer.Get[T](String key, Func`1 getDataWork, TimeSpan absoluteExpireTime, Boolean forceRefresh, Boolean returnCopy) in D:\Source\BQoolCommon\BQoolCommon.Helpers\Cache\MemoryCacheLayer.cs:line 46*/T result = CacheObject[key] as T;

3、取得每个 Key专有的 lock object;若同时有多个 thread要求相同资料,只会(到数据库)查第一次,剩下的从 cache读取。

string cacheLockKey = string.Format(MemoryCacheLockObjectFormat, key);lock (CacheObject){var lockObject = CacheObject[cacheLockKey];if (lockObject == null){// 取得每個 Key專屬的 lock object;若同時有多個 thread要求相同資料,只會(到資料庫)查第一次,剩下的從 cache讀取lockObject = new object();

往期

精彩

回顾

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561532.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 目录更改 php,Linux下更改MySQL目录

MySQL默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/home/data下需要进行下面几步: 1、home目录下建立da更改MySQL目录MySQL默认的数据文件存储目录为/var/lib/mysql。假如要把目录移到/home/data下需要进行下面几步:1、home目录下建立data…

php扩展返回字符数组,PHP扩展之数组字符串处理

今天介绍一下PHP扩展来处理数组和字符串,附带一个对比原生PHP的处理效率:我的测试机是装的PHP5.6.12,实现下面这个功能:function phprandstr($a, $z, $n) {$b array();$max count($a);for ($i 0; $i $tmp "";for ($j 0; $j $z…

jsp源码oracle数据库,JSP与oracle数据库交互案例

本案例为咖啡销售情况录入查询系统一、数据输入系统:1. 设计输入信息页面代码如下:咖啡管理系统——录入系统欢迎来到录入系统vcm0gYWN0aW9uPQ"inputaction.jsp" method"post" name"form1" id"form1">咖啡名…

崔华 oracle简历,2013数据库大会:崔华-基于Oracle的SQL优化案例分析

2013数据库大会:崔华-基于Oracle的SQL优化案例分析崔华的新书即将出版,其数据库大会上的演讲也非常精彩,他的新书十分值得期待。2013年中国数据库技术大会第二天的"Oracle架构与优化"专场中,来自中航信资深Oracle数据库工程师崔华为…

模板消息 php实例,PHP微信模板消息操作示例

本文实例讲述了PHP微信模板消息操作方法。分享给大家供大家参考,具体如下:微信SDK:class Oauth {//获得全局access_tokenpublic function get_token(){//如果已经存在直接返回access_token//if($_SESSION[access_token] && $_SESSION…

linux设置静态ip后端口不能上网,Centos7设置静态IP后无法上网的解决方法

在VMWare中安装的本地虚拟机CentOS7操作系统,动态IP地址会经常变化,设置成静态IP地址后,本地局域网可以互相访问,但CentOS7系统无法访问互联网,按以下步骤解决这个问题。1、以系统管理员打开VMWare2、选择虚拟网络编辑…

深度Linux修改分辨率6,Deepin 修改自定义分辨率

之前我有篇文章是写显示器超频问题,当时感觉Deepin超频麻烦,折腾换成了Win10,但用了断时间后,感觉Win10真的不好用,夜览模式软件适配差,CPU占用率高,字体颗粒感强,显示器看着眼睛很累…

linux下如何bash文件,Linux系统的文件管理命令及bash的相关工作特性

一、Linux系统的文件管理命令:1 \pwd:printing working directory2 \cd:change directory cd [/PATH/TO/SOMEDIR/]可带可不带,切换回家目录;注意:bash中~表示家目录;cd ~:切换回自己的家目录&#xff…

2019浙江C语言二级答案,2019年下半年二级C语言试题及答案

机遇总是有的,如果把握不住,不要怨天忧人,原因只是自己不够优秀;不要把时间当垃圾处理,唯有珍惜光阴、努力刷二级C语言试题,才能提升生命的质量。1)若有以下语句:typedef struct S{ int g;char …

win10定时关机c语言,win10定时关机在哪?win10设置定时关机的三种方法

win10定时关机在哪?很多win10用户可能还不会设置定时关机,下面脚本之家小编就给大家带来win10设置定时关机的三种方法,一起来看看吧!方法一:Win10定时关机命令:shutdown –s –t 3600后面的3600代表秒&…

android编译日志在哪,Android编译环境中的JDK存放位置

this.p{ m:2,b:2,loftPermalink:,id:fks_081066082085084067092086081095080081089075087087,blogTitle:Android编译环境中的JDK存放位置,blogAbstract:因为Ubuntu 10.04已经不带有SUN JDK,所以这个需要到sun网站上下载,并手动安装。所以,这个…

华为鸿蒙系统HarmonyOS手机,华为鸿蒙系统2.0适配哪些机型

华为鸿蒙系统2.0适配机型大部分都是华为手机,那么都有哪些手机适合这个系统呢,用户想要使用鸿蒙系统应该在哪去申请呢,别着急下面我们一起了解吧。华为鸿蒙系统2.0适用机型推荐HarmonyOS 2.0手机开发者Beta公测招募入口:点击进入同…

webstorm 运行android,Windows React Native环境搭建:webstorm+android studio 及解决热更新

工具准备:SDKAndroid SDK Build-tools:23.0.1SDK Platform:Android N 、6.0 、5.1.1、5.0.1、4.4.2、4.1.2Android模拟器镜像:6.0、5.1和4.1python使用 python2nodejs使用官网最新即可更改源:npm config set registry …

华为鸿蒙系统使用视频,原生鸿蒙系统,华为WATCH 3上手视频曝光

华为即将在 6 月 2 日发布华为 WATCH 3,而真机图和上手视频已经出现在网络上。华为 WATCH 3 将出厂预装鸿蒙 HarmonyOS,圆形表盘 旋转表冠设计。爆料图和视频都应该都出自华为的线下门店,爆料图展示了华为 WATCH 3 和华为 WATCH 3 Pro 的包装…

在html中怎么写加起来的,css可以在html里面写吗?

css可以在html里面写吗?答案是可以的。那么如何在HTML中写CSS?下面给大家介绍一下。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。下面我们来看一下在HTML中写css的方法:1、内部样式表--在head标签…

广东省2021高考2bi补录成绩查询,重磅!广东省2021年普通高考美术统考成绩1月8日起可查询!...

我省2021年普通高考美术、书法和广播电视编导术科统考工作已全面结束。现就美术、书法和广播电视编导术科统考成绩公布有关事项通知如下:一、成绩公布时间和方式1月8日10:00起,考生可通过省教育考试院官微(ID:gdsksy)小程序和广东教育考试服务…

主攻计算机专业英语翻译,湖师大“博导”黄振定,主攻“翻译学”

黄振定教授黄振定,男,1950年11月生,汉族,江西永新人。英语语言文学博士导师(翻译学、语言学方向),湖南师范大学外语学院和哲学系教授、硕士生导师。翻译系主任、翻译研究所所长。湖南省社科联五届委员会委员&#xff0…

计算机二级选择题考word基础知识吗,计算机二级ms office只考选择题吗?好考吗

满意答案liqiwt522014.09.20采纳率:46% 等级:8已帮助:4259人这个计算机二级MS office高级应用是今年新增加的科目,从今年(2013)9月份开始开考,知识点大体上包括计算机基础知识、word应用、excel应用和powerpoint应用…

html列表拖拽排序插件,JS拖拽排序插件Sortable.js用法实例分析

本文实例讲述了JS拖拽排序插件Sortable.js用法。分享给大家供大家参考,具体如下:最近由于项目功能设计的原因,需要对table中的行实现拖拽排序功能,找来找去发现Sortable.js能很好的满足这个需求,而且它还是开源的&…

信息学奥赛课课通VS中学生计算机,数学奥赛VS信息学奥赛 孩子们该如何选择

同是奥赛,为什么越来越多的孩子选了信息学?今年3月,教育部正式发布通知:全面取消中学奥赛等5项全国性高考加分项目。这个消息对很多有志于让孩子“走捷径”的家长而言,可谓晴空霹雳,升学道路上突然没了“加分”可怎么办&#xff…